Laden...
D
Benutzerbeschreibung
Auf eigenen Wunsch gesperrt.

Forenbeiträge von Deaktiviertes Profil Ingesamt 985 Beiträge

18.07.2017 - 23:37 Uhr

Doch, hatta

<add name="monitoringEntities" connectionString="metadata=res://*/DashboardModel.csdl|res://*/DashboardModel.ssdl|res://*/DashboardModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=LAGDBTEDMS;initial catalog=monitoring;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
18.07.2017 - 16:37 Uhr

Nein, mit dem LivePlayer eben nicht während der Entwicklungsphase.

Microsoft believes its Live Player system is entirely compatible with Apple's rules and regulations for App Store apps. Behind the scenes, the Live Player includes an interpreter for .NET code. This means that running an app through Live Player is slower than it would be if natively built on a Mac, but that's not such a big deal for many aspects of user interface development.

Erst wenn die App veröffentlicht werden soll, dann ja.

18.07.2017 - 16:30 Uhr

Arbeitgeber: "Wie lange brauchst du für die und die Anforderung?"
Entwickler: "4 Stunden für die Implementierung und UnitTests."
Arbeitgeber: "Und nur für die Implementierung?"

5-6 Stunden

Also ich habe vor einiger Zeit eine Berechnung implementiert, deren Formeln (einige) auf 5 DIN-A4 Seiten standen (handschriftlich), die auch noch in sich verkrümmt und verkräuselt waren.

Ohne Unit-Tests hätte ich hierfür definitiv länger gebraucht.

18.07.2017 - 14:51 Uhr

Hmmm, ich mache mir eigentlich vor der Implementierung und vor den UnitTests darüber Gedanken, wie sich die Methode verhalten soll.

Diese Gedanken manifestiere ich dann in der XML-Dokumentation zu der Methode.
Dann schreibe ich die UnitTests, die sicherstellen, dass die Implementierung auch der Dokumentation folgen wird.
Dann implementiere ich die Methode.

Natürlich kommt es auch vor, dass ich erst mal drauf los implementiere, aber vor dem Unit-Test kommt bei mir immer die Dokumentation

18.07.2017 - 13:48 Uhr

Ich meine die haben den Zeitraum auf eine Woche verkürzt. Danach muss man das erneuern und die App wieder aufspielen.

Macht aber soweit nix, ist ja eh nur zum Entwickeln gedacht.

18.07.2017 - 12:46 Uhr

Ich glaube da hat man mich missverstanden.

UnitTests schreibe ich mindestens für das, was ich per XML-Dokumentation an die Methode geschrieben habe.

Und die Get-Methode soll null zurückliefern, wenn etwas nicht gefunden wird.
Der entsprechende Test dazu stellt sicher, dass das auch so ist.

Und wenn das Argument id null ist oder gar keine Id darstellen kann, dann gibt es eine ArgumentNullException bzw. ArgumentException. Auch das dokumentiert man (logisch) im <exception> Abschnitt und schreibt dazu auch UnitTests.

Die Dokumentation im Code-Abschnitt einer Methode selber ist in meinen Augen nicht relevant für den UnitTest.

18.07.2017 - 12:25 Uhr

Nein. Quellcode-Dokumentation ist wichtig, aber man sollte es nicht übertreiben.
Wenn man sich an ordentliche Namen hält "GetUserById" dann muss ich nicht kommentieren "hole User anhand der ID".

Das sehe ich genauso, für die grundsätzliche Beschreibung ist der Methodenname ausreichend.


class UserService
{
    public User GetUserById( string id )
    { ... }
}

Hier sollte jeder wissen, was er erwarten kann, wenn ein gültiger Wert für id übergeben wird.

Und wenn der Wert ungültig ist? Z.B. null oder es gibt zu der id keinen User? Was passiert dann? Gibt es eine Exception oder wird null zurückgeliefert?

Das kann ich nicht aus dem Methodennamen ableiten und genau das gehört in die Beschreibung und genau dafür schreibt man dann UnitTests.

18.07.2017 - 11:50 Uhr

Mal eine ganz doofe Frage?

