5

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

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 отсутствует в ответе.

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

+0

Заголовок «Set-Cookie», кажется, отсутствует в моих HttpWebResponses на WP7. – Curyous 2011-05-25 01:19:01

ответ

-1

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

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

request.BeginGetResponse(myCallback, request); 
+0

Если вы хотите настроить заголовок на что-то перед запросом, я попробовал это безрезультатно. – 2010-11-22 19:12:57

6

Попробуйте явно пропусканием новый 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); 
+0

Можете ли вы мне помочь? Какая функция GetData() есть? (в вашей последней строке) – 2015-12-02 18:44:42

0

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

2

Вы получаете HttpOnly печенье:

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

По соображениям безопасности, эти куки не могут быть доступны из кода, но вы все равно можете использовать их в последующих вызовах HttpWebRequest. Подробнее об этом здесь: Reading HttpOnly Cookies from Headers of HttpWebResponse in 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); 

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

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

мне никогда не удавалось получить CookieContainer .GetCookies() для работы.

Смежные вопросы