Как вы различаете конечные точки приложений и инфраструктуры?

Я создаю пользовательское поведение для WCF, которое может (по соображениям совместимости) работать правильно только тогда, когда служба предоставляет одну конечную точку приложения.

Я хотел бы иметь возможность использовать IServiceBehavior.Validate< /a>, чтобы убедиться, что служба предоставляет только одну конечную точку приложения. В настоящее время я делаю следующее:

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

serviceDescription.Endpoints, к сожалению, содержит все конечные точки, включая конечную точку IMetadataExchange. Это приводит к сбою проверки на абсолютно действительных службах.

Мне нужен только способ подсчета конечных точек приложений (не инфраструктурных), но я не могу найти, как сама WCF определяет, какие именно.


person Paul Turner    schedule 25.10.2010    source источник


Ответы (2)


Работая над этой проблемой, мне удалось воспроизвести печально известную:

Служба «Служба» не имеет конечных точек приложения (не инфраструктуры). Это может быть связано с тем, что для вашего приложения не был найден файл конфигурации, или с тем, что в файле конфигурации не удалось найти элемент службы, соответствующий имени службы, или с тем, что в элементе службы не были определены конечные точки.

Исключения показывают, что метод EnsureThereAreNonMexEndpoints вызывается для объекта System.ServiceModel.Description.DispatchBuilder, что приводит к возникновению исключения.

Копаясь в этом методе с помощью Reflector, я перепроектировал следующую реализацию, которая выражает эквивалентную функциональность:

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

    throw InvalidOperationException();
}

Похоже, единственная конечная точка, рассматриваемая WCF как инфраструктура, — это IMetadataExchange. Хм.

Чем больше ты знаешь.

person Paul Turner    schedule 25.10.2010

Я делал это в прошлом, как описано в этой статье.

person tomasr    schedule 25.10.2010
comment
Ваша реализация на самом деле, кажется, идет дальше, чем WCF, проверяя пространство имен WSDL, а также конечную точку Mex. - person Paul Turner; 25.10.2010