Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpRequest vs HttpRequestMessage vs HttpRequestBase_C#_Asp.net_Asp.net Mvc_Httprequest - Fatal编程技术网

C# HttpRequest vs HttpRequestMessage vs HttpRequestBase

C# HttpRequest vs HttpRequestMessage vs HttpRequestBase,c#,asp.net,asp.net-mvc,httprequest,C#,Asp.net,Asp.net Mvc,Httprequest,ASP.NET中的这些类之间有什么区别?正如我发现的,这些类之间没有继承关系 下面的代码返回一个HttpRequestWrapper的实例,该实例是一个HttpRequestBase并且具有一个HttpRequest HttpRequestMessage request = ...; HttpRequestBase reqBase = (request.Properties["MS_HttpContext"] as HttpContextWrapper).Request; // do somth

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

下面的代码返回一个
HttpRequestWrapper
的实例,该实例
是一个
HttpRequestBase
并且
具有一个
HttpRequest

HttpRequestMessage request = ...;
HttpRequestBase reqBase = (request.Properties["MS_HttpContext"] as HttpContextWrapper).Request;
// do somthing with reqBase.Cookies
似乎微软想在从HttpRequestMessage获取cookies时惹恼我们

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

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

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

var ip = HttpContext.Current.Request.UserHostAddress
这两者有什么区别

或者通常,我可以以不同的方式访问相同的请求/响应数据,例如Cookie、头、请求者信息等。什么时候用哪个?我们可以这样说“如果是ajax请求,HttpRequest不能保证正常工作,因为缺少一些东西,所以对于ajax请求,我们应该使用HttpRequestMessage来代替”

作为GET only属性存在于和类中。类似地,它自己的大多数属性也是GET only(请参见)。ASP.NET页面使用此类获取有关传入http请求的信息,例如读取客户端IP、cookies、查询字符串等等。重要的是,它是“旧”System.Web assembly的一部分,自.NET1.1以来一直存在

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

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

HttpRequestWrapper类派生自HttpRequestBase类 并用作HttpRequest类的包装器。该类公开了 HttpRequest类的功能,并公开 HttpRequestBase类型。HttpRequestBase类允许您替换 您的应用程序中HttpRequest类的原始实现 具有自定义实现的应用程序,例如在执行 ASP.NET管道之外的单元测试


关于HttpRequest和HttpRequestBase的其他信息:HttpRequestBase上的大多数方法都是虚拟的,这使得该类型在单元测试上下文中易于模拟和存根。您能找到任何对HttpWebRequest的正式引用已过时吗?我只看到构造函数被列为过时,文档指向使用WebRequest.Createinstead@NStuke不是真的,但这似乎是一个共识:@Filip-有趣的是,查看反编译的代码,它表明HttpWebRequest仍在底层被HttpClient使用。