我有一台WebAPI服务器,该服务器具有一个集线器,该集线器通过发布Dictionary<long, List<SpecialParam>>对象来回复订阅请求。

SpecialParam列表包含同时继承SpecialParamASpecialParamBSpecialParam类型的项目。

当我尝试捕获客户端上的发布时:

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,但是仅当服务器接收到中心方法的输入时才调用它,而不是从中心发布输出时才调用它。

请帮忙!

更新

这是我对fidler的了解:

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


这就是服务器对客户端的答复。

更新2

我仍在尝试弄清楚如何将其反序列化为Dictionary<long, List<SpecialParam>>

最佳答案

我通过设置服务解决了它:

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);


我仍然不知道如何使我的客户收到已经反序列化的信息。

08-26 02:11