IMHO sieht man den grundsätzlichen Sinn und Mehrwert hinter dem ganzen DevOps nur dann, wenn man auch (zumindest) UnitTests hat, bzw. hat man UnitTests, dann wächst auch die Begehrlichkeit gegen diese beim Einchecken automatisch prüfen zu lassen. Ich brauche also ein Build-System. Wenn ich das dann habe, dann kann man ja auch noch Nightly-Builds mit weitergehenden Tests laufen lassen. Und dann ...

Es ist also ein sich selbst befruchtendes System, was aber an der Basis anfängt.

Wenn der Source aber nicht dokumentiert ist, kann man mMn eigentlich keine UnitTests schreiben, bzw. sieht nur das Offensichtliche und denkt sich, wieso soll ich dafür jetzt einen UnitTest schreiben, hab ich doch so programmiert.

Ich sehe die UnitTests als Bestätigung/Prüfung an, dass z.B. die Methode sich genau so verhält, wie ich in der Dokumentation derselbigen beschrieben habe. Wenn ich das aber nicht beschreibe, was und worauf soll ich dann testen?

Ist das der eigentliche Grund für die Ablehnung?

18.07.2017 - 11:02 Uhr

... und darüberhinaus:

Ein Code der kompiliert ist nur von der Syntax her richtig.

Wenn die UnitTests durchlaufen, dann ist der auch logisch richtig (wenigstens das, auf was man dort getestet hat).

Wenn die IntegrationTests/UITests durchlaufen, dann hat man wohl auch alles richtig verdrahtet (wenigstens das, auf was man dort getestet hat).

17.07.2017 - 17:11 Uhr

lässt sich leider nicht mehr editieren.

Halte ich für ein Gerücht. Einfach mal auf editieren über deinem Beitrag klicken, dann tut das schon

Ja, editieren geht ganz vorzüglich

17.07.2017 - 15:49 Uhr

Erschwerend gibt es in unterschiedlichen Orten mit der gleichen PLZ auch noch gleichlautende Strassennamen nebst Hausnummern.

Um bei der Beispiel PLZ zu bleiben:

Hochwaldstrasse 5, 54497

Diese Adresse gibt es sowohl in Morbach als auch in Horath.

17.07.2017 - 10:40 Uhr

Fakt ist der Server über das das Webportal läuft und der fileServer haben keinerlei Netzwerkverbindung mehr zueinander.

Ähm, in dem Fall wird es unmöglich sein, dass diese beiden sich jemals unterhalten können.

Das widerspricht allerdings deiner Aussage im ersten Beitrag, wonach die beiden durch eine Firewall getrennt sind. Was bedeutet, dass es durchaus eine Netzwerkverbindung gibt, allerdings durch eine Firewall.

16.07.2017 - 17:30 Uhr

Die Datenbank (Typ, Struktur) ist eigentlich einer der letzten Schritte in der Entwicklung.

Deklariere Datenservices als Interface und entsprechende Model-Klassen. Baue darum deine Anwendung. Wenn dann alles steht, dann entscheide dich für eine Datenbank und lege die Struktur fest.

15.07.2017 - 14:59 Uhr

Woher soll denn der DataContext wissen, dass er diese Instanz in ziel überwachen soll, wenn du diese Instanz selber erstellst ziel = new VDDArtikeldaten();?

Riechen kann der noch nicht

Versuche es also mal mit einem dataContext.VDDArtikeldaten.InsertOnSubmit( ziel ); wenn du ein neues Ziel erzeugen musst und dann sollte sich beim ChangeSet auch etwas bei der Inserts Collection tun.

14.07.2017 - 13:51 Uhr

Weil ich mit dem Verfahren rund 2 Milliarden Dateien erzeuge die im Schnitt nicht größer als 4096 Bytes sind und somit (idR) einen Cluster auf der Festplatte belegt.

Bei 10 Milliarden Einträgen befinden sich im Schnitt 5 Einträge in jeder Datei.

Beim Lesen einer Url über die Id wird eine Datei gelesen und daraus eine Zeile zurückgeliefert.

Auch das Eintragen geht dadurch sehr schnell.

  • Hash bilden
  • Datei öffnen
  • max. 5 Einträge vergleichen (statistisch gesehen)
  • evtl. schreiben

Natürlich kostet hashen Zeit, das Suchen nach einem Eintrag kostet aber auch Zeit.

14.07.2017 - 12:02 Uhr

