您如何区分应用程序和基础架构端点?

时间:2010-10-25 15:33:48

标签: c# .net wcf endpoint wcf-behaviour

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

在解决这个问题的同时,我设法重现了臭名昭着的:

  

服务'服务'没有应用程序(非基础架构)端点。这可能是因为没有为您的应用程序找到配置文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在service元素中没有定义端点。

异常显示在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 :(得分:1)

我过去这样做过,就像我在article中所概述的那样。