【发布时间】:2013-08-05 06:32:41
【问题描述】:
我在解析来自服务器的 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 is invalid的异常。
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 响应格式在这两种情况下似乎都是正确的,但长度不同,我不知道为什么。将其复制到 notepad++ 以发现隐藏字符时,一个 ? 不知从何而来。
Length: 38 - {"version":1,"specialword":"C\u00e3o"}
Length: 39 - ?{"version":1,"specialword":"C\u00e3o"}
这个 ? 显然抛出了解析异常,但我不知道为什么 Encoding.UTF8.GetString 会导致这种情况。
过去几个小时我一直在与这个问题作斗争,我真的需要一些帮助。
【问题讨论】:
-
@T.J.Crowder
text/html; charset=utf8抱歉耽搁了。我再次进行了测试以确保 -
@T.J.Crowder 第一个字符:FEFF