我想在端口0上启动一个服务(使用Mex TCP绑定启用Mex),比如在端点上再次使用网络TCP绑定来启动合同"IHelloWorldOne"。
从我的服务的App.config
<service name="Service.One.HelloWorldOne">
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" name="Mex" kind="mexEndpoint" listenUriMode="Unique" />
<endpoint name="Discovery" kind="udpDiscoveryEndpoint" />
<endpoint address="1/tcp" binding="netTcpBinding" name="Service.One" contract="Service.One.IHelloWorldOne" listenUriMode="Unique" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:0/service" />
</baseAddresses>
</host>
</service>
请注意,端口是0-这基本上允许windows为端点提供一个开放端口,这意味着"mex"端点可以获得一个随机端口
关于我的客户:
FindCriteria findCriteria = FindCriteria.CreateMetadataExchangeEndpointCriteria(typeof(IHelloWorldOne));
//FindCriteria findCriteria = new FindCriteria(typeof(IHelloWorldOne));
findCriteria.MaxResults = 1;
findCriteria.Duration = TimeSpan.FromSeconds(5);
findCriteria.Scopes.Add(new Uri(string.Format("net.tcp://sharedservice/{0}/", "SHAREDCONTEXT")));
FindResponse response = discoveryClient.Find(findCriteria);
try
{
if (response.Endpoints.Count > 0)
{
var mexClient = new MetadataExchangeClient(MetadataExchangeBindings.CreateMexTcpBinding());
var contracts = new List<ContractDescription>() { ContractDescription.GetContract(typeof(IHelloWorldOne)) };
EndpointAddress address = new EndpointAddress(response.Endpoints[0].ListenUris[0]);
var endpoints = MetadataResolver.Resolve(contracts, address, mexClient);
注意:我正在使用ListenURI来获取交换的元数据。然而,当我尝试时,我遇到了这个异常
异常
System.InvalidOperationException: Metadata contains a reference that cannot be resolved: 'net.tcp://localhost:50294/service/mex'. --->
System.InvalidOperationException: <?xml version="1.0" encoding="utf-16"?><Fault xmlns="http://www.w3.org/2003/05/soap-envelope"><Code><Value>Sender</Value><Subcode><Value xmlns:a="http://www.w3.org/2005/08/addressing">a:DestinationUnreachable</Value></Subcode></Code><Reason><Text xml:lang="en-US">
The message with To 'net.tcp://localhost:50294/service/mex' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher.
Check that the sender and receiver's EndpointAddresses agree.</Text></Reason></Fault>
我可以在listenURI上看到mex端点的端口,但无法连接到它。
我尝试的另一种方法是将mex端点保留为常量,并发现服务端口——我无法完成这项工作,因为该端口在响应的端点的listenURI上不可用。
所以我的问题是,有没有一种方法可以为Mex和服务端点绑定到WCF中的端口0,并发现它们?如果是,如何?
来自您的异常消息:
EndpointDispatcher 上的AddressFilter不匹配
这是因为端点地址应该与创建端点时指定的地址完全相同(例如端口=0)
问题是MetadataResolver未使用以下重载MetadataExchangeClient类
public MetadataSet GetMetadata(
EndpointAddress address,
Uri via
)
这里地址应该是您的响应。地址 在您的响应中,via参数应该是它侦听的端点的实际Uri(例如,具有实际端口号)。Endpoints[0]。ListenUris[0]. 似乎没有简单的方法可以使用MetadataResolver与动态端口。 在我的情况下,我在动态端口上有服务,并使用发现来查找分配给该服务的端口。 在客户端,我使用以下代码: 在这里,我使用端口0指定端点地址,并使用ListenUris动态分配的端口指定实际地址。 希望这将有助于解决你的问题。FindResponse response = discoveryClient.Find(findCriteria);
var binding = new NetTcpBinding(SecurityMode.None);
return ChannelFactory<IMyService>.CreateChannel(binding, response.Endpoints[0].Address, response.Endpoints[0].ListenUris[0]);