C # HttpWebRequest 대 WebRequest


112

이 코드 조각을 보았습니다.

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

캐스트가 필요한 이유는 무엇 (HttpWebRequest)입니까? 왜 그냥 사용하지 HttpWebRequest.Create않습니까? 그리고 왜 HttpWebRequest.Createa WebRequest가 아니라 a를 만들 HttpWebRequest까요?


답변:


134

Create방법은 정적이며,에서만 존재한다 WebRequest. 그것을 호출하는 것은 HttpWebRequest.Create다르게 보일 수 있지만 실제로는 WebRequest.Create. 켜진 것 같습니다.HttpWebRequest상속 때문에 .

Create메서드는 내부적으로 팩토리 패턴을 사용하여 Uri전달한 개체를 기반으로 실제 개체 생성을 수행 합니다. 에 따라 a FtpWebRequest또는 같은 다른 개체를 실제로 다시 가져올 수 있습니다.FileWebRequestUri


3
맞습니다. 캐스팅하지 않고 HttpWebRequest.Create 또는 HttpWebRequest.CreateHttp와 같은 것에서 HttpWebRequest를 얻는 방법이 있다면 좋았을 것입니다. 첫 번째는 public new static HttpWebRequest Create (string url)과 같은 것입니다. 어느 쪽이든 URL이 HTTP가 아닌 경우에는 InvalidArgumentException을 발생시켜야합니다.
Matthew Flaschen

4
.NET 제작자의 매우 이상한 디자인 결정에 대한 아주 멋진 설명입니다.
IJ Kennedy

2
@IJKennedy 나는 매우 이상하고 비논리적이며 비실용적 인 디자인 결정에 완전히 동의합니다.
Aidiakapi 2011 년

8
HttpWebRequest.CreateHttp가 존재하며 HttpWebRequest 인스턴스를 생성합니다.
Peter Meinl

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.