4

サーバーからの 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

私は過去数時間これと戦ってきましたが、本当に助けが必要です.

4

1 に答える 1