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ındaarray(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.
_ "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
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
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