2014-08-29 2 views
3

Я не могу понять, почему IEnumerable, возвращаемый HttpRequestHeaders.GetValues ​​(строка) возвращает IEnumerable, который имеет только один элемент в нем.Почему IEnumerable, возвращаемый HttpRequestHeaders.GetValues ​​(string), имеет только одну строку?

Когда в заголовке указано несколько элементов с запрошенным именем, я получаю IEnumerable с 1 строковой записью, которая равна CSV-конкатенации всех соответствующих элементов заголовка.

Я ожидал бы, если возвращаемое значение является IEnumerable, что каждая соответствующая запись заголовка будет его собственным элементом. И наоборот, если метод всегда конкатенирует все, тогда я ожидаю, что возвращаемое значение будет просто одной строкой.

Ожидаемое:

{ "Test", "Test2" } 

Actual:

{ "Test, Test2" } 

Использование Fiddler для проверки, я пытался добавить несколько записей в мой заголовок:

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

As а также несколько 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 содержит разобранные заголовки, а парсер выполняет некоторую «очистку». –

+1

@AdrianoRepetti Но второй пример * представляет собой * список значений, разделенных запятыми, и 'GetValues' возвращает' IEnumerable', так почему бы не быть нескольких значений? Почему бы просто не вернуть строку? – CodingIntrigue

+0

@RGraham, потому что 2-й пример не нуждается в очистке. Список, разделенный запятыми ... Является единственной строкой. Интересно, КОГДА может быть возвращено несколько значений ... –

ответ

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 
} 

Tweak это по мере необходимости, кажется, есть только значения, но не ключи.