私は、SignalRを介して.NETクライアントとWebクライアントにデータを公開するWindowsサービスを用意しています。私は最近、面白い問題を抱えていますが、一貫した動作を得ることはできません。JSONのSignalRエンコーディング
問題は度記号、すなわち「℃」をシリアル化することにあります。
は初めて「°」が正しくシリアライズする方法を参照してください、しかし:それは正しくシリアライズされていますが、私は、私は私のデバッガで以下を参照してください。数回を持っていたほとんどの時間私たちはダイヤモンドの疑問符を二度目に見ますか?
これは無効なUTF-8文字であることを意味しています。しかし、なぜ他のすべてのプロパティは正しくシリアル化されますか?これは正しいものと正しくないものを表示するスクリーンショットですが、JSON全体には何百もの「C」文字列が正しく表示されています。
なぜこの例外がありますか?必ずしも同じポジション/プロパティであるとは限らず、常に起こるとは限りません。これは先行する/後続の文字との組み合わせでなければならないと思います。
これを解決する方法やこれをさらに調査する方法はありますか?
更新
これは、私はシリアル化を行う方法です。私は起動時にそれを設定:ここでは何が起こっている
var serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new StructuredAmountJsonConverter());
var serializer = JsonSerializer.Create(serializerSettings);
GlobalHost.DependencyResolver = new AutofacDependencyResolver(_lifetimeScope);
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer);
は、私は依存関係を解決するためにAutofacを使用するSignalRを言っているです。次にJSON.NETシリアライザを登録します。 JSON.NETシリアライザには、Amountクラスを上記の構造(値とユニットプロパティ)で変換するカスタムコンバータが1つあります。
問題はコンバーターにあると思うかもしれませんが、なぜそれが95%の時間稼働していますか?または、コンバータでエンコーディングを指定する必要がありますか?
アップデート2
私は私のネットワークトラフィックをキャプチャするフィドラーを使用してきたと私はそこに間違った文字を見ることができません。だから私は、エンコーディングの問題はクライアント側であると推測しています。私はさらに調査します。
アップデート3
私はフィドラーのトラフィックをキャプチャするために管理したのだが、テキストビューによさそうだが、私はHexViewを選択するとき、私は奇妙な何かを参照してください:
を"℃"の代わりに "°C"と表示されていることに注意してください。だから多分それは間違った方法でサーバーから送信していますか?
また、クライアントが.NET(WPF)クライアントであることに注意してください。
var url = "myUrl...";
_hubConnection = new HubConnection(url);
var hubProxy = _hubConnection.CreateHubProxy("MyHub");
hubProxy.On<object>("receive", OnDataReceived);
await _hubConnection.Start();
と受信データ:4
This postは、私はこれが起こっていると思わせる
var message = JsonConvert.DeserializeObject<MyDataContract>(obj.ToString(), new StructuredAmountJsonConverter());
更新:
これは私の(簡体字)、クライアント側で接続するためのコードです- サーバ/ SignalRが私のdatを送信していますaはUTF-8であるが、クライアントはlatin-1またはWindows-1252(おそらく後者)を期待している。だから今私はUTF-8をどのように使用できるかを調べる必要があります。
@Peterこれは、Jsonと同様のフォーマットで°Cの100レコードのダミーリストを使ってNewtonsoft.Jsonを使って複製してみました。うまくいきました。 –
ええ、それはそれがとても奇妙になります。それは起こるべきではありません...どのように私は生のバイトをキャプチャすることができますか?または、どのエンコーディングが使用されているか確認してください。 – Peter
クライアントでは、エンコードの種類とコンテンツの種類を設定する必要があると思います。このようなもの - "application/json; charset = UTF-8"この設定はヘッダーで行うことができますが、jQueryを使用している場合は、はるかに簡単です。クライアント側でJSONをどのように消費しているかを示すことはできますか? –