强制HttpWebRequest使用HTTP 1.0,并在Windows 8的PCL中设置UserAgent
本文关键字:PCL UserAgent 设置 Windows 并在 使用 HttpWebRequest HTTP 强制 | 更新日期: 2023-09-27 18:05:53
我已经在我的PCL中创建了一个类,以获得所需的会话id和登录到web服务器的密钥。(响应是XML,它在运行Login的第二种方法中解析)我对WebServer没有控制权,所以我需要在客户端解决我的问题。
This is my Task Method
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非常陌生,所以请原谅这对你来说是个愚蠢的问题。谢谢。
我通过切换到新的HttpClient (PCL)库并在那里设置Version属性解决了一个非常类似的问题。在NuGet上搜索"Microsoft HTTP Client Libraries"(今天是测试版,但工作得很好)。
我仍然不明白为什么我总是用1.0,只是偶尔(Win7和Win8)当使用1.1
信不信由你,当使用PCL时,是不可能改变UserAgent头的
阅读下面的评论:
微软于2013年2月25日下午4:05发布
遗憾的是,可移植库的设计一直只支持全局可用的属性——并且用户代理不能在所有平台上设置(例如,对于SilverLight)。
不幸的是,大多数受限制的头文件不是PCL,所以它不能在大多数平台上更改。
正如我在这个线程中看到的,改变这些受限头的唯一方法是使用反射。
var httpRequest = (HttpWebRequest) WebRequest.Create(uri);
var userAgent = httpRequest.GetType().GetProperty("UserAgent");
if(null != userAgent)
{
userAgent.SetValue(httpRequest, "Your value", null);
}
虽然,这远远不是理想的,因为即使它可能在某些平台上工作,在其他一些平台上你会得到一个类似的错误:
系统。InvalidOperationException: API System.Net.HttpWebRequest.set_UserAgent(System.String)'不能在当前平台上使用。
ThumbGen的答案可能是另一种选择,如果你的项目与支持的平台匹配,但我还没有尝试过。
如果您找不到user-agent属性,您可以尝试设置user-agent头。
SessiondIdRequest.Headers["User-Agent"] = @"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)";
您也可以尝试构造请求头,而不是使用提供的属性。
Key Value Request POST http://localhost/index.aspx HTTP/1.0 Content-Length *length*