HttpRequest vs HttpRequestMessage vs HttpRequestBase

Meh*_*taş 49 c# asp.net asp.net-mvc httprequest

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

下面的代码返回一个实例HttpRequestWrapper,其is a HttpRequestBasehas a HttpRequest

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

看起来微软希望在从HttpRequestMessage获取cookie时惹恼我们.

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

或者认为在ApiController的动作中处理ajax请求.我可以通过两种不同的方式达到客户端的IP.

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

var ip = HttpContext.Current.Request.UserHostAddress
Run Code Online (Sandbox Code Playgroud)

这两者有什么区别?

或者一般来说,我可以以不同的方式访问相同的请求/响应数据,例如Cookie,Header,Requestor Info等.什么时候用哪个?我们可以说"如果它是ajax请求,HttpRequest不能保证正常工作,因为缺少某些东西所以对于ajax请求我们应该使用HttpRequestMessage"吗?

Fil*_*lip 44

HttpRequest作为GET-only属性出现在PageUserControl类中.同样,它自己的大多数属性也只是GET(见1).ASP.NET页面使用此类来获取有关传入的http请求的信息,例如,读取客户端IP,cookie,查询字符串等等.重要的是,它是"旧"System.Web程序集的一部分,自.NET 1.1以来一直存在

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

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

HttpRequestWrapper类派生自HttpRequestBase类,并充当HttpRequest类的包装器.此类公开HttpRequest类的功能并公开HttpRequestBase类型.HttpRequestBase类使您可以使用自定义实现替换应用程序中HttpRequest类的原始实现,例如在ASP.NET管道外执行单元测试时.

  • 关于HttpRequest和HttpRequestBase的其他信息:HttpRequestBase上的大多数方法都是虚拟的,这使得类型易于在单元测试的上下文中进行模拟和存根. (3认同)