[英]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.