2012-04-17 5 views
3

Я пытаюсь разместить службу WCF на сервере Windows 2008 R2 в качестве службы Windows. Я следил за указаниями, предоставленными msdn (found here). Все работает отлично, пока все является частью одного и того же решения в визуальной студии. Однако я попытался создать клиент в другом решении (на том же компьютере), и он не может найти службу. Я получаю сообщение об ошибке «Добавить служебную ошибку», показанную ниже.Windows Service Hosted TCP WCF Service

enter image description here

Моя цель состоит в том, чтобы иметь возможность получить доступ к службе WCF удаленно, но я не могу даже получить доступ к нему локально, если клиент не был создан в рамках одного клиента. Есть ли какие-либо руководства, учебные пособия или полезные подсказки, которые каждый может дать мне, чтобы заставить это работать?

Обновление: Похоже, что хотя служба Windows работает, служба WCF, похоже, не слушает никаких портов. Который предположил бы, что он не работает. Это также объясняет, почему все сначала думали, что у меня нет службы. Я предположил, что, поскольку служба Windows работает и что работает тот же клиент решения, что служба WCF также работает. Оказывается, что Visual Studio запускала службу WCF всякий раз, когда я запускал тот же клиент решения.

Итак, почему услуга Windows не запускается из службы WCF? Есть идеи?

+0

У вас есть служба, работающая при попытке добавить ссылку на службу? –

+0

Да, как уже упоминалось выше, у меня было все, что было объяснено в учебнике, которое включает в себя запуск служб. –

+0

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

ответ

6

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

Служба Windows должна была начать службу WCF, однако на самом деле она пыталась начать снова, потому что обе службы имели одно и то же имя.

myServiceHost = new ServiceHost(typeof(Service1)); 

Чтобы устранить эту проблему, вы можете переименовать одну из услуг или полностью квалифицировать службу WCF, если ссылка на службу окон.

myServiceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1)); 

Самое смешное, что код при условии, по-прежнему выглядит, как это работает, потому что Visual Studio достаточно умна, чтобы заметить, что служба WCF не работает, и он запускает экземпляр позади сцены.

Это была простая ошибка для исправления, но поскольку Visual Studio скрывала эту проблему от меня, я не думаю, что нашел бы ее без помощи Espen Burud.

+0

Хорошая находка! Настолько тонко. –

3

Есть два пути для Add Reference Service, чтобы узнать о службе:

Discover кнопка: поиск проектов в текущем решении.
Кнопка Go: подключается к службе в поле Адрес и извлекает метаданные.

Перед тем, как нажать Go, необходимо запустить службу.

EDIT

Я просто заметил, с вашего экрана, который вы пытаетесь подключиться к net.tcp URL. Я думаю, что чаще всего используется http для MEX. Ваш app.config будет выглядеть примерно так:

<services> 
    <service behaviorConfiguration="WcfServiceLibrary1.Service1Behavior" 
    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" /> 
     <add baseAddress="http://localhost:8524/Service1" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 

Обратите внимание на другой номер порта для HTTP базового адреса. Затем вы использовали бы «http: // localhost: 8524/Service1» в инструменте «Добавить службу справки». Вы также можете подключиться к нему с помощью своего веб-браузера.

Чтобы разрешить обмен метаданными через HTTP GET (например, из браузера), вам также необходимо включить его через поведение:

<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <serviceMetadata httpGetEnabled="True"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

Я не уверен, если Add Service Reference инструмент заботится об этом.

Даже если вы не хотите разрешать доступ http получить (httpGetEnabled = "False"), вам все равно нужно включить это поведение, чтобы включить MEX (если вы не добавляете его программно).

+0

Да, я понимаю это, но это действительно не помогает моей проблеме. –

+0

Просто заметил что-то - см. Мое редактирование. –

+0

В учебнике, на котором я ссылался выше, вы используете обмен метаданными через tcp без добавления базового адреса http. Полагаю, я могу попробовать добавить http-адрес, чтобы узнать, работает ли он, но я действительно не хочу предоставлять доступ к службе через http. –

2

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

Чтобы убедиться, что служба прослушивает правильный порт tcp, вы можете использовать команду: netstat -a. Если услуга прослушивания на правильный порт, эта команда возвращает:

Proto Local Address   Foreign Address  State 
TCP 0.0.0.0:8523   machinename:0   LISTENING 
+0

У меня есть работа без изменений. Однако он создает клиента в рамках одного и того же решения.Если я попытаюсь создать клиент за пределами того же решения служб, он не сможет подключиться к сервису, даже если его на том же компьютере и службах работают нормально. –

+0

Это работает для меня, также когда я создал клиента в отдельном решении. –

+1

Итак, я попробовал команду 'netstat', которую вы предложили, и заметил, что даже несмотря на то, что служба Windows запущена, служба wcf, похоже, не работает. У вас была такая же проблема? Что может быть моей проблемой? –

0

Мне удалось выяснить проблему. Мой сервис не знал о конечных точках, потому что я не скопировал конфигурацию службы из app.config в проекте WCF в app.config фактической службы Windows. Как только я это сделал, он функционировал правильно.

Это не было ясн в оригинальной статье MSDN, которую я также выполнил, хотя она упоминается в комментарии в WCF app.config.