2013-01-01 29 views
12

GET ve POST isteklerini HttpWebRequest/HttpWebResponse kullanarak yapan temel bir sınıfa sahibim.Çerezler Windows Phone uygulamasında gönderilmez, ancak çerezler aynı kodla birlikte gönderilir Windows 8 uygulaması

Sınıfıma bir API'ye giriş yapmak ve ardından veri istemek için kullanıyorum. Bir Windows 8 "Metro" uygulamasında, tam olarak beklendiği gibi çalışır. Bir Windows Phone 8 uygulamasında, giriş başarılı olmak için görünür, ancak sonraki veri isteğinde, hiçbir çerez gönderilmez ve istemci oturum açmamış gibi sunucu yanıt verir.

İşte bu sınıf, aynı istekleri başlatmak için

class Class1 
    { 
     CookieContainer cookieJar = new CookieContainer(); 
     CookieCollection responseCookies = new CookieCollection(); 

     public async Task<string> httpRequest(HttpWebRequest request) 
     { 
      string received; 

      using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null))) 
      { 
       using (var responseStream = response.GetResponseStream()) 
       { 
        using (var sr = new StreamReader(responseStream)) 
        { 
         cookieJar = request.CookieContainer; 
         responseCookies = response.Cookies; 
         received = await sr.ReadToEndAsync(); 
        } 
       } 
      } 

      return received; 
     } 

     public async Task<string> get(string path) 
     { 
      var request = WebRequest.Create(new Uri(path)) as HttpWebRequest; 
      request.CookieContainer = cookieJar; 

      return await httpRequest(request); 
     } 

     public async Task<string> post(string path, string postdata) 
     { 
      var request = WebRequest.Create(new Uri(path)) as HttpWebRequest; 
      request.Method = "POST"; 
      request.CookieContainer = cookieJar; 

      byte[] data = Encoding.UTF8.GetBytes(postdata); 
      using (var requestStream = await Task<Stream>.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null)) 
      { 
       await requestStream.WriteAsync(data, 0, data.Length); 
      } 

      return await httpRequest(request); 
     } 
    } 

ve kod: kod Windows 8 uygulaması ve Windows Phone uygulamasında kullanılan

var n = new Class1(); 
    await n.post("https://mydomain.com/api/login/", "username=myusername&password=mypassword"); 
    await n.get("https://mydomain.com/reader/feeds/"); 

tuhaf şey olduğunu ben "www ile alan adı öneki varsa ." Hem Windows Phone 8 uygulamasında hem de Windows 8 Metro uygulamasında çalışır.

Etki alanının nasıl ele alındığı ile ilgili bir şey olduğunu düşünüyorum. Çerezin alan adı ".mydomain.com" şeklindedir ve önek olmadan çerezin bu alana ait olmadığını düşünmelidir. Bazı aramalardan sonra a report of someone noticing a similar problem'u buldum.

Neyi anlamadığım, bunun Windows 8 uygulamasında Windows Phone uygulamasından farklı bir şekilde ele alınıp alınmadığını, böylece satır içi aynı kodun tek bir platformda çalıştığını, ancak başka bir bilgisayarda başarısız olduğunu anlıyor.


Biraz daha kazmaya çalıştım. C#

<?php 

if ($_REQUEST["what"] == "set") 
{ 
    setcookie("TestCookie",$_REQUEST["username"] . " " . $_REQUEST["password"], time()+3600*24, "/", "subd.mydomain.com"); 
} 

