2016-04-24 94 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); 

我仍然不知道如何让我的客户端收到它已经反序列化。