【问题标题】:HttpWebRequest and Set-Cookie header in response not parsed (WP7)未解析响应中的 HttpWebRequest 和 Set-Cookie 标头(WP7)
【发布时间】:2010-11-22 18:08:42
【问题描述】:

我正在尝试获取标头“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 标头。

对可能出现的问题有什么建议吗?

【问题讨论】:

  • 我在 WP7 上的 HttpWebResponses 中似乎也缺少“Set-Cookie”标头。

标签: c# windows-phone-7 cookies httpwebrequest httpwebresponse


【解决方案1】:

尝试显式传递一个新的 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);

【讨论】:

  • 你能帮帮我吗? GetData() 是什么函数? (在你的最后一行)
  • GetData 在这种情况下是一个虚拟函数 - 您可以创建自己的回调。
【解决方案2】:

您正在接收 HttpOnly cookie:

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

出于安全原因,无法通过代码访问这些 cookie,但您仍然可以在下次调用 HttpWebRequest 时使用它们。更多信息在这里:Reading HttpOnly Cookies from Headers of HttpWebResponse in Windows Phone

使用 WP7.1,我在阅读非 HttpOnly cookie 时也遇到了问题。我发现如果 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() 方法工作。

【讨论】:

    【解决方案3】:

    cookie 是 httponly 的吗?如果是这样,您将无法看到它,但如果您对第二个请求使用相同的 CookieContainer,则请求将包含 cookie,即使您的程序将无法看到它。

    【讨论】:

    • 不。不正确。
    【解决方案4】:

    您必须直接编辑标题集合。像这样的:

    request.Headers["Set-Cookie"] = "name=value";
    
    request.BeginGetResponse(myCallback, request);
    

    【讨论】:

    • 如果您的意思是在请求之前将标头设置为某些内容,我尝试这样做无济于事。
    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2022-01-23
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多