Заголовок HttpWebRequest и Set-Cookie в ответе не проанализирован (WP7) - PullRequest
5 голосов
/ 22 ноября 2010

Я пытаюсь получить заголовок "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);
}
* 1010также пытался просмотреть заголовки, но заголовок Set-Cookie также не присутствует в ответе.

Есть какие-либо предложения о том, в чем может быть проблема?

Ответы [ 4 ]

6 голосов
/ 23 ноября 2010

Попробуйте явно передать новый 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);
2 голосов
/ 13 апреля 2012

Вы получаете файлы 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 () работать.

0 голосов
/ 25 мая 2011

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

0 голосов
/ 22 ноября 2010

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

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

request.BeginGetResponse(myCallback, request);
...