我正在开发一个跨平台的应用程序,目标是windows phone8、windows 8、android和Ios。该应用程序需要从互联网上获取一些数据并相应地重用这些数据。所以我有一个项目,里面只有几个类。一个类注册到网站,并获得所需的曲奇供进一步使用。下面是这个类的代码:-
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 8项目中使用这段代码时,每当我调用httpClientget异步时,它的行为就好像我没有传递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;
}这个问题已经调查了几个小时,并且测试了我在这里和网上找到的每一个可能的提示,但是都没有用。布斯!cookies不是HtmlOnly,也不安全。真正让我困惑的是,如果我在一个windows 8项目中使用相同的代码,它的工作原理是完美的,但在windows 8项目中却不是这样。值得注意的是,我正在使用最新的BCL system.net.http库。
任何帮助和建议都是非常欢迎的。
发布于 2014-03-04 23:13:20
我只想回答这个问题,这个问题可能会困扰世界各地的其他开发者。
首先,我要感谢TheESJ带领我走向正确的方向。
现在让我们从我修改/添加到代码中的内容开始,以解决这个问题。
我刚在初始POST方法中添加了以下代码行:
var wwwUri = new Uri("https://www.mywebsite.com");
Cookiejar.SetCookies(baseUri, Cookiejar.GetCookieHeader(wwwUri));在Windows Phone中似乎有“.”在cookie头(下面的描述)中,上面的代码将使用正确的标头复制cookie。
在我将上述代码行和CookieContainer应用于调试器之前,尽管域属性值为“mywebsite.com”而没有“.”,但它有一个值为{.mywebsite.com,System.Net.PathList}的项,而在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}。
https://stackoverflow.com/questions/22134514
复制相似问题