如何使用C#的HttpClient在http get响应中设置Content-Type标头?

时间:2016-02-18 10:48:24

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

我在正确的字符集中检索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);

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

enter image description here

This post说明设置标头的请求标头字符集无济于事,它是响应的一个需要设置的响应。 (此外,尝试添加时会出错 标题"内容类型"请求标题。)

但是我仍然无法在适当的字符集(utf-8)中检索内容。

我错过了什么?

我一直在用希伯来网站做类似的事情,比较来自这个网站的Fiddler的回复标题以及我没有这个问题的其他人 - 我看到的唯一区别就是这个内容 - 在响应中键入标题。

1 个答案:

答案 0 :(得分:1)

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

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

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

var options;
options.appendElement = $document.find('aside-box').eq(0);
return $uibModal.open(options);

作为旁注,您是否有理由使用var bytes = await content.ReadAsByteArrayAsync(); var s = Encoding.UTF8.GetString(bytes, 0, bytes.Length); 代替.Result?您正在不必要地阻止当前线程并为自己设置死锁。