Also das mit dem Datei-System ist auf jeden Fall sehr schnell.

Für die Bildung des Index würde ich einen Hash nehmen (auch wenn alle sagen, das ist langsam, die dürfen mir dann gerne eine wirklich schnellere Variante zeigen).

Also wir nehmen uns einen 32Bit Hashwert von der URL.
Aus der Hexdarstellung desselbigen bekommen wir den Pfad zu der Datei


05AAF367 => ./05/AA/F3/05AAF367.urls

Dadurch liegen in jedem Verzeichnis maximal 256 Einträge (Ordner bzw. Dateien)-

Datei öffnen und die Url mit den Einträgen in der Datei vergleichen.
Wenn vorhanden, dann den Zeilenindex merken, ansonsten anhängen, speichern und ebenfalls den Zeilenindex merken.

Die Id für die Url setzt sich nun aus dem Hashwert (32Bit) und dem Zeilenindex in der Datei (32Bit) zusammen und ergibt somit einen 64Bit Integer Wert.

Beim Lesen der Url über die Id trennt man diese wieder auf in Hashwert und Index, öffnet die Datei und liefert die Zeile am Index zurück.

Geht höllenschnell (trotz Hash) und ist im Prinzip von der Funktionsweise wie ein HashSet oder Dictionary, wo auch mit Buckets gearbeitet wird.

14.07.2017 - 10:33 Uhr

Beim Parallelisieren bekommt man nichts geschenkt, sondern muss auch mit einem höheren Verwaltungsaufwand (z.B. durch den TaskScheduler) zurechtkommen.

Als Verdeutlichung hier mal dein Code (lauffähig), wo ich die Zeiten in den parallelen Teilen messe.


    Stopwatch total_time = new Stopwatch();
    Stopwatch[] part_times = { new Stopwatch(), new Stopwatch(), new Stopwatch(), new Stopwatch(), };
    double[] pi = { 0, 0, 0, 0 };
    double n = Math.Pow( 10, 9 );
    double res = 0;
    total_time.Start();

    System.Threading.Tasks.Parallel.For( 0, (int) n, new ParallelOptions { MaxDegreeOfParallelism = 4 }, ( i ) =>
        {
            int part_index = i % 4;
            part_times[part_index].Start();
            pi[part_index] += ( 4 / ( 1 + Math.Pow( ( i + 0.5 ) / n, 2 ) ) );
            part_times[part_index].Stop();
        } );

    res = ( pi[0] + pi[1] + pi[2] + pi[3] ) / n;
    total_time.Stop();
    Console.WriteLine( "Pi = {0}. Die Berechnung hat {1}ms gedauert", res, total_time.ElapsedMilliseconds );
    Console.WriteLine( "Dabei gingen {0}ms für den Verwaltungsaufwand drauf", total_time.ElapsedMilliseconds - part_times.Max( e => e.ElapsedMilliseconds ) );

Hier wird ein grosser Teil der Zeit mit Verwaltungsarbeit verplempert, weil die einzelnen Aufgabe zu klein ist.

(Auf meinem Rechner ca. 60.000ms gesamt und 45.000ms Verwaltung)

Zum Vergleich mal eine etwas abgewandelte Variante


    Stopwatch total_time = new Stopwatch();
    Stopwatch[] part_times = { new Stopwatch(), new Stopwatch(), new Stopwatch(), new Stopwatch(), };
    double[] pi = { 0, 0, 0, 0 };
    double n = Math.Pow( 10, 9 );
    double res = 0;
    total_time.Start();

    System.Threading.Tasks.Parallel.For( 0, (int) 3, new ParallelOptions { MaxDegreeOfParallelism = 4 }, ( i ) =>
        {
            int part_index = i;
            part_times[part_index].Start();
            for ( int j = i; j < n; j+=4 )
            {
                pi[part_index] += ( 4 / ( 1 + Math.Pow( ( j + 0.5 ) / n, 2 ) ) );
            }
            part_times[part_index].Stop();
        } );

    res = ( pi[0] + pi[1] + pi[2] + pi[3] ) / n;
    total_time.Stop();
    Console.WriteLine( "Pi = {0}. Die Berechnung hat {1}ms gedauert", res, total_time.ElapsedMilliseconds );
    Console.WriteLine( "Dabei gingen {0}ms für den Verwaltungsaufwand drauf", total_time.ElapsedMilliseconds - part_times.Max( e => e.ElapsedMilliseconds ) );

