HttpRequest与HttpRequestMessage与HttpRequestBase

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

下面的代码返回一个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"]永远不会为空?

或者认为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不能保证正常工作,因为缺less一些Ajax请求,我们应该使用HttpRequestMessage”?

HttpRequest作为GET-only属性出现在Page和UserControl类上。 类似地,它的大多数属性也是GET-only(参见1 )。 这个类被ASP.NET页面用来获取有关传入http请求的信息,例如读取客户端IP,cookies,查询string,whatnot。 重要的是,它是“旧”System.Web程序集的一部分,自.NET 1.1以来一直存在

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

在HttpRequestBase和HttpRequestWrapper上,我能做的只是引用文档

HttpRequestWrapper类派生自HttpRequestBase类,并充当HttpRequest类的包装器。 这个类公开了HttpRequest类的function并公开了HttpRequestBasetypes。 HttpRequestBase类使您能够使用自定义实现replace应用程序中的HttpRequest类的原始实现,例如在ASP.NETpipe道之外执行unit testing时。