2009-03-25 2 views
4

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

<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> 
+0

Где вы запускаете код хостинга? – Grzenio

+0

Являются ли клиент и сервер на одной машине? Интересно, что «localhost» не является частью проблемы ... удаленный клиент не будет запрашивать «localhost» ... –

+1

Они находятся на одной машине. Опять же он работает как приложение, но не как сервис. –

ответ

2

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

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

+0

Я на самом деле это делаю. –

+0

Оказывается, Класс Timer, который я использовал (System.Threading.Timer и System.Forms.Timer не работал должным образом в службе) .Я заменил их System.Timers.Timer, который работает правильно. –

0

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

+0

Поле, содержащее сервис, находится в самой Сервисе, и его не следует собирать мусор. –

1

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

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

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

+0

Кроме того - если он не находится на том же компьютере, вам может потребоваться изменить адрес, который будет использоваться фактическим именем от клиента, а не «localhost». –

+0

Я работал как сам (локальный администратор с правами «Запуск как служба»). –

+0

Ну, стоит сделать снимок ... –

0

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

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

+0

Служба работает и выполняет Работа. –

0

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

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

0

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