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), где происходит нарезка строки на части по каждой запятой. Поэтому получается неожиданный результат.
Комментариев нет:
Отправить комментарий