2009-06-04 19 views
39

डिफ़ॉल्ट प्रॉक्सी का उपयोग किए बिना, डब्लूसीएफ क्लाइंट पर, HTTP प्रॉक्सी प्रोग्रामेटिक रूप से कैसे सेट कर सकता हूं?मैं एक डब्ल्यूसीएफ क्लाइंट-साइड सेवा प्रॉक्सी पर HTTP प्रॉक्सी (WebProxy) कैसे सेट कर सकता हूं?

प्रॉक्सी, प्रॉक्सी, प्रॉक्सी।

विकास के डब्ल्यूसीएफ मॉडल के अनुसार, मैं सेवा के लिए डब्लूएसडीएल पर svcutil.exe चलाकर क्लाइंट-साइड "प्रॉक्सी" कक्षाएं उत्पन्न करता हूं। (यह भी क्लाइंट-साइड कॉन्फ़िगरेशन फ़ाइल बनाता है)।

मेरे कोड में मैं उस वर्ग का एक उदाहरण नया हूं और मैं सेवा से कनेक्ट कर सकता हूं। बहुत अच्छा।

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

हम इस चीज़ को प्रॉक्सी क्लास कहते हैं, लेकिन एक और प्रॉक्सी - http प्रॉक्सी है। यह सेवा wsHttp बाइंडिंग basicHttp बाइंडिंग का उपयोग कर रही है, इसलिए यह http से अधिक हो रही है। अब, मान लीजिए कि मैं ग्राहक को वेब सेवा पर पर एक HTTP प्रॉक्सी (.NET BCL में System.Net.WebProxy द्वारा मॉडलिंग) से कनेक्ट करना चाहता हूं। मैं को अपने व्यापक, मोहक अनुभव से .NET और WCF दस्तावेज़ों को पढ़ता हूं, डब्ल्यूसीएफ रनटाइम, अगर अन्यथा निर्देशित नहीं किया गया है, तो http/https पर संचार करते समय डिफ़ॉल्ट सिस्टम प्रॉक्सी का उपयोग करेगा।

मैं WinXP/2003 with ProxyCfg.exe as described here में कमांड लाइन से सेट कर सकते हैं कि, और Windows with netsh.exe as described here के बाद के संस्करणों में ।

मैं System.Net.WebRequest.DefaultWebProxy property सेट करके एप्लिकेशन के भीतर उपयोग के लिए डिफ़ॉल्ट वेब प्रॉक्सी भी निर्दिष्ट कर सकता हूं।

लेकिन मान लीजिए कि मैं सिस्टम-व्यापी प्रॉक्सी से अलग प्रॉक्सी से कनेक्ट करना चाहता हूं? उदाहरण के लिए शायद कोई सिस्टम-व्यापी प्रॉक्सी नहीं है लेकिन मुझे विशेष रूप से वेब सेवा के लिए उपयोग करने की आवश्यकता है। या शायद एक सिस्टम-व्यापी प्रॉक्सी है लेकिन मुझे वेब सेवा के लिए एक अलग उपयोग करने की आवश्यकता है। और वास्तव में शायद कई वेब सेवा क्लाइंट हैं, और प्रत्येक को एक अलग प्रॉक्सी मिलनी चाहिए।

प्रॉक्सी प्रति बाध्यकारी कैसे सेट किया जा सकता है?

ASMX मॉडल में, मैं यह कर सकता है:

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

लेकिन इस WCF साथ संभव नहीं है; डब्ल्यूसीएफ-जेनरेट क्लाइंट-साइड प्रॉक्सी कक्षाएं प्रॉक्सी प्रॉपर्टी का पर्दाफाश नहीं करती हैं। मैं http प्रॉक्सी प्रति क्लाइंट-साइड प्रॉक्सी कैसे सेट करूं, और मैं http प्रॉक्सी पर भी प्रमाणीकरण कैसे सेट करूं?

संबंधित:
- how-to-set-proxy-with-credentials-to-generated-wcf-client

उत्तर

21

प्रॉक्सी सेटिंग्स बाध्यकारी विन्यास का हिस्सा हैं। उदाहरण के लिए, ProxyAddressBasicHTTPBinding और WSHttpBinding वर्ग/कॉन्फ़िगरेशन तत्वों की संपत्ति देखें।

ऐसा लगता है कि आप app.config फ़ाइल में अपना एंडपॉइंट कॉन्फ़िगरेशन छोड़ रहे हैं, इस स्थिति में आपको वहां पता सेट करने में सक्षम होना चाहिए।

