2009-05-22 9 views
101

대 나는이 코드 조각을 보았다C#을 HttpWebRequest WebRequest 클래스

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

을 왜 (HttpWebRequest) 캐스팅해야합니까? 왜 HttpWebRequest.Create을 사용하지 않는 것이 좋을까요? 그리고 HttpWebRequest.CreateWebRequest이 아닌 HttpWebRequest이되는 이유는 무엇입니까?

+0

관련 게시물 : http://stackoverflow.com/q/8209781/274502 – cregox

답변

130

Create 메서드는 정적이며 WebRequest에만 있습니다. HttpWebRequest.Create이라고하는 것은 다르게 보일 수도 있지만 실제로는 WebRequest.Create을 호출하여 컴파일됩니다. 상속 때문에 HttpWebRequest에만있는 것으로 보입니다.

내부적으로 Create 메서드는 팩터 리 패턴을 사용하여 객체를 실제로 생성합니다 (Uri 기준). 에 따라 FtpWebRequest 또는 FileWebRequest과 같은 다른 객체를 실제로 가져올 수 있습니다.

+3

이 말이 맞습니다. HttpWebRequest.Create 또는 HttpWebRequest.CreateHttp와 같은 것에서 HttpWebRequest를 가져 오는 방법이 있다면 캐스팅하지 않아도 좋을 것입니다. 첫 번째는 public static 새 HttpWebRequest Create (string url)와 같은 것입니다. 어느 쪽이든, URL이 HTTP가 아닌 경우에는 InvalidArgumentException을 던져야합니다. –

+4

아주 이상한 디자인 결정 (내가 잘못 말한 것)에 대한 아주 좋은 설명은. –

+2

@ I.J.Kennedy 나는 매우 이상하고 비논리적이며 실용적인 디자인 결정에 동의합니다. – Aidiakapi

27

WebRequest은 전달 된 URL에 따라 구체적인 하위 클래스의 인스턴스를 만드는 팩토리 메서드 Create을 가진 추상 클래스입니다. 당신이 필요하거나 HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl); 대신 WebRequest req = WebRequest.Create(strUrl); 의 사용자의 요구에 따라, 당신은 전달 된 URL의 종류에 것인지

만 HTTP에 전달하는 경우 :. URL의를 한 후 이전 코드가이 속성에 액세스 할 수 있으며 하위 클래스 HttpWebRequest이 기본 클래스 WebRequest에 정의 된 메소드 외에도 구현됩니다. 그러나 FTP : URL을 전달한 경우 HttpWebRequest으로 전송하려는 시도는 실패합니다.

후자는 일반적으로 지원되는 URL 유형 중 하나에서 실패하지 않지만 하위 클래스로 전송하지 않고 기본 클래스에서 정의하는 속성 및 메서드에만 액세스 할 수 있습니다.

은 - 당신이 HttpWebRequest를 고유 회원에 대한 액세스를 필요로 할 때 마틴 Honnen

10

를 통해 캐스트에만 필요합니다. WebRequest에서 지원되는 속성/메서드로 충분하다면 다양한 유형의 요청/응답 프로토콜에 대해 작동하는 응용 프로그램을 작성할 수 있습니다. 이 경우 URI는 플러그 가능한 프로토콜이 지원하는 프로토콜을 사용하여 사용자가 제공 할 수 있습니다. 원래의 소프트웨어를 변경하지 않고도 새로운 프로토콜을 지원할 수 있습니다.

응용 프로그램이 특정 프로토콜 관련 기능을 더 많이 제어해야하는 경우 requestUri을 지원되는 구성으로 제한하고 WebRequest를 적절한 프로토콜 관련 하위 클래스로 캐스팅 할 수 있습니다. 이렇게하면 응용 프로그램에서 지원하는 프로토콜이 제한되지만 프로토콜 별 기능을 조정할 수 있습니다.

관련 문제