2013-08-02 26 views
15

我需要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再次序列化。我怎麼能做到這一點?

+0

好問題。很難看到沒有答案。我也有興趣實現多態消息合約。 –

+0

這個問題仍然與2.x相關嗎?使用2.x,你應該能夠將更新後的'DependencyResolver'傳遞到'app.MapSignalR(config)'調用的'HubConfiguration'中 –

回答

0

如果您使用連接API而不是Hub API,則可以處理OnReceive事件並以原始JSON(字符串)的形式獲取請求。看看this example。在2.x版加入

能夠發送預先序列數據使用集線器API的客戶,我不知道任何方式做到這一點在1.x中(見github issue