反序列化由 SignalR 作为抽象类传递的对象



我有一个 WebAPI 服务器,它有一个中心,通过发布一个Dictionary<long, List<SpecialParam>>对象来回复订阅请求。

SpecialParam列表包含类型为 SpecialParamASpecialParamB 的项目,这些项目都继承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);

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

相关内容

  • 没有找到相关文章

最新更新