2014-06-27 28 views
3

下面的測試失敗令人費解:內容頭部取出失敗字符串授權

[Test] 
    public void CrazyAssHttpRequestMessageTest() 
    { 
     var subject = new HttpRequestMessage() 
          { 
           Method = HttpMethod.Get, 
           Content = new StringContent("some content") 
          }; 
     subject.Content.Headers.Remove("Authorization"); 
    } 

的例外是:

System.InvalidOperationException:誤用頭名。確保 請求標頭與HttpRequestMessage一起使用,帶有HttpResponseMessage的響應標頭 和帶有HttpContent 對象的內容標頭。

爲什麼?其他任何頭文件似乎都可以正常工作,用別的東西代替授權,一切正常。

+0

您是否嘗試過'subject.Request.Headers.Remove(「Authorization」);'? – Haney

+0

@DaveHaney是的,這是有效的,我也想從request.content – Calin

回答

3

HttpContentHeaders類只支持HTTP標頭的一個子集 - 與內容相關的標頭。看起來有點奇怪的決定將它們分開,但這就是框架的工作方式。

結果是在request.Content.Headers中永遠不會有授權標題。

,如果你嘗試從HttpRequestHeadersHttpResponseHeaders刪除"Content-Type"你得到完全相同的錯誤,或者如果您嘗試添加一個意想不到的頭這些集合,而無需調用TryAddWithoutValidation。更令人沮喪的是,Contains()如果您嘗試檢查無效的標題,則會拋出此事實。您可以檢查是否存在,而不用擔心使用HttpHeaders.TryGetValues或使用request.Content.Headers.Any(x => x.Key == "Authorization")的標題集合的確切類型。

上面鏈接的類具有它們明確支持的標題列表(作爲強類型屬性),例如HttpContentHeaders.ContentType

+2

刪除我會爲OP添加,只有一個地方頭去:在請求。在代碼中,正如@BennorMcCarthy所解釋的那樣,請求標頭在「HttpContentHeaders」和「HttpRequestHeaders」類中分開(我個人覺得它真的很笨),但是不管你是與一個類還是另一個類交互,都會發生同樣的事情:頭在請求結束。 – Haney

+0

@DaveHaney基本上使用Request.Headers是我需要擔心的所有問題 – Calin

+0

如果您需要修改Content-Type之類的東西,您仍然需要在請求中使用內容頭。 –