2013-05-20 38 views
1

糾正我,如果我錯了我的想法。無法使用WebClient接收Cookie

據我所知,WebClient類的任何新實例都將啓動一個新的會話,並生成新的會話ID。

爲了防止出現這種情況,我應該從第一次使用中收到一個會話ID,然後將它傳遞給WebClients的所有新實例。 (「獲取」方法只可以添加到任何其他參數的要求)

從理論上講,是可以做到的,使用類,像這樣:

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添加到reqeust URI = someValue中,那也不會幫助。

我已經檢查了好幾次,並且任何時候我在Windows Phone中發送這樣的請求,響應都有不同且獨特的jsessionid。

但是,如果我在瀏覽器中寫入這樣的請求,則返回帶有正確的jsessionid的響應。


下面的代碼允許在Windows Phone的響應(都使用HttpWebRequest的,而不是Web客戶端)接收JSESSIONID值,但不解決問題:

     // 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); 
+0

您是否真的看到它在您使用POST時加載容器或者這是一個假設? –

+0

更新後的問題,顯然不是GET方法的問題。找到了接收jsessionid值的方法,但仍無法強制應用程序在單個會話中工作。有什麼想法嗎? – Olter

回答

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序列化有一個更優雅的解決方案,但我找不到它。