2014-08-29 73 views
3

我想不通爲什麼了IEnumerable返回由HttpRequestHeaders.GetValues(串)返回一個IEnumerable,只有曾經在這1項。爲什麼HttpRequestHeaders.GetValues(string)返回的IEnumerable只有1個字符串?

當請求的名稱多個項目都在標題中,我得到一個IEnumerable帶有等於所有匹配的頭項目的CSV串聯1個字符串項。

如果返回值是一個IEnumerable每個匹配的頭項將是自己的項目我期望的那樣。相反,如果該方法總是連接所有的東西,那麼我希望返回值只是一個單一的字符串。

預計:

{ "Test", "Test2" } 

實際:

{ "Test, Test2" } 

使用招來測試,我已經嘗試添加多個條目,以我的頭:

GET https://localhost/api/v1/users/1 HTTP/1.1 
Host: localhost 
TestHeaderField: Test 
TestHeaderField: Test2 

由於以及多個公司mma分開的項目:

GET https://localhost/api/v1/users/1 HTTP/1.1 
Host: localhost 
TestHeaderField: Test, Test2 

我正在使用ASP.NET Web API 2版本5.0.0,使用.Net 4.5.1。有什麼我在這裏失蹤或這是在底層代碼中的錯誤?

+1

僅僅因爲它是RFC 2616的要求。明確來自HTTP 1.1§4.2:_「當且僅當該標題字段的整個字段值被定義爲以逗號分隔的列表」_「時,具有相同字段名的多個消息標題字段可以存在於消息中。 HttpRequestHeaders包含解析的頭文件,解析器執行一些「清理」。 – 2014-08-29 14:23:40

+1

@AdrianoRepetti但第二個例子是* *一個逗號分隔值列表和'GetValues'返回'IEnumerable',所以爲什麼不會有多個值嗎?爲什麼它不會返回一個'string'? – CodingIntrigue 2014-08-29 14:29:10

+0

@Rraham因爲第二個例子不需要任何清理。逗號分隔的列表...是單個字符串。我想知道當多個值可能會返回... – 2014-08-29 14:32:14

回答

0

HttpRequestHeaders.GetValues將返回多個值的頭它有解析器,如果值是良好的。您可以通過發送多個Accept標題來測試此操作:

GET https://localhost/api/v1/users/1 HTTP/1.1 
Host: localhost 
Accept: text/html 
Accept: application/xhtml+xml 
Accept: application/xml 
0

你可以嘗試這樣的事情讓每個請求頭:

NameValueCollection headers = HttpRequestHeaders; 
for (int i = 0; i < headers.Count; i++) 
{ 
    string key = headers.GetKey(i); 
    string value = headers.Get(i); 
    // use key and value 
} 

調整這個需要,你似乎只有值,但沒有鑰匙。

相關問題