كيف يمكنك التمييز بين نقاط نهاية التطبيق والبنية التحتية؟

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

سؤال

أقوم بإنشاء سلوك مخصص لـ WCF والذي يمكن (لأسباب قابلية التشغيل البيني) فقط العمل بشكل صحيح عندما تعرض الخدمة نقطة نهاية تطبيق واحدة.

أود أن أكون قادرًا على استخدام IServiceBehavior.Validate طريقة للتحقق من أن نقطة نهاية تطبيق واحدة فقط تتعرض من قبل الخدمة. حاليا أفعل ما يلي:

public void Validate(
    ServiceDescription serviceDescription, 
    ServiceHostBase serviceHostBase)
{
    if (serviceDescription.Endpoints.Count > 1)
    {
        throw new InvalidOperationException();
    }
}

serviceDescription.Endpoints لسوء الحظ يحتوي على الكل نقاط النهاية ، بما في ذلك IMetadataExchange نقطة النهاية. هذا يتسبب في فشل التحقق من صحة الخدمات الصالحة تمامًا.

ما أحتاجه هو وسيلة لحساب نقاط النهاية (بنية غير متفرقة) فقط ، لكن لا يمكنني العثور على كيف يحدد WCF نفسه أيها.

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

المحلول

أثناء العمل حول هذه المشكلة ، تمكنت من إعادة إنتاج الشهرة:

الخدمة "الخدمة" لديها نقاط نهاية تطبيق صفري (غير بنيت بنية). قد يكون هذا لأنه لم يتم العثور على ملف تكوين لتطبيقك ، أو لأنه لا يمكن العثور على عنصر خدمة يطابق اسم الخدمة في ملف التكوين ، أو لأنه لم يتم تعريف أي نقاط نهاية في عنصر الخدمة.

تُظهر الاستثناءات طريقة EnsureThereAreNonMexEndpoints يسمى أ System.ServiceModel.Description.DispatchBuilder الكائن الذي يسبب استثناء لإلقاء.

عند البحث في هذه الطريقة مع العاكس ، قمت بتصنيع التنفيذ التالي الذي يعبر عن الوظيفة المكافئة:

private void EnsureThereAreNonMexEndpoints(ServiceDescription description)
{
    foreach (ServiceEndpoint endpoint in description.Endpoints)
    {
        if (endpoint.Contract.ContractType != typeof(IMetadataExchange))
        {
            return;
        }
    }

    throw InvalidOperationException();
}

يبدو أن نقطة النهاية الوحيدة التي تعتبر البنية التحتية من قبل WCF هي IMetadataExchange. هاه.

كلما عرفت أكثر.

نصائح أخرى

لقد فعلت هذا في الماضي كما أوضحت في هذا مقالة - سلعة.

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