我需要SignalR開發人員的一些指導,調整HUB方法的參數序列化的最佳方法是什麼。SignalR集線器方法參數序列化
我開始將我的項目從WCF輪詢雙工(Silverlight 5 - ASP.NET 4.5)遷移到SignalR(1.1.2)。消息(數據契約)是基於接口的多態。 (像IMessage,MessageA:IMessage等 - 實際上有類實現的接口層次結構,但對問題沒有太大意義)。 (我知道多態對象不適合客戶端,但客戶端將處理它作爲JSON和映射到對象只在服務器端或客戶端,如果它是.NET/Silverlight)
在集線器上我定義了這樣的方法:
public void SendMessage(IMessage data) { .. }
我創建的自定義JsonConverters和驗證消息可能被序列化/使用Json.NET反序列化。然後我用適當的設置替換了DependencyResolver中的JsonNetSerializer。同樣在Silverlight客戶端。到現在爲止還挺好。
但是,當我從客戶端發送消息到服務器(消息序列化爲JSON正確 - 在Fiddler中驗證),服務器返回的錯誤,該參數無法反序列化。 在調試器的幫助下,我發現SignalR中有一個錯誤(JRawValue類負責參數反序列化,在內部創建它自己的JsonSerializer實例,忽略提供的參數)。似乎與
var serializer = GlobalHost.DependencyResolver.Resolve<IJsonSerializer>();
return serializer.Parse(jsonReader, type);
更換
var settings = new JsonSerializerSettings
{
MaxDepth = 20
};
var serializer = JsonSerializer.Create(settings);
return serializer.Deserialize(jsonReader, type);
是相當容易解決,但我也發現,界面IJsonSerializer會在SignalR的未來版本中刪除。基本上,我需要的是從HUB方法獲得原始JSON(或字節流),這樣我就可以自行反序列化它,或者通過指定轉換器等來調整序列化程序。
現在我結束了定義與JObject參數類型的方法:使用
JObject.ToObject<IMessage>(JsonSerializer)
方法
public void SendMessage(JObject data)
隨後數據的手動反序列化。但我寧願自定義序列化器,並在集線器方法上使用類型/接口。關於下一個SignalR的設計,有什麼「正確的方法」?
我也發現有用的是有可能從我的代碼發送回客戶端的原始JSON,即使對象不再被SignalR再次序列化。我怎麼能做到這一點?
好問題。很難看到沒有答案。我也有興趣實現多態消息合約。 –
這個問題仍然與2.x相關嗎?使用2.x,你應該能夠將更新後的'DependencyResolver'傳遞到'app.MapSignalR(config)'調用的'HubConfiguration'中 –