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对象。 你实际上可以取回其他对象,如FtpWebRequest
或FileWebRequest
,这取决于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。