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

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

17 ответов

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

 <service name="TechResponse">

стал

 <service name="SvcClient.TechResponse">

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

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

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

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

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

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

Я получил более подробное исключение, когда я добавил его программно - 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();

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

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

<service name="ServiceNameSpace">

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

<service name="ServiceNameSpace.ServiceClass">

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

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

При реструктуризации кода я фактически изменил имена классов Service и IService и изменил ServiceHost, чтобы он указывал на это новое имя класса Service (как показано в фрагменте кода), но в файле App.Config хост-приложений я все еще использовал старое имя класса Service.(см. поле имени раздела конфигурации в следующем фрагменте)

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

 ServiceHost myServiceHost = new ServiceHost(typeof(NewServiceClassName)); 

и в файле App.config в разделе services я ссылался на старое имя serviceclass, меняя его на исправленную для меня новую проблему ServiceClassName.

  <service name="ProjectName.OldServiceClassName"> 
        <endpoint address="" binding="basicHttpBinding" contract="ProjectName.IService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress=""/>
          </baseAddresses>
        </host>
      </service>

У меня такая же проблема. Все работает в 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как уже упоминали другие, моя проблема заключалась в том, что у меня не было system.serviceModelв моем приложении для хостинга app.config. Например:

      <configuration>
  ...
  <system.serviceModel>
    <services>
      <service name="Services.MyServiceManager">
        <endpoint address="net.tcp://localhost:8009/MyService"
                  binding="netTcpBinding"
                  contract="Contracts.IMyService" />
      </service>
    </services>
  </system.serviceModel>
</configuration>
Другие вопросы по тегам