Hier komme ich auf eine Gesamtlaufzeit von ca. 18.500ms und einem Verwaltungsaufwand von 10ms

14.07.2017 - 10:06 Uhr

Das hier pi[Task.CurrentId.Value-1] ist tödlich.

Welcher Task, und somit welche Id der Task hat, ist nicht vorhersehbar und wird (wie Abt schon angedeutet hat) vom TaskScheduler geregelt. Die Aufgabe könnte auch von einem Task mit der Id 42 oder 666 abgearbeitet werden.

13.07.2017 - 10:54 Uhr

Nur mal so ganz doof gefragt:

Sprechen wir hier über WinForms oder WPF?

Ist mir nicht ganz klar ...

13.07.2017 - 10:24 Uhr

Hast du die Dokumentation zu den Methoden gelesen?

Wenn ja, dann wäre deine Frage schon beantwortet

11.07.2017 - 12:41 Uhr

Warum möchte man an den ConnectionStrings auch was dranbasteln?

Ich würde in der Gruppe definieren, welche Verbindungen dazugehören (und eben nicht, welche Verbindung zu welcher Gruppe gehört)

BTW

Die Leute müssten sich also an dem Format richten, welches vorgegeben wird?

Ähm, ja ... immer ... egal welches Format ... wie soll man sonst die Bedeutung erkennen?

PS
Config-Dateien können liegen, wo sie wollen - nur muss man die dann explizit von der entsprechenden Stelle laden.

11.07.2017 - 11:36 Uhr

Als erstes würde ich es immer mit einer .config Datei (XML) versuchen, denn da gibt es entsprechende Klassen um das zu lesen und vor allem kennt sich das schon mit diesen ConnectionStrings aus und kann auch bei Bedarf diese Bereiche verschlüsseln.

Ich wäre auf jeden Fall viel zu faul, mir da was eigenes auszudenken - nur wenn es sehr gut Gründe gibt (und das entsprechende Schmerzensgeld)

Ansonsten nimmst du eben irgendwas anderes wofür du einen Deserialsierer bekommen kannst: XML, JSON, etc.

11.07.2017 - 10:41 Uhr

Das Format dieser Config-Datei ist recht seltsam. Sieht aus wie ein kreativ (im negativen Sinne) interpretiertes Ini-Format. Wer gibt denn so etwas vor?

Da musst du dir wohl oder übel einen eigenen Parser schreiben, der das ausliest und in eine passende Struktur schreibt.

PS: Wenn ein DAU eine Gruppe auswählen soll, dann ist es für den einfacher, wenn es für die Gruppe einen aussagekräftigen Namen gibt anstatt 1 oder 2. Mit Produktion, Testbetrieb, Süddeutschland käme ich auch besser klar, obwohl ich mich nicht zu dieser Gruppe zähle.

11.07.2017 - 07:20 Uhr

Man kann auch einfach auf die Nachricht hören, wenn die Maus bewegt wird. Da muss man nicht zyklisch die Position abfragen.

Wenn die Nachricht kommt, dann setzt man noch einen Timer, der sich dann um die Rückstellung (es bewegt sich nicht) kümmert.

08.07.2017 - 15:36 Uhr

Wie lautet denn das Create-Statement für die Tabelle?

Dann kann man sich mal einen Überblick verschaffen, was denn wie und in welcher Länge gespeichert werden soll.

Aus dem Bauch heraus würde ich allerdings sagen, dass hier die Uhren anders ticken als bei einem VARCHAR(22), denn ich vermute mal eher wir sprechen von einem VARCHAR(2000) für die Url.

PS Wie schätzt du das Verhältnis zwischen Insert und Query ein? Also erfolgen mehr Abfragen als Eintragungen?

07.07.2017 - 15:00 Uhr

@weismat

Das Beispiel funktioniert so gar nicht und wenn, dann würde es ein int liefern.

@hervibore

So eine Umstellung halte ich nicht für gut. Eine NullReferenceException kann man sehr leicht lokalisieren (wo ist das denn aufgetreten). Ein seltsames Ergebnis eher nicht.

Darum finde ich das bewusste Verwenden eines Null-Conditional-Operators richtiger.

