ASP.NET中这些类之间有什么区别?正如我发现这些类之间没有继承关系。
下面的代码返回HttpRequestWrapper
is a
HttpRequestBase
和has a
HttpRequest
HttpRequestMessage request = ...;
HttpRequestBase reqBase = (request.Properties["MS_HttpContext"] as HttpContextWrapper).Request;
// do somthing with reqBase.Cookies
似乎微软希望在从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
这两者有什么区别?
或者一般来说,我可以以不同的方式访问相同的请求/响应数据,如Cookie,Header,Requestor Info等。什么时候用哪个?我们可以说“如果它是一个ajax请求,HttpRequest不能保证正常工作,因为缺少某些东西所以对于ajax请求我们应该使用HttpRequestMessage”吗?
答案 0 :(得分:41)
HttpRequest作为仅限GET的属性出现在Page和UserControl类中。同样,它自己的大多数属性也只是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上,我能做的最好就是引用docs
HttpRequestWrapper类派生自HttpRequestBase类 并充当HttpRequest类的包装器。这个课暴露出来 HttpRequest类的功能并公开了 HttpRequestBase类型。 HttpRequestBase类使您可以替换 你的HttpRequest类的原始实现 具有自定义实现的应用程序,例如执行时 在ASP.NET管道之外进行单元测试。