WCF 클라이언트 측 서비스 프록시에서 HTTP 프록시 (WebProxy)를 설정하려면 어떻게해야합니까?
문제
기본 프록시를 사용하지 않고 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
; 그렇지 않으면 프록시가 무시됩니다.