【问题标题】:How do you differentiate between application and infrastructure endpoints?您如何区分应用程序端点和基础架构端点?
【发布时间】:2010-10-25 15:33:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    异常显示在 System.ServiceModel.Description.DispatchBuilder 对象上调用方法 EnsureThereAreNonMexEndpoints 会导致引发异常。

    使用 Reflector 深入研究此方法,我对以下表达等效功能的实现进行了逆向工程:

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

    WCF 认为基础结构的唯一端点似乎是IMetadataExchange。呵呵。

    你知道的越多。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您的实现实际上似乎比 WCF 走得更远,检查 WSDL 命名空间以及 Mex 端点。
      猜你喜欢
      • 2019-01-27
      • 2012-04-06
      • 2018-07-04
      • 2011-01-20
      • 2011-07-06
      • 1970-01-01
      • 2011-11-24
      • 2019-03-15
      相关资源
      最近更新 更多