簡體   English   中英

SignalR 2.0更改Json Serializer以支持派生類型對象

[英]SignalR 2.0 change Json Serializer to support derived type objects

請注意,我在這里明確地引用了SignalR 2.0 ......我已經看到了一些(討厭的)方法用於SignalR 1.1 / 1.2 ......但是還沒有用於2.0。

有沒有人在更改SignalR 2.0默認的json序列化程序以啟用派生類型的發送方面有任何成功? 根據我讀到的有關SignalR 2.0的內容,這應該是可能的,但是,我沒有運氣,也沒有在任何地方找到完整的例子。

這是我開始的方式...任何幫助將不勝感激。

我的Startup.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();
            }
        }
    }

Hub上的方法

    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"
    });

只是為了衡量Stock.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");

但是,這導致了一個InvalidOperationException(由於連接處於斷開連接狀態,因此無法發送數據。在發送任何數據之前調用start。)在myDataHub.Invoke(..)調用期間。

問這個問題已經有一段時間了。 為了將來參考,需要在創建代理之后調用myConnection.Start()方法,如下所示

myConnection = new HubConnection(endpoint);

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

myConnection.Start();

proxy.Invoke("hubMethod", ...);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM