HttpRequest、HttpWebRequest和WebRequest之间的区别

32

我想知道有没有人能够解释下列类的区别


两个相关的问题:https://dev59.com/xm855IYBdhLWcg3wPBtx 和 https://dev59.com/wHNA5IYBdhLWcg3wmfK5。这两个问题都有不同的答案,但对我来说,它们都没有回答主要问题。 - cregox
2个回答

45

它们有不同的作用。

WebRequestHttpWebRequest 的抽象基类 - 您不能直接使用它。它是其他 *Request 类(用于 FTP、文件和其他类型的网络请求)的基类。这些类都用于从网络获取资源(文件)。

还有一个 WebClient 类 - 可能是所有设计用于从互联网检索资源的 BCL 类中最简单的。

HttpRequest 表示对 ASP.NET 应用程序中资源的请求 - 这是 Request服务器端

主要区别在于,HttpWebRequest 是 HTTP 客户端,而 HttpRequest服务器端,用于在 ASP.NET Web 应用程序中使用。


2
为什么“你不能直接使用它”?我一直在使用它! - cregox
@Cawas - 你可以实例化 WebRequest 吗? - Oded
2
@Cawas - 返回的类型将不是 WebRequest 实例,而是继承类之一(比如 HttpWebRequestFtpWebRequest 等等)。 - Oded
1
我明白了...那么,如果这种方式更加动态,为什么我还要强制实例化其他继承类呢?只是为了代码设计吗?如果是这样的话,对我来说,这就是(无论如何)HttpWebRequestWebRequest之间差异的答案。 - cregox
1
WebClient 在底层使用 WebRequest。不错! - Gerard ONeill
显示剩余3条评论

10

HttpRequest,正如Oded already said,是完全不同的东西——它在服务器端生成HTTP请求,以便客户端(例如HttpWebRequest)可以读取它。

现在,在HttpWebRequestWebRequest之间,虽然一个只是继承自另一个,但实际上,在创建请求时使用http://时,没有任何区别。似乎这一切都只是代码设计的问题。

要使用WebRequest,我们需要Create,这将返回一个派生类。只要我们使用它的实例,它就会像一个包装器一样作用于派生类。这里是remark from the docs

WebRequest 是 .NET Framework 访问互联网数据的请求/响应模型的抽象基类。使用请求/响应模型的应用程序可以以协议不可知的方式从互联网请求数据,其中应用程序使用 WebRequest 类的实例,而协议特定的派生类执行请求的详细信息。

(...)

由于 WebRequest 类是一个抽象类,因此运行时 WebRequest 实例的实际行为由 Create 方法返回的派生类确定。有关默认值和异常的更多信息,请参阅后代类的文档,例如 HttpWebRequestFileWebRequest

免责声明

我只是现在才知道这个,因为在寻找答案(1小时前我还不知道)时,我从codeguru论坛MSDN文档备注中获得了这个答案,全都拜谷歌所赐:

HttpWebRequest类提供对WebRequest中定义的属性和方法的支持以及其他属性和方法,使用户能够直接使用HTTP与服务器进行交互。

备注继续说明(仅选择一些与差异有关的内容):

请勿使用HttpWebRequest构造函数。使用WebRequest.Create方法初始化新的HttpWebRequest对象。如果统一资源标识符(URI)的方案为http://或https://,则Create返回一个HttpWebRequest对象。GetResponse方法对RequestUri属性中指定的资源进行同步请求,并返回包含响应的HttpWebResponse。您可以使用BeginGetResponseEndGetResponse方法对资源进行异步请求。HttpWebRequest公开作为属性发送到Internet资源的常见HTTP头值、通过方法设置或由系统设置;

然后有一张表there,这里不引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接