Сервис не имеет конечных точек приложений (не инфраструктурных) - PullRequest
86 голосов
/ 24 февраля 2010

Я недавно создал службу WCF (dll) и хост службы (exe). Я знаю, что мой сервис WCF работает правильно, так как я могу успешно добавить сервис в WcfTestClient.

Тем не менее, мне кажется, что я сталкиваюсь с проблемой, когда пытаюсь использовать WCF с хоста службы (exe). Я могу добавить ссылку на WCF (dll) на мой сервисный хост (exe) и создать необходимые компоненты для exe; например, установщик службы, узел службы и файл app.config, скомпилируйте и, наконец, установите exe-файл с помощью InstallUtil. Но когда я попытался запустить службу в консоли управления Microsoft, служба сразу же останавливается после запуска.

Поэтому я начал исследовать, что именно могло быть причиной этой проблемы, и обнаружил эту ошибку в журнале приложений в средстве просмотра событий.

Описание:

Служба не может быть запущена. System.InvalidOperationException: Сервис «Сервис» имеет нулевую заявку (не инфраструктурные) конечные точки. это может быть потому, что нет файла конфигурации был найден для вашего приложения, или потому что не соответствует элементу службы название службы можно найти в файл конфигурации, или потому что нет конечные точки были определены в службе элемент.

Эта ошибка фактически генерируется в OnStart; моего exe, когда я выполняю этот вызов ServiceHost.Open(). Я видел множество постов, где другие люди сталкивались с этой проблемой, однако большинство, если не все, утверждают, что название сервиса или контракт; пространство имен и имя класса, не указываются. Я проверил обе эти записи в моем конфигурационном файле; в exe, а также в dll, и они совпадают идеально. У меня в офисе были другие люди, которые дважды проверяли меня, чтобы убедиться, что я не ослепну в один момент, но, конечно, они пришли к тому же выводу, что и я, что все выглядело так, как будто указано правильно. Я действительно в растерянности относительно того, что происходит в данный момент. Может ли кто-нибудь помочь мне с этим вопросом?

Другая возможная причина, по которой это может происходить, заключается в том, что app.config никогда не читается; по крайней мере, не тот, который, я думаю, должен быть прочитан. Может ли это быть проблемой? Если да, то как я могу решить эту проблему? Опять же, любая помощь будет оценена.

Ответы [ 16 ]

2 голосов
/ 24 мая 2011

Я только что проработал эту проблему на своем сервисе. Вот ошибка, которую я получил:

Сервис 'EmailSender.Wcf.EmailService' не имеет конечных точек приложения (неинфраструктуры). Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или из-за невозможности найти элемент службы, соответствующий имени службы, в файле конфигурации или из-за отсутствия конечных точек в элементе службы.

Вот два шага, которые я использовал, чтобы исправить это:

  1. Используйте правильное полное имя класса:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
    
  2. Включите конечную точку с mexHttpBinding и, самое главное, используйте контракт IMetadataExchange:

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    
1 голос
/ 01 сентября 2016

Как еще одна подсказка, это действительно исправило эту проблему в моем случае.

Я перенесу некоторые службы WCF из консольного приложения (которое настраивается в коде немногих служб WCF) в Azure WebRole, чтобы опубликовать их в Azure. Каждый раз, когда я добавляю новый сервис, VS редактирует мой web.config и добавляет эту строку:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">

Что ж, со всеми приведенными выше советами и ответами я не мог заставить его работать, пока не удалил все атрибуты в элементе serviceHostingEnvironment. Как видите, я не рок-звезда WCF, но я настроил его на работу с первым Сервисом, просто настроив его как:

<service name="FirstService" behaviorConfiguration="metadataBehavior">
                <endpoint address=""
                 binding="wsHttpBinding"
                 bindingConfiguration="WSHttpBinding_WcfServicesBinding"
                 contract="IFirstService" />

            </service>

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

Надеюсь, это сэкономит ваше время.

1 голос
/ 18 марта 2016

Для тех, кто работает с консольным приложением для размещения службы WCF, следует помнить, что файл Web.config в проекте WCF полностью игнорируется. Если у вас есть конфигурация system.serviceModel, вам нужно переместить этот раздел конфигурации в App.config вашего консольного проекта.

Это в дополнение к ответам относительно того, как пространство имен указано в нужных местах.

1 голос
/ 22 июля 2011

Я просто столкнулся с этой проблемой и проверил все приведенные выше ответы, чтобы убедиться, что я не пропустил ничего очевидного. Ну, у меня была полуочевидная проблема. Мой регистр моего имени класса в коде и имя класса, которое я использовал в файле конфигурации, не совпадали.

Например: если имя класса CalculatorService и файл конфигурации относится к Calculatorservice ... Вы получите эту ошибку.

1 голос
/ 06 июля 2011

Моя проблема состояла в том, что я переименовал свой класс Service1 по умолчанию для файла .svc в более осмысленное имя, что привело к тому, что web-конфигурация и конечная точка web.config соответствуют старому соглашению об именах. Попробуйте исправить ваш web.config.

0 голосов
/ 04 октября 2017

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

Исправлено то, что я щелкнул правой кнопкой мыши по файлу App.config и выбрал «Редактировать конфигурацию WCF». Затем я выполнил шаги для создания службы, чтобы подключиться к моей службе WCF. Теперь у меня в App.config было две конечные точки, а не одна. Одна конечная точка была для подключения к сервисной библиотеке WCF, а другая - для ее размещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...