07.07.2017 - 11:55 Uhr

@thunder1902

Ich hatte da so eine Ahnung und nun auch die entsprechende Stelle gefunden, was beim Bildschirmschoner anders läuft:

Before a screensaver appears, Windows creates a new virtual desktop for it. The screensaver process is created on this second desktop, which is never locked. Any other processes that the screensaver creates will inherit this virtual desktop, unless the application switches back to the default desktop. To successfully switch back to the default desktop, certain access rights must be granted. If the switch fails, the workstation is most likely locked.

(Quelle: MSDN: Screensaver Sample)

Darum ist es erst einmal so schwer "über" dem Bildschirmschoner etwas zu zeigen, denn der befindet sich in einer anderen Ebene.

Wenn musst du in der Richtung weiter suchen.

07.07.2017 - 11:33 Uhr

@Stefan.Haegele

Es geht sich wohl um Folgendes
Alarmierungssoftware - Funktionsweise

Und die visuelle Benachrichtigung soll auch dort erfolgen, wo der Bildschirmschoner aktiv ist.

Es ist unerheblich, ob dort einer gerade am Rechner aktiv am Arbeiten ist oder nicht. Schaltet sich der Bildschirm ein oder zeigt plötzlich ein anderes Bild, dann steigt die Wahrscheinlichkeit der Wahrnehmung, selbst wenn eine Person dieses nur im Augenwinkel mitbekommen kann.

05.07.2017 - 11:24 Uhr

Der einfachste und schnellste Weg ist das Erstellen einer neuen ObservableCollection.

04.07.2017 - 10:27 Uhr

Du kannst den Abgleich auf einer Kopie der sqlite Datenbank machen. Ist der Abgleich erfolgreich, dann das Original mit der Kopie austauschen.

Alternativ würde auch eine Transaction auf der sqlite Datenbank gehen, die vor dem Abgleich gestartet und beim Abschluss dann geschlossen wird.

02.07.2017 - 12:38 Uhr

Nur so am Rande bemerkt:

Kennst du schon File.ChangeExtension?

01.07.2017 - 10:59 Uhr

BindingProxy 👍

Das ContextMenu würde ich aber nicht über das ItemTemplate definieren, sondern über den ItemContainerStyle.

Zudem würde ich dem Command auch das aktuelle Element als Parameter übergeben, dann ist es auch eindeutig, welches Element entfert werden soll.

Sieht dann so aus


<ComboBox ItemsSource="{Binding Items}">
    <ComboBox.Resources>
        <c:BindingProxy x:Key="DataContext" Data="{Binding}"/>
    </ComboBox.Resources>
                
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem 
                            Header="Item entfernen" 
                            Command="{Binding Source={StaticResource DataContext}, Path=Data.ItemEntfernenCommand}" 
                            CommandParameter="{Binding}"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </ComboBox.ItemContainerStyle>
                
</ComboBox>

und im ViewModel


public class MainViewModel : Utils.ObservableObject
{
    public MainViewModel()
    {
        Items = new ObservableCollection<string>(new List<string> { "123", "456", "789" });
        ItemEntfernenCommand = new Utils.RelayCommand(ItemEntfernenCommandExecute);
    }

    private void ItemEntfernenCommandExecute(object obj)
    {
        var value = (string)obj;
        Items.Remove(value);
    }

    ObservableCollection<string> _items;
    ICommand _itemEntfernenCommand;

    public ObservableCollection<string> Items
    {
        get { return _items; }
        set { Set(ref _items, value); }
    }

    public ICommand ItemEntfernenCommand
    {
        get { return _itemEntfernenCommand; }
        set { Set(ref _itemEntfernenCommand, value); }
    }
}

29.06.2017 - 16:57 Uhr

Wenn ich das Statement ohne syntaktischen Fehler ausführe, kann ich das nicht nachvollziehen

SqlFiddle

29.06.2017 - 13:55 Uhr

@MrSparkle

Dann probiere es doch mit einem kleinen Beispiel aus.


