WCF работает как заявка, но не как услуга - PullRequest
4 голосов
/ 25 марта 2009

У меня есть WCF-сервер, который я могу запускать как службу или как приложение Windows Forms. Когда я запускаю его как приложение Windows Forms, я могу подключиться к нему через свое клиентское приложение. Однако, когда я запускаю его как сервис с использованием того же кода, я не могу подключиться к нему. Я подтвердил, что служба работает и выполняет свою работу. Ниже приведен файл конфигурации сервера.

<system.serviceModel>
  <services>
    <service name="Cns.TrafficCopService.ManagementService">
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:8000/TrafficCop/ManagementService" />
        </baseAddresses>
      </host>
      <endpoint address="" binding="wsHttpBinding" contract="Cns.TrafficCopService.IManagementService" />
    </service>
  </services>
</system.serviceModel>

и его код хостинга, называемый через 100 миллисекунд после вызова OnStart:

if (this.serviceHost != null)
{
    this.serviceHost.Close();
}

this.serviceHost = new ServiceHost(typeof(ManagementService));
this.serviceHost.Open();

и файл конфигурации клиента:

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="WSHttpBinding_IManagementService" />
    </wsHttpBinding>
  </bindings>
  <client>
    <endpoint
        address="http://localhost:8000/TrafficCop/ManagementService"
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IManagementService"
        contract="IManagementService"
        name="WSHttpBinding_IManagementService">
    </endpoint>
  </client>
</system.serviceModel>

Ответы [ 6 ]

2 голосов
/ 25 марта 2009

Не могли бы вы опубликовать оставшуюся часть кода для размещения услуги?

Ваш класс, который запускает службу, должен наследоваться от «ServiceBase» и должен реализовывать методы «OnStart» и «OnStop». Эти методы вызываются сервисной консолью для запуска и остановки сервисного процесса, поэтому ваш ServiceHost должен быть открыт / закрыт этими методами. Просто интересно, может быть, ты этого не делаешь.

1 голос
/ 25 марта 2009

На какой учетной записи работает служба? Интересно, если служба не запускается, возможно, из-за отсутствия разрешений на открытие порта.

Попробуйте запустить службу под своим собственным именем (но как службу). Если это работает, это проблема с разрешениями. Наиболее вероятными являются разрешения HTTP.SYS.

Чтобы назначить доступ, вы используете netsh в Vista / Window 7 или httpcfg на XP.

0 голосов
/ 26 марта 2009

Проверяли ли вы, что в файлах конфигурации определена эта конфигурация как для приложения WinForms, так и для службы?

0 голосов
/ 25 марта 2009

Ничего в журнале событий о невозможности регистрации адреса?

Вы пытались отладить службу (используя присоединение к процессу Visual Studio)?

0 голосов
/ 25 марта 2009

Если вы находитесь на той же машине, я бы предложил использовать NetNamedPipeBinding вместо WSHttpBinding. Это быстрее Вы всегда можете переключиться обратно на ws-http, если вам понадобится использование нескольких машин в будущем.

Убедитесь, что ваш сервис на самом деле работает через TaskManager. Если нет, поместите оператор Debugger.Break () в конструктор вашей службы и найдите, где он не запускается. Здесь - это краткое пошаговое руководство по созданию службы Windows NT в C # (если вам это нужно).

0 голосов
/ 25 марта 2009

Откуда вы взяли код, из которого создается хост службы? Мое первое предположение заключается в том, что когда вы запускаете его как сервис, вы либо не создаете ServiceHost, либо не сохраняете ссылку на него (так что он получает мусор)

...