كيف يمكنني تعيين وكيل HTTP (WebProxy) على وكيل خدمة من جانب عميل WCF؟

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

  •  11-09-2019
  •  | 
  •  

سؤال

كيف يمكنني تعيين وكيل HTTP برمجيا، على عميل WCF، دون استخدام الوكيل الافتراضي؟

الوكلاء، الوكلاء، الوكلاء.

وفقا لنموذج WCF للتنمية، فإنني إنشاء فصول "وكيل" جانب العميل عن طريق تشغيل svcutil.exe على WSDL للخدمة. (هذا ينتج أيضا ملف تكوين جانب العميل).

في التعليمات البرمجية الخاصة بي، سأحدد مثيل هذا الفصل وأستطيع الاتصال بالخدمة. لطيف جدا.

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

نحن نسمي هذا الشيء فئة وكيل، ولكن هناك وكيل آخر - وكيل HTTP. تستخدم هذه الخدمة WshttpgBinding BasichttpGinding، لذلك فإنه يجري HTTP. الآن، افترض أنني أريد توصيل العميل بخدمة الويب عبر وكيل HTTP (على غرار System.Net.WebProxy في .NET BCL). أعلم من تجربتي الواسعة الناشئة عن القراءة وثائق .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

هل كانت مفيدة؟

المحلول

إعدادات الوكيل جزء من تكوين الربط. على سبيل المثال، انظر إلى عنوان الوكيل خاصية basichttpginding. و Wshttpginding. عناصر الفصول / التكوين.

يبدو أنك تترك تكوين نقطة النهاية الخاصة بك في ملف app.config، وفي هذه الحالة يجب أن تكون قادرا على ضبط العنوان هناك.

نصائح أخرى

من المنطقي أنه لا يوجد خاصية وكيل على وكيل WCF، لأنه لا تستخدم جميع الوكلاء 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");

لقد تلقيت مشكلة مماثلة، لكنني بحاجة أيضا إلى استخدام اسم مستخدم وكلمة مرور للوكيل الذي تختلف عن اسم المستخدم وكلمة المرور المستخدمة للوصول إلى الخدمة.

حاولت بناءها من خلال أوربوية، والتي من شأنها أن تخرج عنوان الوكيل باسم "http: // اسم المستخدم: كلمة المرور @ 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