HttpRequest vs HttpRequestMessage vs HttpRequestBase

本文关键字:vs HttpRequestBase HttpRequestMessage HttpRequest | 更新日期: 2023-09-27 18:06:41

这些类在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的一个动作中处理的。我可以通过两种不同的方式到达客户端的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代替"?

HttpRequest vs HttpRequestMessage vs HttpRequestBase

HttpRequest作为GET-only属性存在于Page和UserControl类中。类似地,它自己的大多数属性也是仅限get的(见1)。. NET页面获取关于传入http请求的信息,例如读取客户端IP, cookie,查询字符串,诸如此类。重要的是,它是"旧"系统的一部分。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之外进行单元测试。净管道。