WCF mex 不包含来自主机的完整绑定信息

Posted

技术标签:

【中文标题】WCF mex 不包含来自主机的完整绑定信息【英文标题】:WCF mex does not contain the complete binding information from the host 【发布时间】:2011-05-12 18:16:15 【问题描述】:

我正在发布一个带有 MEX 端点的服务以进行元数据交换,并且我正在使用下面的代码来发现它并获取元数据信息

DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
FindCriteria findCriteria =      FindCriteria.CreateMetadataExchangeEndpointCriteria(ContractType);
findCriteria.Duration = TimeSpan.FromSeconds(15);
findCriteria.MaxResults = 1;// MaxResults;

FindResponse result = discoveryClient.Find(findCriteria);
discoveryClient.Close();

ServiceEndpointCollection eps = MetadataResolver.Resolve(ContractType, result.Endpoints[0].Address);
return eps[0].Binding;

当我在客户端获取元数据信息时,绑定信息 (OpenTimeout, ReceiveTimeoutSendTimeout) 恢复为默认值。

这是主机中的绑定信息

<binding name="MyServiceBinding" closeTimeout="00:05:00" openTimeout="00:05:00"
      receiveTimeout="23:50:00" sendTimeout="00:05:00" maxReceivedMessageSize="50000000">
   <readerQuotas maxStringContentLength="50000000" maxArrayLength="50000000" />
   <reliableSession ordered="true" inactivityTimeout="00:01:00" enabled="false" />
   <security mode="None" />
</binding>

这是我发现的另一个问题,与我的几乎相同。

WCF Service Binding taking default values instead of custom values

我想知道我是否做错了什么,或者我是否误解了元数据交换的概念。

我要做的是将所有必要的信息发送给我的客户,这样他们就可以自己自动配置它们并且没有任何硬代码配置。

【问题讨论】:

【参考方案1】:

我认为您没有做错任何事情 - 您只是对元数据交换期望过高。

MEX 的目的是能够以编程方式发现新服务,并为这些服务创建客户端代理。为此,有 WSDL - 基本上,WSDL 中包含的任何内容都是元数据交换的一部分:

服务合同/服务方式 这些服务方法所需的参数 使用的数据类型在 XML 模式中的数据类型声明 其他与服务相关的信息,例如使用的绑定等。

但 MEX 确实包含所有 WCF 特定配置设置 - 这是您发现的。 MEX 将创建一个正常运行的客户端代理 - 但它从未打算将所有配置设置从服务器传输到客户端。您需要在客户端自己手动编码。

【讨论】:

那我应该改用 WSDL 吗? @Jose Manuel Ojeda:不,这不会有任何区别; MEX 和 WSDL 几乎相同。没有任何方法可以通过 MEX 或 WSDL 自动交换配置信息,例如超时。 我刚刚在尝试修改 maxMessageLenght 时遇到了这个问题。如果您无法发布完整的绑定信息,这会使整个 mex 发布毫无用处,因为您仍然必须在客户端拥有一些配置信息...

以上是关于WCF mex 不包含来自主机的完整绑定信息的主要内容,如果未能解决你的问题,请参考以下文章

WCF 多端点

无法让 MEX 使用我的 WCF 服务

如何在 WCF 中自动重新连接命名管道绑定

SOAP 请求因 MEX 绑定而失败

WCF - 无法通过浏览器访问 MEX

来自 WCF 请求的 IPrincipal