【问题标题】:Unable to receive cookie using WebClient无法使用 WebClient 接收 cookie
【发布时间】: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,这种方法存在两个问题。

  1. 我在保存的 CookieContainer 中看不到 jsessionid 值。
  2. 即使我将使用不同的方法(如下面的方法)接收此值,然后将此值作为 &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


【解决方案1】:

是的,所以如果可以使用所提供的方式接收 jsessionid 值,解决方案将是使用 HttpWebRequest 作为 ExtendedWebClient 以某种方式忽略 jsession 值。

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.CookieContainer = new CookieContainer();
            request.CookieContainer.Add(new Uri(url, UriKind.Absolute), StoredCookieCollection._CookieCollection);
            request.BeginGetResponse(new AsyncCallback(GetSomething), request);

           private void GetSomething(IAsyncResult asynchronousResult)
           {
              // do something
           }

           // where in url a jsession value is added to the request as &jsessionid=value

在 Windows Phone 中也不起作用的另一件事是,您不能如此轻松地序列化 CookieCollection 类型值。所以,我决定在IsolatedStorage设置中存储一个String类型的JSESSIONID值而不是它,并创建一个静态类StoredCookieCollection,它将在应用程序工作期间存储CookieCollection。

所以,当你收到一个 jsessionid 值时,它会以字符串的形式保存在设置中,并以 CookieCollection 的形式保存在静态类中:

using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult))
                                    {
                                        CookieCollection cookies = response.Cookies;
                                        StoredCookieCollection._CookieCollection = cookies;
                                        ...
                                    }

这种方法确实会强制应用在单个会话中运行。

也许,CookieCollection 序列化有更优雅的解决方案,但我找不到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2021-08-08
    • 2019-06-21
    相关资源
    最近更新 更多