我有一台WebAPI服务器,该服务器具有一个集线器,该集线器通过发布Dictionary<long, List<SpecialParam>>
对象来回复订阅请求。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
,但是仅当服务器接收到中心方法的输入时才调用它,而不是从中心发布输出时才调用它。请帮忙!
更新
这是我对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);
我仍然不知道如何使我的客户收到已经反序列化的信息。