我正在開發一款針對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庫。
任何幫助和建議都是值得歡迎的。
首先檢查發送GET時CookieContainer的內容。你的repro沒有提到第二個Uri是什麼,但是你可能會碰到這個bug:http://stackoverflow.com/questions/19819943/httpclient-pcl-cookies-not-being-applied-to-requests – TheESJ
謝謝你你在這裏的幫助和電子郵件。我回答了你的郵件。如果其他人面臨問題並需要一些幫助,將會發布問題的答案。 – DreamNet
如果您在應用程序啓動時創建一個HttpClient實例併爲每個請求重新使用相同的實例,那麼您的生活將變得更加簡單。作爲額外的獎勵,您的應用程序可以更好地執行,因爲它可以重新使用池中的TCP/IP連接。 –