SignalR 2.0 更改 Json 序列化程序以支持派生类型对象

本文关键字:支持 派生 类型 对象 程序 序列化 更改 Json SignalR | 更新日期: 2023-09-27 18:36:08

请注意,我在这里明确引用了 SignalR 2.0 ...我已经在 SignalR 1.1/1.2 中看到了一些(令人讨厌的)方法......但 2.0 还没有。

是否有人在更改 SignalR 2.0 默认 json 序列化程序以启用派生类型的发送方面取得了任何成功? 根据我读到的有关 SignalR 2.0 的内容,这应该是可能的,但是,我没有任何运气,也没有在任何地方找到完整的示例。

这是我开始的方式...任何帮助将不胜感激。

我的创业公司.cs

    [assembly: OwinStartup(typeof(SignalRChat.Startup))]
    namespace SignalRChat
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                // this should allow the json serializer to maintain the object structures
                var serializer = new JsonSerializer()
                {
                    PreserveReferencesHandling = PreserveReferencesHandling.Objects,
                    TypeNameHandling = TypeNameHandling.Objects,
                    TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
                };
                // register it so that signalr can pick it up
                GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);
                app.MapSignalR();
            }
        }
    }

集线器上的方法

    public void AddStock(Stock stock)
    {
        string stockType = stock.GetType().ToString();
        Console.WriteLine("The type of stock we got was: " + stockType);
    }

我的控制台测试应用(发布到中心)

    myDataHub.Invoke("AddStock", new NyseStock()
    {
        Company = "Microsoft",
        NyseSymbol = "MSFT"
    });
    myDataHub.Invoke("AddStock", new DaxStock()
    {
        Company = "Microsoft",
        DaxSymbol = "DMSFT"
    });

只是为了好衡量股票.cs

    namespace Messages
    {
        public class Stock
        {
            public string Company
            {
                get;
                set;
            }
            public decimal Price
            {
                get;
                set;
            }
        }
        public class NyseStock : Stock
        {
            public string NyseSymbol
            {
                get;
                set;
            }
        }
        public class DaxStock : Stock
        {
            public string DaxSymbol
            {
                get;
                set;
            }
        }
    }

的第一个倾向是我忽略了在客户端中设置序列化程序。 所以我在创建连接之后但在创建集线器代理之前添加了以下内容:

    myConnection = new HubConnection("http://localhost:64041/");
    // Update the serializer to use our custom one
    myConnection.JsonSerializer = new JsonSerializer()
    {
         PreserveReferencesHandling = PreserveReferencesHandling.Objects,
         TypeNameHandling = TypeNameHandling.Objects,
         TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
    };
    //Make proxy to hub based on hub name on server
    myDataHub = myConnection.CreateHubProxy("DataHub");

但是,这只导致了无效操作异常(无法发送数据,因为连接处于断开连接状态。在发送任何数据之前调用开始。在 myDataHub.Invoke(..) 调用期间。

SignalR 2.0 更改 Json 序列化程序以支持派生类型对象

这个问题问已经有一段时间了。为了将来参考,创建代理后需要调用myConnection.Start()方法,如下所示

myConnection = new HubConnection(endpoint);
proxy = _conn.CreateHubProxy("DataHub");
proxy.On<string>("ServerEvent", ClientHandler);
myConnection.Start();
proxy.Invoke("hubMethod", ...);