سؤال

تؤدي إضافة مرجع خدمة إلى خدمة ويب (كل هذا هو WCF) في Visual Studio إلى إنتاج بعض التعليمات البرمجية التي تم إنشاؤها بما في ذلك إعادة صياغة الواجهة التي يتم كشفها من جانب العميل.

أفهم سبب إنشاء هذه الواجهة:ربما تستخدم خدمة تابعة لجهة خارجية ولا يمكنك الوصول إلى الواجهة الفعلية.

لكنني أفعل، وهما كذلك لا المهمة متوافقة على الرغم من أن الوكيل الشفاف يقوم بالفعل بتنفيذ الواجهة التي أريد الإرسال إليها تمامًا.

يمكنني استخدام التأمل، لكن هذا قبيح.هل هناك طريقة ما للتغلب على هذا النوع من الأمان المزيف وحقن البيانات الوصفية حتى أتمكن من استخدام واجهة مع الفصل الدراسي؟


مشكلتي المحددة تخرج عن القاعدة بطرق معقدة تتعلق بعميل واحد يستخدم بعض مشتقات الفئة الأساسية مباشرة ويستخدم الآخرين عن بعد عبر مراجع الخدمة.تحتاج الفئة الأساسية لكل خادم إلى الاحتفاظ بمراجع للعملاء المشتركين في مجموعة للتعداد لإعلام الأحداث، وكانت المشكلة متنوعة بسبب استخدام الوكلاء.

لم تحل أي من هذه الإجابات مشكلتي المحددة، ومع ذلك كانت كل إجابة مفيدة ومفيدة.لقد وجدت الحل الخاص بي (استخدم رابطًا مزدوجًا) لكنني لم أكن لأكتشفه أبدًا إذا لم تقم بتحسين فهمي للعمل بأكمله بشكل جذري.

ثلاث إجابات ممتازة.كيفية اختيار واحد فقط؟اخترت الأول، لأنه يحل المشكلة مباشرة أولا معتقد كان لدي.

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

المحلول

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

نصائح أخرى

إذا كان لديك بالفعل دلل عقد في العميل، حتى أنك لا تحتاج إلى مرجع خدمة (إلا إذا كنت تستخدم لكتابة رمز الإعداد لك) - يمكنك ببساطة قاعدة العملاء فرعية وفضح القناة، واستخدام أن مباشرة - شيء من هذا القبيل (لا IDE مفيد ...):

public class WcfClient<T> : ClientBase<T> where T : class
{
    public new T Channel {get {return base.Channel;}}
}

وبعد ذلك يمكنك أن تفعل أشياء مثل:

using(var client = new WcfClient<IFoo>())
{
    client.Channel.Bar(); // defined by IFoo
}

وأنت لا تزال بحاجة إعدادات التكوين في التكوين لتحديد عنوان وملزمة، وما إلى ذلك - ولكن أقل فوضى من الجيل الوكيل. أيضا، قد تختار لإعادة تنفيذ-IDipsoable للتعامل مع حقيقة أن وكلاء WCF يمكن أن يلقي في Dispose() (وهو أمر سيء):

public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
    public new T Channel {get {return base.Channel;}}
    void IDisposable.Dispose() {
        try {
           switch(State) {
              case CommunicationState.Open: Close(); break;
              // etc
           }
        } catch {} // swallow it down (perhaps log it first)
    }
}

من أجل إرجاع واجهة من خدمة ما، يجب عليك استخدام سمة KnownType:

هل أي من تلك المساعدة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top