2014-09-29 22 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

相關問題