我在我的 PCL 中创建了一个类来获取所需的 Session-Id 和一个用于登录网络服务器的密钥。(响应是 XML,在运行登录的第二种方法中解析)我无法控制 WebServer,所以我需要在客户端解决我的问题。
这是我的任务方法:
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 的属性,因此我无法告诉方法强制它(因为它只是一个子集)。
有什么办法可以解决这个问题(除了将整个方法复制到我的 Win8 项目中,我可以在其中设置这些属性)。
我对 MVVM 和 PCL 很陌生,所以请原谅这对你来说是一个愚蠢的问题。谢谢。