Подтвердить что ты не робот

Добавьте ссылку на службу при использовании привязки netTcp

У меня есть служба WCF, которая я проверена, скопировав ее интерфейсы в примерный проект клиента.
Теперь я хочу работать правильно, добавив ссылку на службу.
Служба размещается в хостинге Windows (с помощью installUtil).
Услуга имеет 2 проекта - внешние (интерфейсы + данные) и внутренние элементы (реализации).
По какой-то причине у него не было app.config, поэтому я добавил его вручную:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="ExecutionService" behaviorConfiguration="Default">
        <endpoint name="TCPEndpoint" address="" binding ="netTcpBinding" contract="Externals.IExecutionService"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:3040/ExecutionService"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Попытка добавить ссылку на службу из моего примера клиента вызывает следующую ошибку:

Metadata contains a reference that cannot be resolved: 'net.tcp://localhost:3040/ExecutionService/Externals.IExecutionService'.
There was no endpoint listening at net.tcp://localhost:3040/ExecutionService/Externals.IExecutionService that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.
If the service is defined in the current solution, try building the solution and adding the service reference again.

Я видел здесь, что нет необходимости в app.config.
Я немного смущен, и я начинаю с WCF.
Как приложение nice WPF ссылается на мою службу? Я хочу, чтобы служба была оконной, и я не хочу перетаскивать DLL со мной.

Edit
Я добавил конечную точку метаданных, и мой appconfig теперь выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="ExecutionService" behaviorConfiguration="Default">
        <endpoint name="TCPEndpoint" 
                  address="" 
                  binding ="netTcpBinding" 
                  contract="Externals.IExecutionService"/>
        <endpoint address="mex" 
                  binding="maxHttpBinding" 
                  contract="Externals.IExecutionService"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:3040/ExecutionService"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Я попытался добавить ссылку на службу с помощью net.tcp://localhost:3040/ExecutionService, net.tcp://localhost:3040/ExecutionService/Externals и net.tcp://localhost:3040/ExecutionService/Externals/IExecutionService, и я все равно получаю ту же ошибку.

4b9b3361

Ответ 1

Вам нужно сделать:

  • maxHttpBinding → mexTcpBinding - вы не можете использовать mexHttpBinding на конечной точке net.tcp(и это mex not max)
  • Контракт для конечной точки mex должен быть IMetadataExchange - поскольку вы хотите иметь метаданные службы через эту конечную точку.
  • httpGetEnabled = "false", так как не будет конечной точки http для получения метаданных из
  • Когда я тестировал решение на простом консольном хосте, мне нужно было изменить имя в <service> тега к Externals.ExecutionService(но это зависит от того, как вы создаете экземпляр службы).

Затем ваша ссылка на службу будет доступна по адресу: net.tcp://localhost:3040/ExecutionService/mex в качестве базового адреса net.tcp://localhost:3040/ExecutionService и относительный адрес для конечной точки mex установлен на mex

Окончательный app.config приведен ниже:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
  <service name="Externals.ExecutionService" behaviorConfiguration="Default">
    <endpoint name="TCPEndpoint"
              address=""
              binding ="netTcpBinding"
              contract="Externals.IExecutionService"/>
    <endpoint address="mex"
              binding="mexTcpBinding"
              contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:3040/ExecutionService"/>
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="Default">
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

Для быстрой проверки правильности конфигурации я использовал консольное хост-приложение в качестве хоста службы. Program.cs:

using System;
using System.ServiceModel;

namespace Externals
{
    class Program
    {
        static void Main(string[] args)
        {

            var sh=new ServiceHost(typeof(ExecutionService));
            sh.Open();
            Console.WriteLine("Service running press any key to terminate...");
            Console.ReadKey();
            sh.Close();
        }
    }
}

Запустите консольное приложение и попробуйте добавить ссылку на службу в свой проект через net.tcp://localhost:3040/ExecutionService/mex.

Ответ 3

Измените это:

<endpoint address="mex" 
                  binding="maxHttpBinding" 
                  contract="Externals.IExecutionService"/>

To:

<endpoint address="mex" 
                  binding="mexTcpBinding" 
                  contract="IMetadataExchange"/>

Обратите внимание, что это не maxHttpBinding, а mexTcpBinding, у вас тоже была опечатка.