【问题标题】:How to set Content-Type header in a http get response using C#'s HttpClient?如何使用 C# 的 HttpClient 在 http 获取响应中设置 Content-Type 标头?
【发布时间】:2016-02-18 10:48:24
【问题描述】:

我在以正确的字符集检索 http get 请求的内容时遇到问题。

我尝试了几段代码,例如:

HttpClient h = new HttpClient();
//Content-Type: text/html; charset=UTF-8

//p.s. contents are in hebrew.    
var resp = h.GetAsync("http://www.wnf.co.il");
var content = resp.Result.Content;

//remove the default Content-Type header
content.Headers.Remove("Content-Type");
content.Headers.Add("Content-Type", "text/html; charset=utf-8");
var res = content.ReadAsStringAsync();
var s = res.Result;

Console.WriteLine(s);

这仍然没有帮助,我仍然得到错误编码的内容。

This post 阐明设置标头的请求标头字符集无济于事,需要设置的是响应。 (此外,您在尝试添加时会出错 标头“Content-Type”到请求标头。)

但我仍然无法以正确的字符集 (utf-8) 检索内容。

我错过了什么?

一段时间以来,我一直在用希伯来语网站做类似的事情,比较这个网站的 Fiddler 中的响应标头和我没有这个问题的其他网站 - 我看到的唯一区别确实是这个 Content-Type 标头回应。

【问题讨论】:

  • 那么内容的实际编码是什么,Content-Type 标头告诉你什么?当这些不同时,大多数 HTTP 客户端返回 mojibake,您可能必须将响应正文作为字节数组获取并自己从字节中解码字符串。
  • fiddler 对此站点的响应 ContentType(显示一个好看的响应)是 UTF-8,媒体类型为“text/html”,就像我试图设置的那样。

标签: http-headers http-get dotnet-httpclient


【解决方案1】:

问题可能是由于这个错误:

https://connect.microsoft.com/VisualStudio/feedback/details/790174/system-net-http-httpcontent-readasstringasync-does-not-handle-imperfect-content-type-headers

解决方法是将响应作为字节数组获取并自己编码:

var bytes = await content.ReadAsByteArrayAsync();
var s = Encoding.UTF8.GetString(bytes, 0, bytes.Length);

作为旁注,您使用.Result 而不是await 是否有原因?您正在不必要地阻塞当前线程并使自己陷入死锁。

【讨论】:

  • 嘿托德,从最后开始,主要原因是我对这个主题缺乏了解:) 谢谢你指出这一点,会看的。 (老实说,我这样做是因为 somewhere/someoneResult 与发出 await 相同,并且使用 await 具有要求该方法的 烦恼标有同步,这增加了更多要求...)。关于我的问题的答案,将尝试您的建议,并让您知道发生了什么。
  • 托德,根据您的回答,如果我要在我的代码中替换将标题添加到标题 non-imperfect 内容类型标题的行,它应该可以工作,应该它不是 ?但事实并非如此。
  • 使用您的解决方案(仍然使用 Result 而不是等待)也不起作用,调试器仍然显示错误的编码字符。无论如何,您都会获得整体见解的 +1 :)
  • 托德,与此无关,但我在您触发的异步/等待主题上发布了question。你能回答吗?
  • 看起来你在那个问题上得到了你需要的帮助?我强烈建议您在 async/await 上查看 Stephen Cleary's introductory blog series,您似乎对它的工作原理有一些非常严重的误解,这超出了本问题的范围。
猜你喜欢
  • 2012-05-27
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2015-04-17
相关资源
最近更新 更多