我在PCL中創建了一個類來獲取所需的Session-Id和一個用於登錄到Web服務器的密鑰。 (響應是XML,它在運行Login的第二個方法中解析)我無法控制WebServer,所以我需要在客戶端解決我的問題。強制HttpWebRequest使用HTTP 1.0並在PCL中爲Windows設置UserAgent 8
這是我的工作方法:
public static async Task<string> SessionId()
{
HttpWebRequest SessiondIdRequest = (HttpWebRequest)WebRequest.Create(Constants.SessionIdUrl);
SessiondIdRequest.Method = "POST";
SessiondIdRequest.Accept = "application/xml";
SessiondIdRequest.Headers[HttpRequestHeader.AcceptLanguage] = "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3";
SessiondIdRequest.ContentType = "application/x-www-form-urlencoded ";
string appIDviaPOST = "{Here is a String}";
byte[] byteArray = Encoding.UTF8.GetBytes(appIDviaPOST);
using (var SessionIdRequestStream = await Task<Stream>.Factory.FromAsync
(SessiondIdRequest.BeginGetRequestStream, SessiondIdRequest.EndGetRequestStream, SessiondIdRequest))
{
await SessionIdRequestStream.WriteAsync(byteArray, 0, byteArray.Length);
}
WebResponse SessionIdRequestResponse = await Task<WebResponse>.Factory.FromAsync
(SessiondIdRequest.BeginGetResponse, SessiondIdRequest.EndGetResponse, SessiondIdRequest);
var SessionIdRequestResponseStream = SessionIdRequestResponse.GetResponseStream();
var sr = new StreamReader(SessionIdRequestResponseStream);
string SessionIdResult = await sr.ReadToEndAsync();
return SessionIdResult;
}
任務工作得非常好於WP7 & WP8。當我在我的應用程序的Windows 8部分中使用此方法時,我得到了完全不同的結果。
我用Fiddler找出兩者之間的差異,我看到WP7 & 8使用HTTP 1.0併發送UserAgent,而Win8使用HTTP 1.1並且不發送UserAgent。
在PCL中,HttpWebRequest不包含UserAgent和ProtocolVersion的屬性,所以我無法告訴Method強制它(因爲它只是一個子集)。
有什麼辦法可以解決這個問題(除了將整個方法複製到我的Win8項目中,我可以設置這些屬性)。
我對MVVM和PCL很新,所以請稍微原諒它,這對你來說是一個愚蠢的問題。 謝謝。
我這樣做,它與雜項,而不是客戶端返回。另外,我認爲主要的問題是HTTP版本。非常感謝您的答案。 – MSicc 2013-03-25 06:08:12
沒有工作,我想出了另一種解決方案。將盡快發佈 – MSicc 2013-03-25 20:13:11
不幸的是,試圖使用'[「User-Agent」]來改變'Headers'導致這個問題:http://stackoverflow.com/q/239725/62921 – ForceMagic 2013-12-31 19:52:35