サーバーからの JSON 応答の解析で奇妙な問題に直面しています。次のように(Content-Type: text/html で)応答を取得すると、ここ数か月は問題なく動作しています。
string response = "";
using (var client = new System.Net.Http.HttpClient())
{
var postData = new System.Net.Http.FormUrlEncodedContent(data);
var clientResult = await client.PostAsync(url, postData);
if(clientResult.IsSuccessStatusCode)
{
response = await clientResult.Content.ReadAsStringAsync();
}
}
//Parse the response to a JObject...
ただし、 Content-Type: text/html;の応答を受信した場合。charset=utf8 Content-Type が無効であるという例外をスローします。
Exception message: The character set provided in ContentType is invalid. Cannot read content as string using an invalid character set.
だから私はこれを変更しました:
response = await clientResult.Content.ReadAsStringAsync();
これに:
var raw_response = await clientResult.Content.ReadAsByteArrayAsync();
response = Encoding.UTF8.GetString(raw_response, 0, raw_response.Length);
これで、例外なしで応答を取得できますが、解析時に解析例外がスローされます。デバッグ中にこれを取得しました:(テスト目的で応答を短いものに変更しました)
var r1 = await clientResult.Content.ReadAsStringAsync();
var r2 = Encoding.UTF8.GetString(await clientResult.Content.ReadAsByteArrayAsync(), 0, raw_response.Length);
System.Diagnostics.Debug.WriteLine("Length: {0} - {1}", r1.Length, r1);
System.Diagnostics.Debug.WriteLine("Length: {0} - {1}", r2.Length, r2);
//Output
Length: 38 - {"version":1,"specialword":"C\u00e3o"}
Length: 39 - {"version":1,"specialword":"C\u00e3o"}
JSON 応答形式はどちらの場合も正しいようですが、長さが異なり、その理由がわかりませんでした。これをメモ帳++にコピーして隠し文字を見つけると、? どこからともなく現れた。
Length: 38 - {"version":1,"specialword":"C\u00e3o"}
Length: 39 - ?{"version":1,"specialword":"C\u00e3o"}
これ?明らかに解析例外をスローしていますが、なぜそれが発生しているのかわかりませんEncoding.UTF8.GetString
。
私は過去数時間これと戦ってきましたが、本当に助けが必要です.