HTTP-ответ - это обычный текст, в котором первая строка называется строкой состояния. Под ней могут быть указаны заголовки - строки с двоеточием. Оно делит строку на две части: слева - имя заголовка, а справа - его значение.
Тело сообщения отделяется от заголовков пустой строкой. Пример HTTP-ответа:
| Date: Thu, 16 Apr 2009 08:39:02 GMT |
| Set-Cookie: cname=5; expires=Tue, 13-Apr-2010 23:43:04 GMT; path=/; domain=.getvaluetest.ru |
| Set-Cookie: cvalue=5; expires=Tue, 13-Apr-2010 23:43:04 GMT; path=/; domain=.getvaluetest.ru |
| Content-Type: text/html; charset=windows-1251 |
Для доступа к заголовкам используется свойство HttpWebResponse.Headers типа WebHeaderCollection. Так как WebHeaderCollection наследует NameValueCollection, то можно предположить, что поведение HttpWebResponse.Headers будет соответствующим.
| // пример использования NameValueCollection |
| NameValueCollection col1 = new NameValueCollection(); |
| col1.Add("key1", "value1.1"); |
| col1.Add("key2", "value2"); |
| col1.Add("key1", "value1.2"); |
| // в коллекции два ключа: key1 и key2 |
| CollectionAssert.AreEquivalent(col1.AllKeys, new[] { "key1", "key2" }); |
| // совпадают значения, возвращаемые .GetValues(int) и .GetValues(string) |
| var key1values = new[] { "value1.1", "value1.2" }; |
| CollectionAssert.AreEquivalent(col1.GetValues(0), key1values); |
| CollectionAssert.AreEquivalent(col1.GetValues("key1"), key1values); |
Но, оказывается метод HttpWebResponse.Headers.GetValue(string) работает иначе.
| int index = Array.IndexOf(res.Headers.AllKeys, "Set-Cookie"); |
| var values1 = res.Headers.GetValues(index); |
| // [0]: "cname=5; expires=Tue, 13-Apr-2010 23:43:04 GMT; path=/; domain=.getvaluetest.ru" |
| // [1]: "cvalue=5; expires=Tue, 13-Apr-2010 23:43:04 GMT; path=/; domain=.getvaluetest.ru" |
| var values2 = res.Headers.GetValues("Set-Cookie"); |
| // [0]: "cname=5; expires=Tue" |
| // [1]: "13-Apr-2010 23:43:04 GMT; path=/; domain=.getvaluetest.ru" |
| // [2]: "cvalue=5; expires=Tue" |
| // [3]: "13-Apr-2010 23:43:04 GMT; path=/; domain=.getvaluetest.ru" |
Причина находится в методе WebHeaderCollection.GetValue(string), где происходит нарезка строки на части по каждой запятой. Поэтому получается неожиданный результат.
Комментариев нет:
Отправить комментарий