【问题标题】:HttpRequest vs HttpRequestMessage vs HttpRequestBaseHttpRequest vs HttpRequestMessage vs HttpRequestBase
【发布时间】:2013-03-21 01:16:35
【问题描述】:

ASP.NET 中的这些类之间有什么区别?我发现这些类之间没有继承关系。

下面的代码返回一个HttpRequestWrapper的实例is aHttpRequestBasehas aHttpRequest

HttpRequestMessage request = ...;
HttpRequestBase reqBase = (request.Properties["MS_HttpContext"] as HttpContextWrapper).Request;
// do somthing with reqBase.Cookies

微软似乎想在从 HttpRequestMessage 获取 cookie 时惹恼我们。

是否保证request.Properties["MS_HttpContext"] 永远不会为空?

或者认为ajax请求是在ApiController的一个action中处理的。我可以通过两种不同的方式访问客户端的 IP。

var ip = (request.Properties["MS_HttpContext"] as HttpContextWrapper).Request.UserHostAddress

var ip = HttpContext.Current.Request.UserHostAddress

这两者有什么区别?

或者一般来说,我可以以不同的方式访问相同的请求/响应数据,例如 Cookie、标头、请求者信息等。什么时候用哪个?我们可以说“如果是ajax请求,由于缺少某些东西,因此无法保证HttpRequest正常工作,因此对于ajax请求,我们应该改用HttpRequestMessage”?

【问题讨论】:

    标签: c# asp.net asp.net-mvc httprequest


    【解决方案1】:

    HttpRequest 存在于 PageUserControl 类中,作为 GET-only 属性。同样,它自己的大部分属性也是 GET-only(参见1)。 ASP.NET 页面使用此类来获取有关传入 http 请求的信息,例如读取客户端 IP、cookies、查询字符串等。重要的是,它是“旧” System.Web 程序集的一部分,该程序集自 .NET 1.1 起就存在

    另一方面,HttpRequestMessage 在 .NET 4.5 中是新的。它是System.Net 的一部分。客户端和服务都可以使用它通过 HTTP 创建、发送和接收请求和响应。它取代了在 .NET 4.5 中已过时的 HttpWebRequest

    在 HttpRequestBase 和 HttpRequestWrapper 上,我能做的最好的就是引用 docs

    HttpRequestWrapper 类派生自 HttpRequestBase 类 并用作 HttpRequest 类的包装器。这个类暴露 HttpRequest 类的功能并公开 HttpRequestBase 类型。 HttpRequestBase 类使您能够替换 您的 HttpRequest 类的原始实现 具有自定义实现的应用程序,例如当您执行 在 ASP.NET 管道之外进行单元测试。

    【讨论】:

    • 关于 HttpRequest 和 HttpRequestBase 的附加信息:HttpRequestBase 上的大多数方法都是虚拟的,这使得该类型在单元测试的上下文中易于模拟和存根。
    • 你能找到关于 HttpWebRequest 已过时的任何官方参考吗?我只看到构造函数被列为过时,文档指向使用 WebRequest.Create
    • @NStuke 不是真的,但这似乎是共识:stackoverflow.com/questions/18203835/…
    • @Filip - 有趣的是,查看反编译代码表明 HttpClient 仍在使用 HttpWebRequest。
    猜你喜欢
    • 2013-04-22
    • 2013-02-22
    • 2010-11-29
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2014-08-17
    • 2011-09-18
    相关资源
    最近更新 更多