在Windowsapp store应用中使用httpclient获取UTF-8响应

我正在构建一个Windowsapp store应用,但我坚持从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(); } 

reponseString总是包含奇怪的字符,这些字符应该是é等重音符号,我尝试使用流,但是我在Windows RT中找不到某些示例中的API。

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

而不是直接使用response.Content.ReadAsStringAsync() ,您可以使用@Kiewic指向的response.Content.ReadAsBufferAsync() ,如下所示:

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

这是在我的情况下工作,我想使用UTF8应该解决大多数问题。 现在去了解为什么使用ReadAsStringAsync无法做到这ReadAsStringAsync 🙂

我喜欢El Marchewko使用扩展程序的方法,但代码对我不起作用。 这样做:

 using System.IO; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace WannaSport.Data.Integration { public static class HttpContentExtension { public static async Task ReadAsStringUTF8Async(this HttpContent content) { return await content.ReadAsStringAsync(Encoding.UTF8); } public static async Task ReadAsStringAsync(this HttpContent content, Encoding encoding) { using (var reader = new StreamReader((await content.ReadAsStreamAsync()), encoding)) { return reader.ReadToEnd(); } } } } 

解决它像这样:

 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; } } 

HttpClient不会给你很大的灵活性。

您可以使用HttpWebRequest代替,并使用HttpWebResponse.GetResponseStream()从响应中获取原始字节。

还不能评论,所以我必须在这里添加我的想法。

您可以尝试使用_client.GetStringAsync(url)作为@cremor建议,并使用_client.DefaultRequestHeaders属性设置您的身份validation标头。 或者,您也可以尝试在response.Content对象上使用ReadAsByteArrayAsync方法,并使用System.Text.Encoding将该字节数组解码为UTF-8字符串。

我使用扩展的方法:

  using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.Web.Http; namespace yourfancyNamespace { public static class IHttpContentExtension { public static async Task ReadAsStringUTF8Async(this IHttpContent content) { return await content.ReadAsStringAsync(Encoding.UTF8); } public static async Task ReadAsStringAsync(this IHttpContent content, Encoding encoding) { using (TextReader reader = new StreamReader((await content.ReadAsInputStreamAsync()).AsStreamForRead(), encoding)) { return reader.ReadToEnd(); } } } } 

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

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

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

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