首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Json 2.0更改SignalR序列化程序以支持派生类型对象

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

Stack Overflow用户
提问于 2013-10-20 10:41:50
回答 1查看 5K关注 0票数 17

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

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

下面是我如何启动…的任何帮助都将不胜感激。

我的Startup.cs

代码语言:javascript
复制
    [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();
            }
        }
    }

Hub上的方法

代码语言:javascript
复制
    public void AddStock(Stock stock)
    {
        string stockType = stock.GetType().ToString();
        Console.WriteLine("The type of stock we got was: " + stockType);
    }

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

代码语言:javascript
复制
    myDataHub.Invoke("AddStock", new NyseStock()
    {
        Company = "Microsoft",
        NyseSymbol = "MSFT"
    });

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

只是为了更好的衡量Stock.cs

代码语言:javascript
复制
    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;
            }
        }
    }

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

代码语言:javascript
复制
    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");

然而,这只是导致了InvalidOperationException (数据无法发送,因为连接处于断开状态。在发送任何数据之前调用start。)在myDataHub.Invoke(..)调用。

EN

回答 1

Stack Overflow用户

发布于 2014-02-20 07:16:27

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

代码语言:javascript
复制
myConnection = new HubConnection(endpoint);

proxy = _conn.CreateHubProxy("DataHub");
proxy.On<string>("ServerEvent", ClientHandler);

myConnection.Start();

proxy.Invoke("hubMethod", ...);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19473337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档