首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Httpclinet get异步重置cookie

Httpclinet get异步重置cookie
EN

Stack Overflow用户
提问于 2014-03-02 22:29:25
回答 1查看 1K关注 0票数 0

我正在开发一个跨平台的应用程序,目标是windows phone8、windows 8、android和Ios。该应用程序需要从互联网上获取一些数据并相应地重用这些数据。所以我有一个项目,里面只有几个类。一个类注册到网站,并获得所需的曲奇供进一步使用。下面是这个类的代码:-

代码语言:javascript
复制
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类的代码:-

代码语言:javascript
复制
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库。

任何帮助和建议都是非常欢迎的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-04 23:13:20

我只想回答这个问题,这个问题可能会困扰世界各地的其他开发者。

首先,我要感谢TheESJ带领我走向正确的方向。

现在让我们从我修改/添加到代码中的内容开始,以解决这个问题。

我刚在初始POST方法中添加了以下代码行:

代码语言:javascript
复制
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}。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22134514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档