WCF 클라이언트 측 서비스 프록시에서 HTTP 프록시 (WebProxy)를 설정하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/951523

  •  11-09-2019
  •  | 
  •  

문제

기본 프록시를 사용하지 않고 WCF 클라이언트에서 HTTP 프록시를 프로그래밍 방식으로 설정하려면 어떻게해야합니까?

프록시, 프록시, 프록시.

WCF 개발 모델에 따르면 서비스를 위해 WSDL에서 svcutil.exe를 실행하여 클라이언트 측 "프록시"클래스를 생성합니다. (이것은 또한 클라이언트 측 구성 파일을 생성합니다).

내 코드에서 나는 해당 클래스의 인스턴스를 새롭게하고 서비스에 연결할 수 있습니다. 아주 좋아요.

var svcProxy = new MyWebService();
svcProxy.GetInformation(request); 

우리는 이것을 프록시 클래스라고 부르지 만 또 다른 프록시 - HTTP 프록시가 있습니다. 이 서비스는 wshttpbinding basichttpbinding을 사용하고 있으므로 HTTP를 넘어갑니다. 이제 HTTP 프록시를 통해 클라이언트를 웹 서비스에 연결하고 싶다고 가정 해 봅시다 (.NET BCL의 System.Net.WebProxy로 모델링). .NET 및 WCF 문서를 읽는 광범위하고 유쾌한 경험을 통해 WCF 런타임은 지시받지 않으면 HTTP/HTTPS를 통신 할 때 기본 시스템 프록시를 사용한다는 것을 알고 있습니다.

WinXP / 2003의 명령 줄에서 설정할 수 있습니다. 여기에 설명 된대로 proxycfg.exe를 사용합니다, 및 이후의 Windows 버전에서 여기에 설명 된대로 Netsh.exe와 함께.

또한 응용 프로그램 내에서 사용할 기본 웹 프록시를 설정하여 System.net.webrequest.DefaultWebProxy 속성.

그러나 시스템 전체 프록시와 다른 프록시를 연결하고 싶다고 가정 해 봅시다. 예를 들어 시스템 전체의 프록시가 없지만 특히 웹 서비스에 하나를 사용해야합니다. 또는 시스템 전체의 프록시가있을 수도 있지만 웹 서비스에는 다른 프록시를 사용해야합니다. 그리고 실제로 여러 웹 서비스 클라이언트가있을 수 있으며 각 클라이언트는 다른 프록시를 받아야합니다.

프록시는 어떻게 결합 당 설정 될 수 있습니까?

ASMX 모델에서는 다음을 수행 할 수 있습니다.

var svcProxy = new MyWebService();
svcProxy.Proxy = new System.Net.WebProxy("http://proxyserver:1234", true);
svcProxy.GetInformation(request); 

그러나 이것은 WCF에서는 불가능합니다. WCF 생성 클라이언트 측 프록시 클래스는 프록시 속성을 노출시키지 않습니다. 클라이언트 측 프록시 당 HTTP 프록시를 어떻게 설정하고 HTTP 프록시에 대한 인증을 어떻게 설정합니까?

관련된:
- 신학 적-세트-세트-신용-생성 -WCF-client

도움이 되었습니까?

해결책

프록시 설정은 바인딩 구성의 일부입니다. 예를 들어, 근위 의 속성 Basichttpbinding 그리고 wshttpbinding 클래스/구성 요소.

app.config 파일에 엔드 포인트 구성을 남기고있는 것 같습니다.이 경우 주소를 설정할 수 있어야합니다.

다른 팁

WCF 프록시에는 프록시 속성이 없다는 것이 합리적입니다. 모든 WCF 프록시가 통신에 HTTP를 사용하는 것은 아니기 때문입니다. 추가 검토 후 WCF 프록시가 HTTP 바인딩을 사용하는 경우 프로그래밍 방식으로 WCF에서 프록시를 설정할 수 있음을 발견했습니다. 다른 사람이 필요로하는 경우 여기에서 문서화하고 있습니다. WCF 클라이언트의 코드로 HTTP 프록시를 설정하려면 다음을 수행하십시오.

// instantiate a proxy for the service
var svc= new ServiceClient();
// get the HTTP binding
var b = svc.Endpoint.Binding as System.ServiceModel.BasicHttpBinding;
b.ProxyAddress = new Uri("http://127.0.0.1:8888");
b.BypassProxyOnLocal = false;
b.UseDefaultWebProxy = false;

서버에 도달 할 위치 - 코드에서 엔드 포인트 주소를 설정하려면 다음과 같은 작업을 수행 할 수 있습니다.

var e = svc.Endpoint;
e.Address = new System.ServiceModel.EndpointAddress(
    "http://remoteserver:5555/WcfXmlElement");

비슷한 문제가 있었지만 서비스에 액세스하는 데 사용되는 사용자 이름 및 비밀번호와 다른 프록시의 사용자 이름과 비밀번호를 사용해야했습니다.

우리 부를 통해 빌드를 시도했는데,이를 대리 주소를 다음과 같이 출력했습니다.http : // username : password@myproxyserver/"불행히도, 내가 사용했던 특정 프록시는이 기술과 함께 작동하지 않았습니다.

광범위한 인터넷 검색 후에 찾은 것은 WebRequest.defaultProxy (정적 특성)를 통해 프록시를 변경할 수 있다는 것입니다.

예를 들어:

WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;

당신은 또한 이것을 시도 할 수 있습니다 :

프로그래밍 방식으로 사용하는 바인딩을 얻은 다음 직접 프록시를 설정하십시오.

var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService");
binding.ProxyAddress = new Uri("http://192.168.5.1:3128");

어디 "WSDualHttpBinding_IMainService" 구성 파일에서 바인딩의 이름입니다. 또한 설정해야합니다 UseDefaultWebProxy=false; 그렇지 않으면 프록시가 무시됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top