2014-03-02 46 views
0

我正在開發一款針對windows phone8,windows 8,android和ios的跨平臺應用程序。該應用程序需要從互聯網上獲取一些數據並相應地重用數據。所以我有一個內部幾個類的項目。一個類登錄到網站並獲取所需的cookies以備後用。以下是此課程的代碼: -Httpclinet getasync重置Cookie

public static CookieContainer Cookiejar { get; private set; } 

    public static async Task<CookieContainer> GetCookies() 
    { 
     var uri = new Uri("https://mywebsite.com"); 
     Cookiejar = new CookieContainer(); 
     var handler = new HttpClientHandler 
     { 
      CookieContainer = Cookiejar, 
      UseCookies = true, 
      UseDefaultCredentials = false 
     }; 
     var client = new HttpClient(handler); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded")); 
     HttpContent content = new FormUrlEncodedContent(new[] 
     { 
      new KeyValuePair<string,string>("username","user"), 
      new KeyValuePair<string,string>("password","user1234"), 
      new KeyValuePair<string,string>("customer","AAAA"), 
      new KeyValuePair<string,string>("doLogin","Logga+in"), 
      new KeyValuePair<string,string>("language","se") 
     }); 
     await client.PostAsync(uri, content); 
     return Cookiejar; 
    } 

另一個類用於獲取實際數據。我將CookieContainer從具有CookieHandler作爲名稱的第一個類傳遞給另一個具有DataHandler作爲名稱的類。我面臨的問題是,當我在windows phone 8項目中使用這段代碼時,每當我調用httpclient getasync時,它的行爲就好像我沒有通過cookie並將其重置爲xxxxx,並且響應將只是登錄頁面而不是我想要的頁面。下面是的DataHandler類的代碼: -

public string Response { get; private set; } 

    public async Task<string> GetResponse(Uri uri) 
    { 
     HttpClientHandler handler = new HttpClientHandler(); 
     handler.UseCookies = true; 
     handler.CookieContainer = CookieHandler.Cookiejar; 
     HttpClient client = new HttpClient(handler); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xhtml+xml")); 
     var response = await client.GetAsync(uri); 
     string webresponse = null; 
     if (response.IsSuccessStatusCode) 
     { 
      var resp = response.Content.ReadAsByteArrayAsync().Result; 
      Encoding encode = Encoding.GetEncoding("iso-8859-1"); 
      var respString = encode.GetString(resp, 0, resp.Length - 1); 
      webresponse = respString; 
     } 
     handler.Dispose(); 
     client.Dispose(); 
     response.Dispose(); 
     return Response = webresponse; 
    } 

在尋找這個問題的幾個小時,現在和測試,我發現這裏和在網絡上每一個可能的提示,但是沒有什麼工作。 OBS!這些cookies不是HtmlOnly,也不安全。真正讓我困惑的是,如果我在Windows 8項目中使用完全相同的代碼,它完全可以工作,但不能在Windows Phone 8項目中使用。值得注意的是我正在使用最新的BCL system.net.http庫。

任何幫助和建議都是值得歡迎的。

+1

首先檢查發送GET時CookieContainer的內容。你的repro沒有提到第二個Uri是什麼,但是你可能會碰到這個bug:http://stackoverflow.com/questions/19819943/httpclient-pcl-cookies-not-being-applied-to-requests – TheESJ

+0

謝謝你你在這裏的幫助和電子郵件。我回答了你的郵件。如果其他人面臨問題並需要一些幫助,將會發布問題的答案。 – DreamNet

+0

如果您在應用程序啓動時創建一個HttpClient實例併爲每個請求重新使用相同的實例,那麼您的生活將變得更加簡單。作爲額外的獎勵,您的應用程序可以更好地執行,因爲它可以重新使用池中的TCP/IP連接。 –

回答

0

只是想回答這個問題,這可能會打擾世界各地的其他開發人員。

首先我要感謝TheESJ爲我帶來正確的方向。

現在讓我們開始更改/添加到我的代碼來解決此問題。

我剛添加以下代碼行我最初的POST方法: -

var wwwUri = new Uri("https://www.mywebsite.com"); 
Cookiejar.SetCookies(baseUri, Cookiejar.GetCookieHeader(wwwUri)); 

看來,Windows Phone的存在 ''在cookie頭文件(下面的描述)中,上面的代碼將使用正確的頭文件複製您的cookie。

在我將以上代碼行和CookieContainer應用於調試器並查看m_domainTable之前,它有一個值爲{[.mywebsite.com,System.Net.PathList]}的項,儘管域屬性值爲'mywebsite .com'沒有'。',而在Windows商店應用程序中,它有一個值爲{[mywebsite.com,System.Net.PathList]}的項目,而域屬性值爲'mywebsite.com'。

我應用了上述代碼後,我調試了並檢查CookieContainer,m_domainTable現在有兩個項目,其中一個值爲{[.mywebsite.com,System.Net.PathList]},屬性值爲'mywebsite.com',另一個值爲{[mywebsite.com,System.Net.PathList]}和相同的域屬性值。這就是爲什麼它正在發送正確的cookie,因爲它正在發送第二個cookie {[mywebsite.com,System.Net.PathList]}。