Не могу добавить сервисную ссылку в net tcp wcf service - PullRequest
2 голосов
/ 22 января 2012

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

Метаданные содержат ссылку, которая не может быть разрешена: 'Net.tcp: // локальный: 8523 / Service1. Не удалось подключиться к net.tcp: // локальный: 8523 / Service1. Попытка подключения продолжалась в течение промежуток времени 00: 00: 02.0011145. Код ошибки TCP 10061: нет соединения может быть сделано, потому что целевая машина активно отказалась от него

Я проверил, что брандмауэр Windows не блокирует порт 8523. Я даже создал новое правило в брандмауэре Windows, чтобы разрешить запуск порта 8523. Но когда я запускаю netstat -sp tcp, я не могу найти порт 8523. Но я вижу, что состояние службы Serice1 установлено в START в службах. Это файлы конфигурации

Сервисная библиотека

<system.serviceModel>
  <services>
    <service name="WcfServiceLibrary1.Service1">
      <endpoint 
           address="" 
           binding="netTcpBinding" bindingConfiguration=""
           contract="WcfServiceLibrary1.IService1">
         <identity>
           <dns value="localhost" />
         </identity>
      </endpoint>
      <endpoint 
           address="mex" 
           binding="mexTcpBinding" bindingConfiguration=""
           contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:8523/Service1" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="">
        <serviceMetadata httpGetEnabled="false" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

Конфигурация в проекте службы Windows выглядит идентично.

Ответы [ 4 ]

4 голосов
/ 22 января 2012

Майкл, это привязка net.tcp, которую я обычно использую для службы WCF.

    <bindings>
        <netTcpBinding>
            <binding name="TcpBinding"
                     receiveTimeout="Infinite"
                     sendTimeout="Infinite"
                     maxBufferSize="2147483647"
                     maxReceivedMessageSize="2147483647">
                <reliableSession inactivityTimeout="Infinite"/>
                <security mode="None"/>
            </binding>
        </netTcpBinding>
    </bindings>

Попробуйте добавить его в свою конфигурацию:

<service name="WcfServiceLibrary1.Service1">   
    <endpoint    
        address=""    
        binding="netTcpBinding" bindingConfiguration="TcpBinding"   
        contract="WcfServiceLibrary1.IService1">   
    ...

Кроме того, мои службы работают под ServiceAccount.LocalSystem.

Чек

netstat - ap tcp

если служба прослушивает.

РЕДАКТИРОВАТЬ: мой класс обслуживания ниже. Обратите внимание, что текущим каталогом службы Windows программно установлен BaseDirectory , то есть каталог исполняемого файла.

public class Service : ServiceBase
{
    public static void Main()
    {
        Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
        ServiceBase.Run(new Service());
    }

    ...
}
1 голос
/ 22 января 2012

Вы указали поведение, но не дали ему имя. Дайте поведению имя и укажите на него, используя поведениеConfiguration в вашем сервисе.

<service name="WcfServiceLibrary1.Service1" behaviorConfiguration="svc1behavior">

...

<serviceBehaviors>
<behavior name="svc1behavior">
  <serviceMetadata httpGetEnabled="false" />
  <serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
0 голосов
/ 05 июля 2016

Была такая же проблема.После многих неполадок я обнаружил, что пропускаю ссылку на службу в Web.config в проекте службы, поэтому я добавил ее в Web.config:

<system.serviceModel>
  <services>
    <service name="serviceName" behaviorConfiguration="BasicServiceBehavior" >
      <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicServiceBasicHttpBinding" contract="(I<nameofservice>)"/>
    </service>
  </services>
</system.serviceModel>

После этого перестроил решение (который создал интерфейс) и переиздан.Тогда я наконец смогу добавить ссылку на сервис из моего другого проекта.

0 голосов
/ 25 января 2012

Убедитесь, что служба адаптера прослушивателя Net.Tcp работает (хотя, если она работает во время размещения службы в консольном приложении, она должна быть запущена).

Чтобы найти порт, который использует ваша служба,

  1. Открыть диспетчер задач
  2. Выберите Вид -> Выбрать столбцы -> Проверить PID -> ОК
  3. Найдите название вашего сервисного процесса, запишите PID
  4. Запустите команду followind из командной строки: netstat -ano | findstr *PID*
...