HttpWebRequest и заголовок Set-Cookie в ответе не проанализированы (WP7)

Я пытаюсь получить заголовок «Set-Cookie» или получить доступ к контейнеру cookie, но заголовок Set-Cookie недоступен. Файл cookie находится в заголовке ответа, но его нет в объекте запроса клиента. Я регистрирую стек ClientHttp, используя

bool httpResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

Вот ответ:

HTTP/1.1 200 OK
Content-Type: application/xml; charset=utf-8
Connection: keep-alive
Status: 200
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.0.pre4
ETag: "39030a9c5a45a24e485e4d2fb06c6389"
Client-Version: 312, 105, 0, 0
X-Runtime: 44
Content-Length: 1232
Set-Cookie: _CWFServer_session=[This is the session data]; path=/; HttpOnly
Cache-Control: private, max-age=0, must-revalidate
Server: nginx/0.7.67 + Phusion Passenger 3.0.0.pre4 (mod_rails/mod_rack)

<?xml version="1.0" encoding="UTF-8"?>
<user>
...
</user>

Мой код обратного вызова содержит что-то вроде:

var webRequest = (HttpWebRequest)result.AsyncState;
raw = webRequest.EndGetResponse(result) as HttpWebResponse;
foreach (Cookie c in webRequest.CookieContainer.GetCookies(webRequest.RequestUri))
{
    Console.WriteLine("Cookie['" + c.Name + "']: " + c.Value);
}

Я также пытался просмотреть заголовки, но заголовок Set-Cookie также отсутствует в ответе.

Любые предложения о том, что может быть проблемой?


person Brent Dunham    schedule 22.11.2010    source источник
comment
Заголовок Set-Cookie, похоже, отсутствует и в моих ответах HttpWebResponse на WP7.   -  person Curyous    schedule 25.05.2011


Ответы (4)


Попробуйте явно передать новый CookieContainer:

CookieContainer container = new CookieContainer();
container.Add(new Uri("http://yoursite"), new Cookie("name", "value"));
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://yoursite");
request.CookieContainer = container;
request.BeginGetResponse(new AsyncCallback(GetData), request);
person Den Delimarsky    schedule 22.11.2010
comment
Можешь мне помочь? Что такое функция GetData()? (в вашей последней строке) - person Hoàng Vũ Tgtt; 02.12.2015
comment
GetData в этом случае является фиктивной функцией — вы можете просто создать свой собственный обратный вызов. - person Den Delimarsky; 02.12.2015

Вы получаете файлы cookie HttpOnly:

Set-Cookie: _CWFServer_session=[This is the session data]; path=/; HttpOnly 

Из соображений безопасности к этим файлам cookie нельзя получить доступ из кода, но вы по-прежнему можете использовать их при следующих вызовах HttpWebRequest. Подробнее об этом здесь: Чтение файлов cookie HttpOnly из заголовков HttpWebResponse в Windows Phone

С WP7.1 у меня также были проблемы с чтением файлов cookie, отличных от HttpOnly. Я обнаружил, что они недоступны, если ответ HttpWebRequest исходит из кеша. Создание уникального запроса со случайным числом решило проблему с кешем:

// The Request
Random random = new Random();  
// UniqueQuery is used to defeat the cache system that destroys the cookie.
_uniqueQuery = "http://my-site.somewhere?someparameters=XXX"
       + ";test="+ random.Next();

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_uniqueQuery);
request.BeginGetResponse(Response_Completed, request);

Получив ответ, вы можете получить файл cookie из заголовков ответа:

void Response_Completed(IAsyncResult result)
{
    HttpWebRequest request = (HttpWebRequest)result.AsyncState;
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
    String header = response.Headers["Set-Cookie"]; 

Мне так и не удалось заставить работать метод CookieContainer.GetCookies().

person Berthier Lemieux    schedule 13.04.2012

Является ли файл cookie только http? Если это так, вы не сможете его увидеть, но если вы используете тот же CookieContainer для своего второго запроса, запрос будет содержать файл cookie, даже если ваша программа не сможет его увидеть.

person Curyous    schedule 25.05.2011
comment
Неа. Не правда. - person IvanP; 20.11.2020

Вы должны редактировать коллекцию заголовков напрямую. Что-то вроде этого:

request.Headers["Set-Cookie"] = "name=value";

request.BeginGetResponse(myCallback, request);
person Matt Lacey    schedule 22.11.2010
comment
Если вы имели в виду установку заголовка на что-то перед запросом, я пробовал это безрезультатно. - person Brent Dunham; 22.11.2010