2013-08-02 9 views
15

HUBメソッドのパラメータのシリアル化を調整する最良の方法は、SignalR開発者のガイドラインが必要です。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に正しくシリアル化されている - フィドラーで検証済み)、サーバーはパラメーターを直列化復元できないというエラーを返しました。 デバッガの助けを借りて、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.ToObject<IMessage>(JsonSerializer) 

方法を使用して、データの手動デシリアライゼーション続い

public void SendMessage(JObject data) 

:jオブジェクトのパラメータの型とメソッドを定義します。しかし、私は、シリアライザをカスタマイズし、ハブ方式でタイプ/インタフェースを持つ方が好きです。次のSignalRの設計に関して、それを行う「正しい方法」は何ですか?

また、自分のコードから生のJSONをクライアントに返す可能性があることもわかりました。つまり、オブジェクトがSignalRで再びシリアライズされないようにするためです。どうすればこれを達成できますか?

+0

良い質問を行うにはどのような方法を知りません。答えを見るのは悲しいです。また、多形メッセージ・コントラクトの実装にも興味があります。 –

+0

この質問は2.xとまだ関連していますか? 2.xでは、更新された 'DependencyResolver'を' app.MapSignalR(config) '呼び出しの' HubConfiguration'に渡すことができます –

答えて

0

ハブAPIの代わりに接続APIを使用すると、OnReceiveイベントを処理して、未処理のJSON(文字列)としてリクエストを取得できます。 this exampleをご覧ください。ハブのAPIを使用してクライアントに事前にシリアル化されたデータを送信するために

能力は2.xバージョンで追加されましたし、私は1.xで(github issueを参照)ことを

関連する問題