2009-06-04 173 views
39

如何在不使用默認代理的情況下在WCF客戶端上以編程方式設置HTTP代理?如何在WCF客戶端服務代理上設置HTTP代理(WebProxy)?

代理,代理,代理。

根據開發的WCF模型,我通過在服務的WSDL上運行svcutil.exe來生成客戶端「代理」 類。 (這也是 生成一個客戶端配置文件)。

在我的代碼中,我新建了一個該類的實例,我可以連接到 服務。非常好。

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

我們稱之爲代理類,但有另一個代理 - http代理。這 服務正在使用wsHttpBinding basicHttpBinding,因此它正在通過http。現在,假設我想通過 一個http代理(由.NET BCL中的System.Net.WebProxy建模)將客戶端連接到Web服務。我知道 來自於我閱讀.NET和WCF文檔的豐富經驗,如果沒有指示WCF運行時,WCF運行時將在通過http/https進行通信時使用默認的 系統代理。

我可以設置在命令行中 的WinXP/2003 with ProxyCfg.exe as described here,並在以後 版本的Windows with netsh.exe as described here的。

我還可以通過設置System.Net.WebRequest.DefaultWebProxy property來指定應用程序 內使用的默認Web代理。

但是,假設我想通過與系統範圍代理 不同的代理進行連接?例如,可能沒有系統範圍的代理服務器,但我需要特別爲Web服務使用一個代理服務器。或者也許有 一個系統級的代理,但我需要使用一個不同的,爲網絡 服務。事實上,也許有多個Web服務客戶端,並且每個人都應該獲得不同的代理服務器。

如何設置每個綁定的代理?

在ASMX模型,我可以這樣做:

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

但是,這是不可能的WCF; WCF生成的客戶端代理 類不公開Proxy屬性。如何設置http代理,每個客戶端代理以及如何在http代理上設置身份驗證?

相關:
- how-to-set-proxy-with-credentials-to-generated-wcf-client

回答

21

的代理服務器設置綁定配置的一部分。例如,查看BasicHTTPBindingWSHttpBinding類/配置元素的ProxyAddress屬性。

看起來你要在app.config文件中留下你的端點配置,在這種情況下,你應該能夠在那裏設置地址。

42

WCF代理上沒有Proxy屬性是有道理的,因爲並非所有WCF代理都使用HTTP進行通信。進一步審查後,我發現可以通過編程方式在WCF中設置代理,如果WCF代理使用HTTP綁定。我在這裏記錄它以防別人需要它。要設置HTTP代理代碼爲WCF客戶端,這樣做:

// 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"); 
+0

+1用於鑄造BasicHttpBinding – Lijo 2012-11-28 09:46:19

17

我有類似的問題,但我也需要使用代理的用戶名和密碼,這與用於訪問服務的用戶名和密碼不同。

我試着通過UriBuilder構建它,它將輸出代理地址爲「http://username:[email protected]/」。不幸的是,我使用的特定代理沒有使用這種技術。

我在廣泛的谷歌搜索後發現的是,您可以通過WebRequest.DefaultProxy(靜態屬性)更改代理。

例如:

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

是的。當然,如果你這樣做,你必須設置UseDefaultWebProxy = true。 我認爲還有一種方法可以在每個客戶端綁定的基礎上執行此操作。如果b是一個System.ServiceModel.BasicHttpBinding,則需要將b.Security.Transport.ProxyCredentialType設置爲您的代理所需的任何內容。枚舉是HttpProxyCredentialType,可能的值是{None,Basic,Digest,Ntlm,Windows}。看到這個帖子的提示: http://kennyw.com/indigo/106 – Cheeso 2009-06-26 18:18:33

2

你也可以試試這個:

編程得到任何綁定,您正在使用,然後設置代理就可以直接例如

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

其中"WSDualHttpBinding_IMainService"是您的配置文件中的綁定名稱。 你也必須設置UseDefaultWebProxy=false;否則您的代理將被忽略。