Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 信号机和转换器_C#_Signalr - Fatal编程技术网

C# 信号机和转换器

C# 信号机和转换器,c#,signalr,C#,Signalr,我想按说明序列化派生类型,但对于信号器 我想实现从JsonConverter派生的自定义转换器 我把它添加到信号器中如下 var serializer = GlobalHost.DependencyResolver.GetService(typeof(JsonSerializer)) as JsonSerializer; var i = new CustomTypeConverter(); serializer.Converters.Add(i); GlobalHost.DependencyRe

我想按说明序列化派生类型,但对于信号器 我想实现从JsonConverter派生的自定义转换器

我把它添加到信号器中如下

var serializer = GlobalHost.DependencyResolver.GetService(typeof(JsonSerializer)) as JsonSerializer;
var i = new CustomTypeConverter();
serializer.Converters.Add(i);
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);
public override bool CanConvert(Type objectType)

当我调试这个函数时,我看不到我认为是解决方案一部分的类型

这已经让我发疯好几个小时了。多亏了halter73的评论,我在我的特殊情况下找到了解决问题的方法:我需要管道来为我创建接口实例,而这不是开箱即用的。 因此,解决方案如下:

class CustomResolver : Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver
{
    public override object ResolveParameter( Microsoft.AspNet.SignalR.Hubs.ParameterDescriptor descriptor, Microsoft.AspNet.SignalR.Json.IJsonValue value )
    {
        if( descriptor.ParameterType.IsInterface )
        {
            object TargetObject = <Create the object instance here>
            return value.ConvertTo( TargetObject.GetType() );
        }
        else
        {
            return value.ConvertTo( descriptor.ParameterType );
        }
    }
}
将此新参数解析程序注册到:

GlobalHost.DependencyResolver.Register( typeof( Microsoft.AspNet.SignalR.Hubs.IParameterResolver ), () => new CustomResolver() );

如何使用要序列化的类型?如果将其作为参数传递给客户机中心方法,则您要查找的类型可能是ClientHubinLocation。您类型的对象将位于“Args”数组中。我在trasport线上没有看到ClientHubinLocation,我看到了HubInvocation,我无法访问它,因为它是一个私有类。我还看到了ClientHubInfo,HubInvocation HubInvocation类正在被反序列化,而不是序列化。您正在尝试反序列化或序列化您的类型吗?或者两者都有?如果您仍在尝试序列化,则可能需要查找ConnectionMessage而不是ClientHubinLocation。ConnectionMessage.Value将包含您的ClientHubinLocation。我正在尝试基于客户端生成的$type属性在服务器端反序列化。遗憾的是,您当前无法通过替换/修改JsonSerializer来更改服务器端输入的反序列化方式。DependencyResolver注册了一个iPrameterResolver,负责反序列化服务器端输入。IParameterResolver由DefaultParameterResolver实现,它不使用DependencyResolver注册的JsonSerializer。谢谢你。我在服务器端使用了很多不可变类型,尽管JSON.Net很乐意对它们进行反序列化(并且让SignalR/WebAPI使用JSON.Net),但我无法让SignalR调用我的JSON.Net契约解析器。我从您的回答中看到,创建参数解析器是将代码填充到SignalR以使其正常工作的适当方法。谢谢!!:)
GlobalHost.DependencyResolver.Register( typeof( Microsoft.AspNet.SignalR.Hubs.IParameterResolver ), () => new CustomResolver() );