我正在为WCF创建自定义行为,这可以(出于互操作性原因)仅在服务公开单个应用程序端点时才能正常运行。
我希望能够使用IServiceBehavior.Validate
方法检查服务是否只公开了一个应用程序端点。目前我正在做以下事情:
public void Validate(
ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
if (serviceDescription.Endpoints.Count > 1)
{
throw new InvalidOperationException();
}
}
不幸的是, serviceDescription.Endpoints
包含所有端点,包括IMetadataExchange
端点。这会导致验证在完全有效的服务上失败。
我需要的是一种只计算应用程序(非基础架构)端点的方法,但我无法找到WCF本身如何确定哪些端点。
答案 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中所概述的那样。