2014-09-29 76 views
9

GETHttpClient执行时,我可以明确设置Content-Type标题值吗?在HttpClient中显式设置内容类型标题以获得操作

我意识到这打破了1.1协议,但我正在使用不符合它的API,并且需要我设置一个Content-Type标题。

我有没有用试过这个...

using (var httpClient = new HttpClient()) 
{ 
    var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "http://example.com"); 

    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded+v1.3"); 

    await httpClient.SendAsync(httpRequestMessage) 
} 

我的TryAddWithoutValidation后检查的DefaultRequestHeaders加入,它似乎并没有被设置Content-Type值。

如果我试图通过设置httpRequestMessage.Content = ...设置httpRequestMessage(的内容类型,我得到以下错误:

Cannot send a content-body with this verb-type. 

有没有办法,我可以使用显式设置Content-TypeGET操作的方式HttpClient?

+0

作为一种解决办法我已经能够在此期间使用'WebClient'。 – Nagoh 2014-09-29 23:21:06

+0

@ZenCoder。这不会设置“Content-Type”标题。只有“接受”标题。 – Nagoh 2014-09-29 23:21:54

回答

5

基于我的发现,我总结出HttpClient在协议规则方面的限制性很强,我也通过实现DLL反映出来,并且我找不到任何可能表明它允许协议违规的东西。

GET请求不应该具有内容类型标头,并且HttpClient正在执行该规则。

我觉得异常消息,当您尝试设置Content-Type头的自我描述:

System.InvalidOperationException: Misused header name. Make sure request headers are used with HttpRequestMessage, response headers with HttpResponseMessage, and content headers with HttpContent objects.

此外,如果你使用set你会得到一个更自我描述消息的内容主体:

System.Net.ProtocolViolationException: Cannot send a content-body with this verb-type.

既然你愿意违反HTTP规则的GET请求,我敢肯定你唯一的选择就是坚持使用限制程度较低的WebClient,它适用于这种情况。

+0

对不起,我需要重复自己 - 我正在整合的API不符合HTTP规范。他们需要一个'GET'操作,提供一个'Content-Type'头。 – Nagoh 2014-09-29 23:45:18

+0

没错。抱歉。我重写了我的回应。 – 2014-09-30 00:24:36

+0

谢谢,我有一种感觉可能是唯一的选择。感谢您的帮助 – Nagoh 2014-09-30 01:52:30

4

这是可能的 - 而且非常肮脏 - 用一点思考来重写库的行为,并且引入一个DelegatingHandler作为参数给HttpClient构造函数。请参阅下面的代码。

public class HmacAuthenticatingHandler : DelegatingHandler 
{ 
    public HmacAuthenticatingHandler(HttpMessageHandler innerHandler) 
     : base(innerHandler) 
    { 
    } 

    protected override async Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, CancellationToken cancellationToken) 
    { 

     // HACK: Set 'Content-Type' even for GET requests 
     var invalidHeaders = (HashSet<string>)typeof(HttpHeaders) 
      .GetField("invalidHeaders", BindingFlags.NonPublic | BindingFlags.Instance) 
      .GetValue(request.Headers); 
     invalidHeaders.Remove("Content-Type"); 

     request.Headers.Remove("Content-Type"); 
     request.Headers.Add("Content-Type", "application/json"); 

     var response = await base.SendAsync(request, cancellationToken); 
     return response; 
    } 
} 
+0

不支持.Net Framework 4.0,System.Net.Http 2.2.29.0,但使用2.0.0.0 – prem 2017-01-25 10:10:01

+0

@prem将“invalidHeaders”更改为“_invalidHeaders” – Andy 2017-02-14 15:08:53

0

你有没有尝试添加页眉内容标题(如并列为请求头) 看到here