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で再びシリアライズされないようにするためです。どうすればこれを達成できますか?
良い質問を行うにはどのような方法を知りません。答えを見るのは悲しいです。また、多形メッセージ・コントラクトの実装にも興味があります。 –
この質問は2.xとまだ関連していますか? 2.xでは、更新された 'DependencyResolver'を' app.MapSignalR(config) '呼び出しの' HubConfiguration'に渡すことができます –