C#HttpWebRequest与WebRequest

我看到这段代码:

var request = (HttpWebRequest) WebRequest.Create("http://www.google.com"); 

为什么你需要投(HttpWebRequest) ? 为什么不只是使用HttpWebRequest.Create ? 为什么HttpWebRequest.Create使WebRequest而不是HttpWebRequest

Create方法是静态的,只存在于WebRequest 。 调用它作为HttpWebRequest.Create可能看起来不同,但其实际编译到调用WebRequest.Create 。 它只是因为inheritanceHttpWebRequest上。

内部的Create方法使用工厂模式来根据您传入的Uri来实际创build对象。 你实际上可以取回其他对象,如FtpWebRequestFileWebRequest ,这取决于Uri

WebRequest是一个抽象类,它有一个工厂方法Create ,根据传入的URL创build一个具体子类的实例。 无论你需要或希望HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl); 而不是WebRequest req = WebRequest.Create(strUrl); 取决于你的需求,以及你通过什么样的URL。

如果只传递HTTP:URL,那么前面的代码允许您访问HttpWebRequest的子类的属性和方法,以及在基类WebRequest上定义的属性和方法。 但是,如果您传递了FTP:URL,则转换为HttpWebRequest的尝试将失败。

后者是通用的,不会在所支持的任何types的URL上失败,当然,如果不转换到任何子类,只能访问基类定义的属性和方法。

– 通过Martin Honnen

只有当您需要访问HttpWebRequest特有的成员时才需要强制转换。 这个想法是,如果WebRequest支持的属性/方法是足够的,那么你可以编写一个应用程序来处理许多types的请求/响应协议。 在这种情况下,URI可以是用户使用可插入协议支持的任何协议给出的东西。 甚至可以在不改变原始软件的情况下支持新的协议。

如果您的应用程序需要对特定协议的特定function进行更多的控制,那么您可以将requestUri限制为支持的scheme,并将WebRequest强制转换为适当的协议特定的子类。 这限制了您的应用程序支持的协议,但是可以调整协议特定的function。