C#HttpWebRequestとWebRequest


112

私はこのコードを見ました:

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

なぜキャストする必要があるの(HttpWebRequest)ですか?なぜ使用しないのHttpWebRequest.Createですか?そしてなぜをHttpWebRequest.Create作るWebRequestHttpWebRequestですか?


回答:


134

Createこの方法は静的であり、かつ唯一の存在しますWebRequest。それを呼び出すHttpWebRequest.Createかもしれないルック異なるが、その実際に呼び出すまでコンパイルWebRequest.CreateHttpWebRequest継承のためにオンになっているように見えます。

Createこの方法は、内部、に基づいて、オブジェクトの実際の作成を行うためのファクトリパターンを使用してUri、あなたがそれに渡します。実際には、に応じて、FtpWebRequestまたはなどの他のオブジェクトを取得できます。FileWebRequestUri


3
これは正しいです。キャストせずにHttpWebRequest.CreateまたはHttpWebRequest.CreateHttpのようなものからHttpWebRequestを取得する方法があったら良かったでしょう。最初は、public new static HttpWebRequest Create(string url)のようなものです。どちらの方法でも、URLがHTTP(s)ではなかった場合は、InvalidArgumentExceptionをスローするだけです。
Matthew Flaschen、2009年

4
.NETクリエーターによる非常に奇妙なデザイン決定(私が間違っていると思いますか?)の非常に良い説明。
IJケネディ

2
@IJKennedy私は完全に同意します。非常に奇妙で非論理的で非現実的な設計上の決定です。
アイディアカピ

8
HttpWebRequest.CreateHttpは存在し、HttpWebRequestインスタンスを作成します。
Peter Meinl、2012年

4
@Bobson WebRequest.CreateHttp4.5に入っています
Mark

31

WebRequestCreate渡されたURLに応じて具象サブクラスのインスタンスを作成するファクトリメソッドを持つ抽象クラスです。HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);代わりに 必要かどうか WebRequest req = WebRequest.Create(strUrl);は、ニーズと、渡すURLの種類によって異なります。

HTTP:URLのみを渡す場合、前のコードではHttpWebRequest、基本クラスで定義されたものに加えて、サブクラスが実装するプロパティとメソッドにアクセスできますWebRequest。しかし、FTP:URLを渡した場合、へのキャストHttpWebRequestは失敗します。

後者は一般的であり、サポートされているURLのタイプで失敗することはありませんが、サブクラスにキャストしないと、基本クラスで定義されているプロパティとメソッドにしかアクセスできません。

-Martin Honnen経由


12

キャストは、HttpWebRequestに固有のメンバーにアクセスする必要がある場合にのみ必要です。WebRequestでサポートされているプロパティ/メソッドで十分であれば、多くのタイプの要求/応答プロトコルに対して機能するアプリケーションを作成できるという考え方です。この場合、URIは、プラグ可能なプロトコルでサポートされている任意のプロトコルを使用してユーザーが指定したものである可能性があります。元のソフトウェアを変更せずに、新しいプロトコルをサポートすることもできます。

アプリケーションで特定のプロトコルに固有の機能をさらに制御する必要がある場合は、requestUriをサポートされているスキームに制限し、WebRequestを適切なプロトコル固有のサブクラスにキャストできます。これにより、アプリケーションでサポートされるプロトコルが制限されますが、プロトコル固有の機能を調整できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.