我有一个 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
,但仅在服务器收到对 hub 方法的输入时调用它,而不是在从集线器发布输出时调用它。
请帮忙!
更新
这是我用小提琴手抓到的:
{"$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);
我仍然不知道如何让我的客户端收到已经反序列化的它。