if ($_GET["what"] == "get") 
{ 
    var_dump($_COOKIE); 

Müşteri kodu:

Bunun için kullanılan sunucu kodu PHP İşte

var n = new ClassLibrary1.Class1(); 
      await n.get("http://subd.mydomain.com/?what=set&username=foo&password=bar"); 
      await n.get("http://subd.mydomain.com/?what=get"); 

sunucudan bir çerez yanıtı örneğidir

Set-Cookie: ARRAffinity=295612ca; Path=/;Domain=subd.mydomain.com 
Set-Cookie: TestCookie=foo+bar; expires=Fri, 04-Jan-2013 17:19:25 GMT; path=/; domain=subd.mydomain.com 

Windows 8 Mağaza/Metro uygulamasında, sonuç şu:

Windows Phone uygulamasında
array(2) { 
    ["ARRAffinity"]=> 
    string(8) "295612ca" 
    ["TestCookie"]=> 
    string(7) "foo bar" 
} 
, bu sonuç şudur: Onlar bu şekilde ayarlandığında

array(0){ 
} 

Windows Phone herhangi çerezleri görmez. Ben TestCookie set şeklini değiştirmek

, sunucudan sonucu artık şuna benzer:

Set-Cookie: ARRAffinity=295612ca;Path=/;Domain=subd.mydomain.com 
Set-Cookie: TestCookie=foo+bar; expires=Fri, 04-Jan-2013 17:29:59 GMT; path=/ 

TestCookie şimdi açıkça bir alan belirlemez, ARRAffinity değişmez.

Windows 8 Mağaza/Metro uygulaması artık bu döndürür:

ARRAffinity çerez gönderilmez
array(1) { 
    ["TestCookie"]=> 
    string(7) "foo bar" 
} 

açıkça bir etki alanı bildirir, çünkü:

array(2) { 
    ["TestCookie"]=> 
    string(7) "foo bar" 
    ["ARRAffinity"]=> 
    string(8) "295612ca" 
} 

Windows Phone 8 uygulaması, bu döndürür . Bazı kesme noktaları atamak ve isteğin CookieContainer işaretlerseniz

, ben, m_domainTable

+  [0] {[.subd.mydomain.com, System.Net.PathList]} System.Collections.Generic.KeyValuePair<string,System.Net.PathList> 
+  [1] {[subd.mydomain.com, System.Net.PathList]} System.Collections.Generic.KeyValuePair<string,System.Net.PathList> 

iki giriş gönderilmez çerez var .subd.mydomain.com konteynırdadır. çerez böyle kendini ilan etmesi halinde bu, 8.

Ancak hem Windows 8 ve Windows Phone aynıdır:

Set-Cookie: TestCookie=foo+bar; expires=Fri, 04-Jan-2013 17:19:25 GMT; path=/; domain=.mydomain.com 
Bu doğru benim orijinal olarak Windows Phone 8.

gönderilir

Bu durumda, mydomain.com veya www.mydomain.com aracılığıyla erişilip verilmediğine bakılmaksızın, sunucu çerezi aynı şekilde beyan eder; ".mydomain.com" olarak, ancak Windows Phone 8'in ".alanadim.com" için bir çerezin "alanim.com" adresine gönderilmesi gerektiğini düşünmüyor. Bu sorun, sunucu "subd.alanadim.com" alanını alan adı olarak koysa bile, önceki noktaya sahip olduğu kabul edilir ve kendi hatası olmadan çalışamaz. Doğru bir şekilde davranması için çerezle alan bilgisi göndermemesi gerektiği görünüyor.

+0

_ "Neyi anlamadığım, bunun Windows 8 uygulamasında Windows Phone uygulamasından farklı şekilde ele alınıp alınmadığını, böylece satır içi aynı kodun tek bir platformda çalıştığını, ancak başka bir bilgisayarda başarısız olduğunu." _ - temelde, kodunuzun _what_ yapmak istediğini, ancak bir anlamda _how_ 'ı ifade etmediğini söyledi. Çalışma zamanına bağlıdır ([WinRT] (http://msdn.microsoft.com/en-us/library/windows/apps/br211377.aspx) veya [CoreCRL] (http://blogs.msdn.com/b /dotnet/archive/2012/10/30/announcing-the-release-of-the-net-framework-for-windows-phone-8.aspx)) çerçeve çağrılarının nasıl yürütüleceği konusunda çalışıyor. – CodeCaster

+0

Ancak, yeniden üretilebilir bir test durumu oluşturabilirseniz (ideal olarak, sorunu tetikleyen çerezleri oluşturmak için bazı sunucu kodlarıyla birlikte), bunu yapmaktan çekinmeyin ve belki de bir kişi bir geçici çözüm önerebilir ve/veya MS ile bir hata yapabilir. – CodeCaster

+0

Daha fazla bilgi/kod ekledim. Bu çerçevede gerçekten bir hataysa, daha fazla insanın bununla karşılaşmadığından nasıl emin değilim. Çok fazla uygulamayı etkileyeceği görülüyor. – zi3guw

cevap

7

Bu bilinen bir sorun, is here geribildirim makalesidir.

Şu an çok fazla değil ama nispeten yakın zamanda dosyalandı. Bu hata için yalnızca oylamayı önerebilirim ve durumu için periyodik olarak tekrar kontrol edebilirim. Beklemeyi göze alamıyorsanız, daha hızlı bir izleme için Microsoft Destek'e başvurun.