【发布时间】:2013-05-14 21:47:51
【问题描述】:
如果我的想法有误,请纠正我。
据我了解,WebClient 类的任何新实例都会启动一个新会话,生成新的会话 ID。
为了防止这种情况,我应该从第一次使用中接收一个会话 id,然后将它传递给 WebClients 的所有新实例。 (对于“GET”方法,可以作为任何其他参数添加到请求中)
理论上,可以使用类来完成,如下所示:
public class ExtendedWebClient : WebClient
{
public CookieContainer CookieContainer { get; private set; }
[SecuritySafeCritical]
public ExtendedWebClient()
{
this.CookieContainer = new CookieContainer();
}
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
(request as HttpWebRequest).CookieContainer = this.CookieContainer;
return request;
}
}
但是,这不适用于 jsessionid cookie,这种方法存在两个问题。
- 我在保存的 CookieContainer 中看不到 jsessionid 值。
- 即使我将使用不同的方法(如下面的方法)接收此值,然后将此值作为 &jsessionid=someValue 添加到请求 uri,这也无济于事。李>
我检查了几次,每次我在 Windows Phone 中发送此类请求时,响应都有一个不同且唯一的 jsessionid。
但是,如果我在浏览器中编写这样的请求,响应会返回正确的 jsessionid。
以下代码允许在 Windows Phone 中从响应中接收 jsessionid 值(使用 HttpWebRequest 而不是 WebClient),但不能解决问题:
// working with some uri
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.CookieContainer = new CookieContainer();
request.BeginGetResponse(asynchronousResult =>
{
try
{
using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult))
{
CookieCollection cookies = response.Cookies;
foreach (Cookie c in cookies)
{
if (c.Name == "JSESSIONID")
// jsessionid value is here. Can be saved & stored somewhere
}
response.Close();
}
catch (Exception e)
{
// handling exception somehow
}
}
, request);
【问题讨论】:
-
您是否真的看到它在使用 POST 时加载容器或者这是一个假设?
-
更新问题,问题明显不在GET方法。找到了一种接收 jsessionid 值的方法,但仍然无法强制应用在单个会话中工作。有什么想法吗?
标签: c# windows-phone-7 webclient session-cookies jsessionid