42

यह समझ में आता है कि डब्ल्यूसीएफ प्रॉक्सी पर कोई प्रॉक्सी प्रॉपर्टी नहीं है, क्योंकि सभी डब्ल्यूसीएफ प्रॉक्सी संचार के लिए HTTP का उपयोग नहीं करते हैं। आगे की समीक्षा के बाद, मैंने पाया कि WCF प्रॉक्सी एक HTTP बाध्यकारी का उपयोग करता है, तो प्रोग्रामिंग के रूप में प्रॉक्सी सेट करना संभव है। अगर किसी और को इसकी ज़रूरत है तो मैं इसे यहां दस्तावेज कर रहा हूं। एक 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"); 
+0

+1 BasicHttp बाइंडिंग – Lijo

17

मुझे एक ही समस्या है, लेकिन मुझे प्रॉक्सी के लिए उपयोगकर्ता नाम और पासवर्ड का उपयोग करने की भी आवश्यकता है जो सेवा तक पहुंचने के लिए उपयोग किए गए उपयोगकर्ता नाम और पासवर्ड से अलग है।

मैंने इसे उरीबिल्डर के माध्यम से बनाने की कोशिश की, जो प्रॉक्सी पते को "http://username:[email protected]/" के रूप में आउटपुट करेगा। दुर्भाग्यवश, मैं जिस विशेष प्रॉक्सी का उपयोग कर रहा था वह इस तकनीक के साथ काम नहीं करता था।

व्यापक Googling के बाद मुझे जो मिला, वह यह है कि आप WebRequest.DefaultProxy (स्थैतिक संपत्ति) के माध्यम से प्रॉक्सी बदल सकते हैं।

उदाहरण के लिए:

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

हां के रूप में कास्टिंग के लिए +1। बेशक यदि आप ऐसा करते हैं तो आपको UseDefaultWebProxy = true सेट करना होगा। मुझे लगता है कि प्रति-ग्राहक बाध्यकारी आधार पर ऐसा करने का एक तरीका भी है। यदि बी एक सिस्टम है। ServiceModel.BasicHttp बाइंडिंग, आपको b.Security.Transport.ProxyCredentialType को सेट करने की आवश्यकता होगी जो भी आपके प्रॉक्सी की आवश्यकता है। Enum HttpProxyCredentialType है और संभावित मान {none, Basic, Digest, Ntlm, Windows} हैं। इस पोस्ट को एक संकेत के लिए देखें: http://kennyw.com/indigo/106 – Cheeso

+0

लिंक चेसो के लिए धन्यवाद। जब मैं मोडे में कार्यालय में वापस आऊंगा तो मैं इसे एक घुमाव दूंगा :) –

+0

यह वही है जो मैं चाहता हूं, लेकिन प्रोग्रामेटिक रूप से या कुछ कॉन्फ़िगरेशन फ़ाइल में क्रेडिटेंट सेट नहीं करना चाहता। मेरे क्लाइंट ऐप को स्वचालित रूप से प्रॉक्सी पता और पोर्ट, उपयोगकर्ता क्रेडिट (और यदि आवश्यक हो तो डोमेन) का पता लगाने की आवश्यकता है। प्रॉक्सी को प्रमाणीकरण की आवश्यकता नहीं है, तो अभी आंशिक रूप से जिस तरह से मैं चाहता हूं वह आंशिक रूप से काम करता है। प्रॉक्सी पता स्वचालित रूप से विंडोज़ नेटवर्क सेटिंग से पता चला है। मैं वैसे ही काम करने के लिए प्रमाण पत्र कैसे प्राप्त कर सकता हूं? मैं पासवर्ड के लिए उपयोगकर्ता (दोबारा) संकेत नहीं देना चाहता हूं। –

2

आप भी इस कोशिश कर सकते:

प्रोग्राम जो कुछ भी बाध्यकारी प्रयोग कर रहे हैं मिलता है, और फिर सीधे जैसे उस पर प्रॉक्सी सेट

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

जहां "WSDualHttpBinding_IMainService" अपने अपने कॉन्फ़िग फ़ाइल से बाध्यकारी का नाम है। आपको UseDefaultWebProxy=false सेट करना होगा; अन्यथा आपकी प्रॉक्सी को अनदेखा कर दिया जाएगा।

संबंधित मुद्दे