2016-07-20 11 views
0

Ich habe einen selbst gehosteten SignalR-Server, der Daten an einen .NET SignalR-Client übergibt. Im Wesentlichen führt es eine kontinuierliche oder bedarfsgesteuerte Aktualisierung eines benutzerdefinierten Typs durch. Wenn ich ein Update auslösen möchte, erstelle ich ein Datenübertragungsobjekt, lade es mit den zu sendenden Daten und sende es über SignalR. Die Client-Seite erfasst das Update und zeigt die neuen Werte an (ich habe eine WPF-App und eine Konsolen-App und beide machen im Wesentlichen das Gleiche - die WPF-App macht es nur ein bisschen "hübscher"). Alles funktioniert gut für die meisten Eigenschaften auf meinem DTO. Aber es gibt zwei Eigenschaften, die enum-Werte sind und die immer dem Client als Enum 0-Wert (in meinem Fall "Unbekannt") egal auf was ich es auf der Server-Seite setzen. Auf der Serverseite, ich habe es den ganzen Weg zumSignalR nicht serializing Enum-Werte auf benutzerdefinierten Typ

Clients.All.updateData(data); 

Anruf und dem DTO (Daten) verfolgen die korrekte ENUM-Werte den ganzen Weg bis zu diesem Punkt. Wenn jedoch auf der Clientseite genau an der Stelle der Funktion, die Aufrufe vom Server empfängt, ein Haltepunkt gesetzt wird, weist der DTO für beide Aufzählungen falsche (0) Werte auf. Ich habe online nach möglichen Problemen mit Serializing Enum-Werten von SignalR gesucht und bin auf nichts gestoßen. Gibt es etwas, das mir fehlt? Danke im Voraus.

Dennis

Antwort

0

Nun helfen, nach viel drum herum zu stolpern scheint, dass ich Setter hinzufügen musste die öffentlichen enum-Eigenschaften in meinem DTO, damit sie korrekt serialisiert werden (oder, genauer gesagt, ich glaube, sie werden zur Deserialisierung gebracht). Ursprünglich hatte ich unveränderliche Eigenschaften (was für meine anderen Eigenschaften primitiver Typen gut funktionierte). Ich habe viele Dinge ausprobiert - von der Änderung der Eigenschaftsnamen (die ursprünglich mit dem Namen des Enum-Typs identisch waren) bis zur Aktualisierung meines Newtonsoft-Pakets in meinem Client bis hin zum Hinzufügen des Json-Converter-Krams. Aber es scheint, dass was schließlich der Trick war, Setter zu meinen Enum-Eigenschaften hinzuzufügen. Ich weiß immer noch nicht, warum das so ist oder ob es einen anderen Weg gibt (wenn jemand Ideen hat, lass es mich wissen!), Aber das hat es behoben. Danke an diejenigen, die geantwortet haben.

Dennis

4

Sie sagten, Sie alles online überprüft, aber ich hoffe immer noch, diese link nützlich sein könnte.

einfach Ihre Startklasse anpassen:

public class Startup 
{ 
public void Configuration(IAppBuilder app) 
{ 
    // Create JsonSerializer with StringEnumConverter. 
    var serializer = new JsonSerializer(); 
    serializer.Converters.Add(new StringEnumConverter()); 
    // Register the serializer. 
    GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer); 

    app.MapSignalR(); 
    } 
} 
+1

Genau das, was ich gesucht habe - danke. – Danny

0

Wenn Sie JSON als Datenübertragung verwenden, dann könnte dieser Artikel http://serena-yeoh.blogspot.co.uk/2014/04/serializing-enums-in-aspnet-signalr.html

+0

Danke Prasanjit (und Danny). Ich habe diesen Artikel gesehen, und ich habe das versucht, und auch meine DTO-Eigenschaften mit dem JsonConverter-Attribut mit dem StringEnumConverter dekoriert. Keine funktionierte. In diesem Artikel schien das Problem des Autors darin zu liegen, dass sie auf der Client-Seite numerische Werte erhielt. Ich bekomme falsche (oder möglicherweise Standard oder Rückfall) Werte. – Dennis