强制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非常陌生,所以请原谅这对你来说是个愚蠢的问题。谢谢。

强制HttpWebRequest使用HTTP 1.0,并在Windows 8的PCL中设置UserAgent

我通过切换到新的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*