Проблема с размещением службы WCF в службе Windows - PullRequest
13 голосов
/ 20 мая 2011

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

protected override void OnStart(string[] args)
{
  serviceHost = new ServiceHost(typeof (RouterService));
  serviceHost.Open();
}

Сейчас это довольно минимально, так как я пытаюсь найти проблему. Так как я не поместил здесь обработку ошибок, любые исключения на этом этапе должны были помешать правильному запуску службы. Он запускается, а затем автоматически сразу останавливается.

Мой конфигурационный файл для службы WCF выглядит следующим образом:

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <system.serviceModel>
    <services>
      <service name="WcfService.RouterService"
               behaviorConfiguration="serviceBehavior" >
        <endpoint address="RouterService" contract="WcfService.IRouterService" binding="wsHttpBinding" bindingConfiguration="NoSecurity" />
        <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpBinding" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="NoSecurity">
          <security mode="None" />
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior" >
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Кроме того, я добавил пользователя NETWORK SERVICE (который запускается службой, чтобы иметь возможность прослушивать Http через указанный порт:

netsh http add urlacl url=http://+:8000/ user="NETWORK SERVICE"

Теперь в клиенте я выбираю Add Service Reference. Я могу найти сервер, и VS также удается создать конфигурацию и создать файлы прокси. Затем внутри клиента я создаю экземпляр прокси и открываю его. Все по-прежнему хорошо. Но при вызове первого метода на прокси я получаю следующее исключение:

Служба HTTP, расположенная по адресу http://localhost:8000/RouterService, слишком занята.

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

EDIT

Хорошо, теперь я обнаружил, что мой TestServer (не клиент Windows, а консольное приложение) также выдает ту же ошибку. Ранее сегодня этого не произошло, и служба WCF или TestServer не изменились.

Затем я попытался изменить порт на 8080 вместо 8000, и это сработало. Затем я попробовал то же самое для службы Windows, и это тоже сработало (после запуска команды netsh http на новом порту)

По какой-то причине что-то случилось с http на порту 8000. Я попытался перезагрузить систему также, конечно.

Это озадачивает меня, поэтому, если у кого-то есть какие-либо идеи о том, что здесь происходит, я был бы признателен.

Ответы [ 2 ]

13 голосов
/ 20 мая 2011

Хорошо, после долгих попыток выяснить, что здесь произошло, я нашел решение.

После того, как я создал службу Windows и попытался запустить ее, я не смог, потому что мне пришлось зарегистрировать пользователя NETWORK SERVICE, чтобы сначала прослушать http-пост 8000. Поэтому я выполнил эту команду:

netsh http add urlacl url = http://+:8000/RouterService user = "NETWORK SERVICE"

Это дало успешный результат, но затем я попытался запустить службу и получил то же сообщение об ошибке. Затем я выполнил ту же команду без указания RouterService:

netsh http add urlacl url = http://+:8000/ user = "NETWORK SERVICE"

Это дало успешный результат, и теперь моя служба Windows запустилась без проблем, но у меня возникли проблемы, упомянутые в вопросе выше.

Кажется, что первый вызов netsh вызывает все эти проблемы. Я попытался удалить его снова с помощью этой команды:

netsh http delete urlacl url = http://+:8000/RouterService

И тогда все заработало отлично.

Сука для отладки, так как исключение не имеет ничего общего с реальной проблемой, поэтому я надеюсь, что этот вопрос может спасти кого-то еще пару часов:)

4 голосов
/ 04 августа 2011

После ответа @ oyvind-knobloch-brathen рассмотрите возможность использования хорошо известных строк SID вместо ключа командной строки «user», это даст вам возможность переноса между культурами (у меня возникли проблемы на французской локализованной машине Win7).Для получения дополнительной информации см. SID строки .Для вашего случая это будет:

netsh http add urlacl url = http://+:8000/ sddl = "O: NS"

ссылка на SDDL на MSDN .

...