WindowsPhone应用中不发送Cookie,但Windows8应用中使用相同代码发送CookieI有一个使用HttpWebRequest/HttpWebResponse发出GET和POST请求的基类。我使用我的类登录API,然后请求数据。在Windows8“Metro”应用程序中,它完全按预期工作。在WindowsPhone8应用程序上,登录似乎是成功的,但在后续的数据请求中,没有发送cookie,服务器响应就好像客户端未登录一样。这是类,这个完全相同的代码用于Windows8应用程序和WindowsPhone应用程序:classClass1{CookieContainercookieJar=newCookieContainer();CookieCollectionresponseCookies=newCookieCollection();publicasyncTaskhttpRequest(HttpWebRequestrequest){收到字符串;使用(varresponse=(HttpWebResponse)(awaitTask.Factory.FromAsync(request.BeginGetResponse,request.EndGetResponse,null))){使用(varresponseStream=response.GetResponseStream()){使用(varsr=newStreamReader(responseStream))){cookieJar=request.CookieContainer;responseCookies=response.Cookies;received=awaitsr.ReadToEndAsync();}}}返回收到;}publicasyncTaskget(stringpath){varrequest=WebRequest.Create(newUri(path))asHttpWebRequest;request.CookieContainer=cookieJar;返回等待httpRequest(请求);}publicasyncTaskpost(stringpath,stringpostdata){varrequest=WebRequest.Create(newUri(path))asHttpWebRequest;request.Method="POST";请求.CookieContainer=cookieJar;byte[]data=Encoding.UTF8.GetBytes(postdata);使用(varrequestStream=awaitTask.Factory.FromAsync(request.BeginGetRequestStream,request.EndGetRequestStream,null)){awaitrequestStream.WriteAsync(data,0,data.Length);}returnawaithttpRequest(request);}}和发起请求的代码:varn=newClass1();awaitn.post("https://mydomain.com/api/login/","username=myusername&password=mypassword");等待n.get("https://mydomain.com/reader/feeds/");奇怪的是,如果我在域名前添加“www”,它适用于WindowsPhone8应用程序和Windows8Metro应用程序。我认为这与域的处理方式有关。cookie的域名是“.mydomain.com”,没有前缀,cookie必须被认为不属于该域。经过一番搜索,我发现有人注意到了类似的问题。我不明白为什么这在Windows8应用程序中的处理方式与在WindowsPhone应用程序中的处理方式不同,所以同一代码逐行在一个平台上运行但在另一个平台上失败。我做了一些深入的研究。我为此使用的服务器代码是用PHP编写的:"密码"],time()+3600*24,"/","subd.mydomain.com");}if($_GET["what"]=="get"){var_dump($_COOKIE);C#中的客户端代码:varn=newClassLibrary1.Class1();awaitn.get("http://subd.mydomain.com/?what=set&username=foo&password=bar");awaitn.get("http://subd.mydomain.com/?what=get");下面是服务器的cookie响应Set-Cookie的例子:ARRAffinity=295612ca;Path=/;Domain=subd.mydomain.comSet-Cookie:TestCookie=foo+bar;expires=2013年1月4日星期五17:19:25GMT;路径=/;domain=subd.mydomain.com在Windows8Store/Metro应用程序中,结果为:array(2){["ARRAffinity"]=>string(8)"295612ca"["TestCookie"]=>string(7)"foobar"}在WindowsPhone应用程序中,结果如下:array(0){}withthis当这样设置时,WindowsPhone看不到任何cookie。我更改了TestCookie的设置方式,现在服务器的结果如下所示:Set-Cookie:ARRAffinity=295612ca;Path=/;Domain=subd.mydomain.comSet-Cookie:TestCookie=foo+bar;expires=星期五,2013年1月4日17:29:59GMT;path=/TestCookie现在没有显式设置域,ARRAffinity没有变化。Windows8Store/Metro应用程序现在返回:array(2){["TestCookie"]=>string(7)"foobar"["ARRAffinity"]=>string(8)"295612ca"}WindowsPhone8应用程序返回以下:array(1){["TestCookie"]=>string(7)"foobar"}ARRAffinitycookie未发送,因为它明确说明了域。如果我分配一些断点并检查请求的CookieContainer,我在m_domainTable+[0]{[.subd.mydomain.com,System.Net.PathList]}System.Collections.Generic.KeyValuePair+[1]{[subd.mydomain.com,System.Net.PathList]}System.Collections.Generic.KeyValuePair未发送的cookie在.subd.mydomain.com容器中。它在Windows8和WindowsPhone8上都是一样的。但是如果cookie像这样声明自己:Set-Cookie:TestCookie=foo+bar;expires=2013年1月4日星期五17:19:25GMT;路径=/;domain=.mydomain.com可以在WindowsPhone8上正常发送。在我原来的情况下,无论是通过mydomain.com还是www.mydomain.com访问,服务器都以相同的方式声明cookie;为“.mydomain.com”,但WindowsPhone8似乎无法识别“.mydomain.com”。com”应该被发送到“mydomain.com”。这是有问题的,因为即使服务器将“subd.mydomain.com”作为域,它也被认为有前一点,而不是通过它自己的错。它没有'似乎必须将域信息与cookie一起发送才能使其正确处理。这是一个已知问题,反馈文章在这里。目前进展不大,但最近才承诺。我只能推荐对这个bug进行投票,定期查看状态,如果等不及,请联系微软支持,以便更快跟进以上是C#学习教程:WindowsPhone应用中不发送cookie,但发送cookie在Windows8应用程序中使用相同的代码发送所有分享的内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注~本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
