如何从DynamicEndpoint获取WCF服务地址

时间:2018-10-30 08:55:26

标签: 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将选择哪一项?我可以获取地址数组或列表吗?

1 个答案:

答案 0 :(得分:1)

据我所知,我们无法获得客户端的实际使用端点。除了我们使用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