Как получить адрес службы WCF из DynamicEndpoint - PullRequest
0 голосов
/ 30 октября 2018

Я создал 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 голосов
/ 31 октября 2018

Насколько я знаю, мы не смогли получить конечную точку фактического использования в клиенте. за исключением того, что мы используем объект 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...