代码之家  ›  专栏  ›  技术社区  ›  Kerwen

如何从DynamicEndpoint获取WCF服务地址

wcf
  •  0
  • Kerwen  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  1
  •   Abraham Qian    7 年前

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

    此外,我不认为dynamicendpoint可以列出已经找到的端点。动态端点合并服务发现和服务调用。当使用动态端点调用服务时,它将依赖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

    推荐文章