2016-04-24 82 views
3

我有一個WebAPI服務器,它具有通過發佈Dictionary<long, List<SpecialParam>>對象來回復訂閱請求的集線器。反序列化由SignalR作爲抽象類傳遞的對象

SpecialParam列表包含類型SpecialParamA & SpecialParamB的項目其中兩個繼承SpecialParam

當我試圖捕捉在客戶端上發佈:

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

DoStuff()方法不叫。如果我將發佈返回值更改爲string,並將代理更改爲接收string值,則會調用DoStuff()方法。因此,問題在於SpecialParam項目的反序列化。

我試過配置在服務器端:

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

但它並沒有幫助。

我也嘗試添加到客戶端:

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

而且它也沒有幫助。

在其他解決方案中,我發現人們定義了一個新的IParameterResolver,但僅在服務器接收到集線器方法的輸入時調用,而不是在集線器發佈輸出時調用。

請幫忙!

UPDATE

這是我趕上了菲德勒:

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

這是服務器回覆客戶端。

更新2

我仍然試圖找出如何接受它已經反序列化Dictionary<long, List<SpecialParam>>

回答

1

我解決它通過在服務設置:

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

,並在客戶端刪除的期望類型:

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

我得到JSON格式的響應,我與反序列化:

var serializer = new JsonSerializer(); 
serializer.TypeNameHandling = TypeNameHandling.All; 
JObject jObject = resp as JObject; 
var specialParams = jObject.ToObject<Dictionary<long, List<SpecialParam>>>(serializer); 

我仍然不知道如何讓我的客戶端收到它已經反序列化。