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.