gpt4 book ai didi

.net - 具有动态端口 0 和 TCP 绑定(bind)的 WCF 服务发现

转载 作者:可可西里 更新时间:2023-11-01 02:42:40 25 4
gpt4 key购买 nike

我想在端口 0 上启动一项服务(启用 Mex 和 mex TCP 绑定(bind))- 再次使用网络 TCP 绑定(bind)在端点上为契约(Contract)“IHelloWorldOne”说。

来 self 服务的 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 和服务端点绑定(bind)到 WCF 中的端口 0 并发现它们?如果是,怎么办?

最佳答案

来自您的异常消息:

AddressFilter mismatch at the EndpointDispatcher

这是因为端点地址应该与您在创建端点时指定的地址完全相同(例如 port = 0)

问题是 MetadataResolver 没有使用以下重载元数据交换客户端类

public MetadataSet GetMetadata(
EndpointAddress address,
Uri via
)

此处地址应该是你的情况response.Address(端口0)

在您的情况下,via 参数应该是它监听的端点的实际 Uri(例如,具有实际端口号)response.Endpoints[0].ListenUris[0].

似乎没有简单的方法来使用带有动态端口的 MetadataResolver。

在我的例子中,我在动态端口上有服务,并使用发现来查找分配给该服务的端口。

在客户端,我使用以下代码:

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]);

在这里,我指定了带有端口 0 的端点地址和带有从 ListenUris 动态分配的端口的实际地址。

希望这能帮助解决您的问题。

关于.net - 具有动态端口 0 和 TCP 绑定(bind)的 WCF 服务发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com