class VM : ViewModelBase // <= GalaSoft.MvvmLight
{
    string _content;
    public string Content
    {
        get { return _content; }
        set 
        {
            var newValue = value;
            if ( newValue == "A" )
                newValue = "B";
            Set( ref _content, newValue );
        }
}

Binde die Content Eigenschaft in der View an ComboBox.Text, starte die Anwendung und schreibe in die ComboBox ein A.

Was erwartest du, was beobachtest du?

29.06.2017 - 11:48 Uhr

Warum eigentlich nicht? Das ViewModel wäre meines Erachtens der richtige Ort dafür, da es sich hierbei um die Logik der GUI handelt.

Ja, wäre schön, geht aber nicht einfach so ...

Wurde in dem anderen Thread schon beschrieben mit dem "Warum ist das so?" sowie Lösungen wie es dann doch geht (Asynchron, AttachedProperty).

29.06.2017 - 11:16 Uhr

Dann frag dich doch mal, wie dieses PreviewText Ereignis abgebrochen wird/wurde.

Genau so geht das auch bei SelectionChanged

Wenn du irgendetwas nicht verstehst, dann solltest du auch regen Gebrauch von der Dokumentation machen.

29.06.2017 - 10:44 Uhr

@pinki

Das gleiche Problem wie bei MVVM (Visual Basic) - Combobox aktualisiert sich nicht?
Kann auch genauso gelöst wie dort beschrieben.

27.06.2017 - 14:51 Uhr

Google Maps haben da ein ähnlich gelagertes Problem und die lösen das mit Kacheln

27.06.2017 - 13:32 Uhr

Und warum das mit Assembly.LoadFrom funktioniert ist sogar dokumentiert

If an assembly with the same identity is already loaded, LoadFrom returns the loaded assembly even if a different path was specified.

Was macht Assembly.Load anders?

Note that this method overload always creates a new Assembly object with its own mapping.

27.06.2017 - 11:16 Uhr

Deine ComboBoxTry Klasse ist falsch.

Du musst dich am Event ComboBox.PreviewTextInput registrieren/abmelden und zwar immer dann, wenn sich die AttachedProperty ändert.

Pseudo-Code

OldValue == null && NewValue != null => Subscribe event
OldValue != null && NewValue == null => Unsubscribe event

Du hängst dich an den Event, wenn in ComboBox.Text ein D steht.

Steht da also kein D warum denkst du sollte dort etwas passieren?

27.06.2017 - 10:39 Uhr

Eine Suche bei Tante G nach c# to vb.net ergibt als ersten Treffer

Telerik: Code Converter

27.06.2017 - 10:36 Uhr

Ob es die nur von Adobe gibt kann ich nicht sagen. Vermuten würde ich aber eher ja 😉

Nein 😁

27.06.2017 - 10:10 Uhr

Was konkret bekommst du denn nicht hin?

Du hast nur das ViewModel geändert, dann hätte im Quote auch nur das ViewModel gereicht. So sieht man den Wald vor lauter Bäumen nicht.

Und wenn man etwas ändert, dann ist es auch kein Zitat (Quote) mehr.

27.06.2017 - 09:56 Uhr

Meinst du LCP (Lens Correction Profile)?

Das kommt meines Wissens nach von Adobe

RawPedia: How to get LCP and DCP profiles

27.06.2017 - 09:42 Uhr

@_Cashisclay
Also bei meinem Beispiel passiert eigentlich genau das was du mMn gewünscht hast:

Tippt man in die ComboBox A ein dann erscheint dort ein B.

FullQuotes sind hier nicht gern gesehen, weil sie auch keinen wirklichen Sinn ergeben

27.06.2017 - 09:23 Uhr

Ich bin natürlich davon ausgegangen, dass du immer noch das erreichen möchtest:

ich versuche eine Combobox Eingabe zu verändern

Und genau da setze ich an: Bei der Eingabe in der ComboBox.

Wenn dem nicht mehr so ist, dann musst du das nochmal genauer spezifizieren.

26.06.2017 - 22:43 Uhr

Eine mobile App sollte sich niemals direkt mit einer externen Datenbank verbinden. Darum gibt es das Problem dieser Art dort gar nicht.

Eine versionierte WebApi stellt die Funktionen auch für die alten Clients zur Verfügung.

26.06.2017 - 15:39 Uhr

Im Setter hatte ich es schon versucht und eben auch noch einmal .. hatte auch nicht funktioniert.
Das kommt mir seltsam vor...

Probier es einfach mal aus