Как вы различаете конечные точки приложений и инфраструктуры? - PullRequest
2 голосов
/ 25 октября 2010

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

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

public void Validate(
    ServiceDescription serviceDescription, 
    ServiceHostBase serviceHostBase)
{
    if (serviceDescription.Endpoints.Count > 1)
    {
        throw new InvalidOperationException();
    }
}
К сожалению,

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

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

Ответы [ 2 ]

2 голосов
/ 25 октября 2010

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

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

Исключения показывают, что метод 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.Ха.

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

1 голос
/ 25 октября 2010

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

...