2

我正在为 WCF 创建一个自定义行为,它只能(出于互操作性原因)在服务公开单个应用程序端点时才能正常工作。

我希望能够使用该IServiceBehavior.Validate方法来检查服务是否只公开了一个应用程序端点。目前我正在做以下事情:

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

serviceDescription.Endpoints不幸的是包含所有端点,包括IMetadataExchange端点。这会导致验证在完全有效的服务上失败。

我需要的是一种仅计算应用程序(非基础设施)端点的方法,但我无法找到 WCF 本身如何确定哪些是哪些。

4

2 回答 2

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. 嗯。

你懂得越多。

于 2010-10-25T17:07:40.573 回答
1

就像我在本文中概述的那样,我过去曾这样做过。

于 2010-10-25T16:54:14.507 回答