Служба имеет нулевые приложения (неинфраструктурные) конечные точки

Недавно я создал службу 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 никогда не читается; по крайней мере, не тот, который, как мне кажется, должен читаться. Может ли это быть проблемой? Если да, то как я могу решить эту проблему. Опять же, любая помощь будет оценена по достоинству.

Ответ 1

У меня возникла эта проблема и разрешили ее, добавив пространство имен к имени службы, например.

 <service name="TechResponse">

стал

 <service name="SvcClient.TechResponse">

Я также видел, как он разрешен с помощью Web.config вместо App.config.

Ответ 2

Конечная точка также должна иметь пространство имен:

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />

Ответ 3

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

Джон, скорее всего, прав, что это проблема с файлом .config. WCF всегда будет искать контекст выполнения .config. Поэтому, если вы размещаете свой WCF в разных контекстах выполнения (т.е. Тестируете с помощью консольного приложения и развертываете с помощью WS), вам нужно убедиться, что данные конфигурации WCF переместились в соответствующий файл .config. Но основная проблема для меня заключается в том, что вы не знаете, в чем проблема, потому что WS goo мешает. Если вы еще не отредактировали это, чтобы вы могли запускать свою службу в любом контексте (то есть, unit test или консоль), тогда я бы посоветовал сделать это. Если вы развернули свое обслуживание в unit test, это, скорее всего, потерпит неудачу так же, как вы видите, с WS, который гораздо легче отлаживать, чем пытаться сделать это с помощью yucky WS plumbing.

Ответ 4

Просто скопируйте файл App.config из проекта службы в приложение хоста консоли и вставьте сюда, а затем удалите его из проекта службы.

Ответ 5

Я получил более подробное исключение, когда я добавил его программно - AddServiceEndpoint:

string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));  

host.AddServiceEndpoint(typeof(MyNamespace.IService),
                        new BasicHttpBinding(), baseAddress);
host.Open();

Ответ 6

У меня была та же проблема. Все работает в VS2010, но когда я запускаю тот же проект в VS2008, я получаю указанное исключение.

Что я сделал в своем проекте VS2008, чтобы заставить его работать, было добавление вызова к элементу AddServiceEndpoint моего объекта ServiceHost.

Вот мой фрагмент кода:

Uri baseAddress = new Uri("http://localhost:8195/v2/SystemCallbackListener");

ServiceHost host = new ServiceHost(typeof(SystemCallbackListenerImpl), baseAddress);

host.AddServiceEndpoint(typeof(CsfServiceReference.SystemCallbackListener),
                        new BasicHttpBinding(),
                        baseAddress);
host.Open();

Я не изменял файл app.config. Но я предполагаю, что конечная точка службы также может быть добавлена ​​в файл .config.

Ответ 7

Для подготовки конфигурации для WCF сложно, и иногда определение типа сервиса остается незамеченным.

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

<service name="ServiceNameSpace">

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

<service name="ServiceNameSpace.ServiceClass">

Для других людей, которые похожи на меня.

Ответ 8

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

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

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

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

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

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    

Ответ 9

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

Ответ 10

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

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

Ответ 11

Эта ошибка возникает, если конфигурационный файл хостинг-приложения вашей службы WCF не имеет надлежащей конфигурации.

Помните этот комментарий из конфигурации:

При развертывании проекта библиотеки служб содержимое конфигурации файл должен быть добавлен в файл хоста app.config. Конфигурация системы не поддерживает файлы конфигурации для библиотек.

Если у вас есть служба WCF, размещенная в IIS, во время выполнения через VS.NET он прочитает файл app.config проекта библиотеки обслуживания, но прочитает веб-хост web.config после его развертывания. Если у web.config нет идентичной конфигурации <system.serviceModel>, вы получите эту ошибку. Обязательно скопируйте конфигурацию из app.config после ее улучшения.

Ответ 12

Я запускал Visual Studio в режиме администратора, и это сработало для меня:) Кроме того, убедитесь, что файл app.config, который вы используете для записи конфигурации WCF, должен находиться в проекте, где используется класс "ServiceHost", а не в фактическом проекте службы WCF.

Ответ 13

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

Это дополнение к ответам, касающимся обеспечения пространства имен в нужных местах.

Ответ 14

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

Я переношу некоторые службы 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>

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

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

Ответ 15

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

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