2016-04-24 9 views
3

Ich habe einen WebAPI-Server mit einem Hub, der auf Abonnementanforderungen antwortet, indem er ein Dictionary<long, List<SpecialParam>>-Objekt veröffentlicht.Deserialize-Objekt, das als abstrakte Klasse von SignalR übergeben wird

Die Liste der SpecialParam enthält Elemente des Typs SpecialParamA & SpecialParamB die beide SpecialParam erben.

Wenn ich versuche, die veröffentlichen auf dem Client zu erfassen:

hubProxy.On<Dictionary<long, List<SpecialParam>>>(hubMethod, res => 
{ 
    DoStuff(); 
}); 

Die DoStuff() Methode wird nicht aufgerufen. Wenn ich den Veröffentlichungsrückgabewert zu string ändere und den Proxy ändere, um einen string Wert zu erhalten, wird die DoStuff() Methode aufgerufen. Daher liegt das Problem bei der Deserialisierung des SpecialParam Items.

Ich habe versucht, auf der serverseitigen Konfiguration:

var serializer = JsonSerializer.Create(); 
serializer.TypeNameHandling = TypeNameHandling.All; 
var hubConfig = new HubConfiguration(); 
hubConfig.Resolver.Register(typeof(JsonSerializer),() => serializer); 
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer); 

Aber es half nicht.

Ich habe auch versucht, an den Client hinzu:

HubConnection hubConnection = new HubConnection(hubPath); 
hubConnection.JsonSerializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto; 
hubProxy = hubConnection.CreateHubProxy(hubName); 
hubProxy.JsonSerializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto; 

Und es half auch nicht.

In anderen Lösungen habe ich festgestellt, dass Menschen eine neue IParameterResolver definiert, aber es wird nur aufgerufen, wenn der Server die Eingabe für die Hub-Methode empfängt und nicht, wenn die Ausgabe vom Hub veröffentlicht wird.

Bitte helfen!

UPDATE

Hier ist, was ich mit fidler gefangen:

{"$type":"Microsoft.AspNet.SignalR.Hubs.HubResponse, Microsoft.AspNet.SignalR.Core","I":"0"} 

Dies ist, was der Server an den Client antwortet.

UPDATE 2

Ich bin immer noch versuchen, herauszufinden, wie sie bereits als Dictionary<long, List<SpecialParam>> deserialisiert zu erhalten.

Antwort

1

ich es gelöst, indem sie in den Dienst einstellen:

public static void ConfigureApp(IAppBuilder appBuilder) 
{ 
    ... 
    var service = (JsonSerializer)GlobalHost.DependencyResolver.GetService(typeof(Newtonsoft.Json.JsonSerializer)); 
    service.TypeNameHandling = TypeNameHandling.All; 
    ... 
} 

und den erwarteten Typ in dem Client zu entfernen:

hubProxy.On(hubMethod, res => 
{ 
    DoStuff(); 
}); 

ich die Antwort in json Form bekommen und ich deserialisieren es mit:

Ich weiß immer noch nicht, wie ich meinen Client erhalten es bereits deserialized.