アプリケーション レイヤー全体で一貫したシリアル化を実現するために、他の場所で使用するものと同じシリアル化ライブラリ (ServiceStack.Text) を SignalR に使用したいと考えています。
使用されている JSON シリアライザーを置き換えるための SignalR の Wikiエントリをたどりながら、次の基本的なハンドラーを作成しました。
public class SignalrServiceStackJsonSerializer : IJsonSerializer
{
public void Serialize(object value, TextWriter writer)
{
var selfSerializer = value as IJsonWritable;
if (selfSerializer != null)
selfSerializer.WriteJson(writer);
else
JsonSerializer.SerializeToWriter(value, writer);
}
public object Parse(TextReader reader, Type targetType)
{
return JsonSerializer.DeserializeFromReader(reader, targetType);
}
}
統合:
var serializer = new SignalrServiceStackJsonSerializer();
GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);
残念ながら、統合後、SignalR JS クライアントは既定のシリアライザーとは異なるパッケージを取得します。ご覧のとおり、デフォルトのシリアライザーは (少なくとも非ユーザー メッセージの場合) プロパティが 1 文字に制限された JSON を生成しますが、これは ServiceStack.Text に置き換えた後は発生しません。したがって、SignalR は 'I' にアクセスしようとしますが、'Id' を受け取りました。SignalR サーバー側ソースコードのそれぞれの部分を見つけることができませんでした。
何か間違ったことをしたのでしょうか、それとも ServiceStack.Text を JSON シリアライザーとして使用するには、より複雑なラッパーを作成する必要がありますか?