在Windows应用商店应用中使用httpclient获取UTF-8响应

Sam*_*uyn 11 .net c# utf-8 character-encoding windows-runtime

我正在构建一个Windows应用商店应用,但我坚持从API获取UTF-8响应.

这是代码:

using (HttpClient client = new HttpClient())
{
    Uri url = new Uri(BaseUrl + "/me/lists");

    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
    request.Headers.Add("Accept", "application/json");
    HttpResponseMessage response = await client.SendRequestAsync(request);
    response.EnsureSuccessStatusCode();

    string responseString = await response.Content.ReadAsStringAsync();

    response.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

reponseString总是包含奇怪的字符应该是像口音é,我试图使用流,但我在一些例子中发现的API无法在Windows RT存在.

编辑:改进代码,仍然是同样的问题.

Cam*_*nez 22

而不是response.Content.ReadAsStringAsync()直接使用你可以使用response.Content.ReadAsBufferAsync()@Kiewic指向如下:

var buffer = await response.Content.ReadAsBufferAsync();
var byteArray = buffer.ToArray();
var responseString = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
Run Code Online (Sandbox Code Playgroud)

这在我的情况下工作,我想使用UTF8应该解决大多数问题.现在去了解为什么没有办法用这个ReadAsStringAsync:)

  • ReadAsBufferAsync 不存在。也许 ReadAsByteArrayAsync? (5认同)

Ogg*_*las 6

是这样解决的:

using (HttpClient client = new HttpClient())
    {
        using (HttpResponseMessage response = client.GetAsync(url).Result)
            {
                var byteArray = response.Content.ReadAsByteArrayAsync().Result;
                var result = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
                return result;
            }
    }
Run Code Online (Sandbox Code Playgroud)


Mel*_*per 5

也许问题在于响应被压缩了。如果内容类型是 gzip,您需要将响应解压缩为字符串。有些服务器这样做是为了节省带宽,这通常没问题。在 .NET Core 和可能的 .NET Framework 中,这将自动解压缩响应。但这在 UWP 中不起作用。对我来说,这似乎是 UWP 中的一个明显错误。

string responseString = await response.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)

该线程给出了如何解压缩响应的清晰示例:

使用 C# 压缩/解压字符串

  • 这为我解决了这个问题。为了确保在尝试解压缩响应之前,我通过注释掉 `HttpClient.DefaultRequestHeaders.Add("*Accept-Encoding*", "gzip, deflate, br");` 禁用了“Accept-Encoding”标头之后工作得很好。 (2认同)