Путаница с клиентом WCF - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь подключиться к службе WCF, размещенной как служба Windows.

Служба WCF имеет конечную точку по адресу:

net.tcp://localhost:9164/GettingStarted/

Я могу запустить службу без каких-либо проблема.

Однако теперь я пытаюсь подключиться к нему через мое консольное приложение.

Это код:

static void Main(string[] args)
{

    // Step 1: Create a URI to serve as the base address.
    Uri baseAddress = new Uri("net.tcp://localhost:9164/GettingStarted/");

    // Step 2: Create a ServiceHost instance.
    ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

    try
    {
        // Step 3: Add a service endpoint.
        selfHost.AddServiceEndpoint(typeof(ICalculator), new NetTcpBinding(), "CalculatorService");

        // Step 4: Enable metadata exchange.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = false;
        smb.HttpsGetEnabled = false;
        selfHost.Description.Behaviors.Add(smb);

        // Step 5: Start the service.
        selfHost.Open();
        Console.WriteLine("The service is ready.");

        // Close the ServiceHost to stop the service.
        Console.WriteLine("Press <Enter> to terminate the service.");
        Console.WriteLine();
        Console.ReadLine();
        selfHost.Close();
    }
    catch (CommunicationException ce)
    {
        Console.WriteLine("An exception occurred: {0}", ce.Message);
        selfHost.Abort();
    }
}

Когда я запускаю это, я сохраняю получение этого исключения:

System.ServiceModel.AddressAlreadyInUseException

Однако больше ничего не подключается к службе.

Кроме того, я мог протестировать службу через веб-браузер, когда он был основан на http. Как мне протестировать с net .tcp?

EDIT:

Клиент WCF обновлен:

static void Main(string[] args)
{
    ChannelFactory<ICalculator> channelFactory = null;

    try
    {
        NetTcpBinding binding = new NetTcpBinding();

        EndpointAddress endpointAddress = new EndpointAddress("net.tcp://localhost:9164/GettingStarted/CalculatorService");

        channelFactory = new ChannelFactory<ICalculator>(binding, endpointAddress);

        ICalculator channel = channelFactory.CreateChannel();

        double result = channel.Add(4.0, 5.9);
    }
    catch (TimeoutException)
    {
        //Timeout error  
        if (channelFactory != null)
            channelFactory.Abort();
        throw;
    }
    catch (FaultException)
    {
        if (channelFactory != null)
            channelFactory.Abort();
        throw;
    }
    catch (CommunicationException)
    {
        //Communication error  
        if (channelFactory != null)
            channelFactory.Abort();
        throw;
    }
    catch (Exception)
    {
        if (channelFactory != null)
            channelFactory.Abort();
        throw;
    }

}

1 Ответ

0 голосов
/ 19 июня 2020

Согласно вашему описанию, ваша служба WCF размещена в службе Windows. Теперь вы хотите подключиться к ней. Я не понимаю, что вы имеете в виду под соединением. Поскольку служба WCF размещена в службе Windows, вы можете сгенерировать прокси-класс для ее вызова в соответствии со службой WCF, но я обнаружил, что ваше консольное приложение по-прежнему хочет размещать службы WCF. Я не знаю, что вы хотите сделать, но если вы хотите разместить службы WCF в консольном приложении, вам необходимо изменить свой базовый адрес, потому что, согласно вашему описанию, вам необходимо разместить службы WCF в службе и консоли Windows. Но их адреса не могут быть одинаковыми, вы можете изменить базовый адрес в консольном приложении, например:

Uri baseAddress = new Uri("net.tcp://localhost:9166/Test/");
ServiceHost selfHost = new ServiceHost(typeof(Service1), baseAddress);
...