首页 > 解决方案 > 如何从 DynamicEndpoint 获取 WCF 服务地址

问题描述

我创建了一个 DynamicEndpoint 来自动查找 WCF 服务。

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            DynamicEndpoint dynamicEndpoint = new DynamicEndpoint(ContractDescription.GetContract(typeof(ICalculator)), new NetTcpBinding());            
            using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(dynamicEndpoint))
            {
                ICalculator caculate = channelFactory.CreateChannel();
                Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 4, 9, caculate.Add(4, 9));
                Console.WriteLine("Find service, the service address is: " + dynamicEndpoint.Address.Uri);
            }
            Console.Read();
        }
    }
}

问题是当我尝试打印服务地址时,返回值为

http://schemas.microsoft.com/discovery/dynamic

那不是我发布的真实服务地址。
1、如何获取真实的服务地址?
2. 如果有多个服务可用,DynamicEndpoint 会选择哪一个?我可以获得地址数组或列表吗?

标签: wcf

解决方案


据我所知,我们无法在客户端获得实际使用端点。除了我们使用 OperationContext 对象,它提供对服务方法的执行上下文的访问。
https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.operationcontext?redirectedfrom=MSDN&view=netframework-4.7.2
例如,我们可以参考以下代码来获取实际的端点。
服务器。

public string GetAddress()
        {
            OperationContext oc = OperationContext.Current;
            string result=oc.Channel.LocalAddress.Uri.ToString();
            return result;

        }

客户。

ChannelFactory<IService> factory = new ChannelFactory<IService>(dynamicEndpoint);
            IService sv = factory.CreateChannel();

            Console.WriteLine(sv.GetAddress());

此外,我不认为动态端点可以列出已找到的端点。动态端点将服务发现与服务调用合并。当使用动态端点调用服务时,它将依赖 FindCriteria 属性来查找服务端点,然后调用它。
https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.discovery.dynamicendpoint?view=netframework-4.7.2
https://docs.microsoft.com/en-us/dotnet/api /system.servicemodel.discovery.findcriteria?view=netframework-4.7.2


推荐阅读