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


91

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

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

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

Описание:

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

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

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


2
Определение контракта службы необходимо скопировать из service.dll.config в service.exe.config.
Джон Сондерс,

1
Вы можете показать нам файл app.config службы ?? Делаете ли вы что-нибудь особенное в службе NT для создания / открытия ServiceHost?
marc_s

Ответы:


94

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

 <service name="TechResponse">

стал

 <service name="SvcClient.TechResponse">

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


Да, мы изменили пространства имен, поэтому он не смог найти сервис, соответствующий сервису в файле .svc (подчеркивание поменялось точкой!) Быстрая проверка имен сервисов показала, что случилось.

1
Решил и мою проблему, мне нравятся эти быстрые и простые исправления!
vfilby

Добавление web.config помогло мне решить эту ошибку.
Райан Родемойер

2
Это решило мою проблему !!! Большое спасибо! Для всех новичков вроде меня: предложите этот действительно понятный учебник: lourenco.co.za/blog/2013/08/…
Homer1982

12

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

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

У меня это есть в app.config, но я хочу изменить его в коде, не удаляя его из app.config. Использование new ServiceHost с новым адресом конечной точки дает ошибку.
Пол Маккарти

9

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

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


1
Спасибо, что ответили так быстро. Я скопировал файл app.config из своей WCF (dll), поэтому не думаю, что это проблема. Но мне просто кажется странным, что я могу без проблем запустить свою WCF (dll) с помощью WcfTestclient.exe. Мне кажется, что если что-то было ошибкой с файлом конфигурации, оно тоже должно было выйти из строя, а не только тогда, когда я пытаюсь запустить его на хосте службы Windows (exe). Прошу прощения, если я выгляжу "немного" потерянным, я все еще новичок в WCF и периоде обслуживания, к сожалению. Есть другие предложения?
user280626

9

Просто скопируйте файл 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();

1
Благодарность! передача адреса таким образом показала мне более подробную информацию об исключении. В моем случае просто порт использовался другим процессом :)
Эрнан Вейрас

У меня такая же проблема. Базовый адрес совпадает с адресом, когда вы нажимаете кнопку «Найти» в ссылке на добавление службы?
ZoomVirus

4

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

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

<service name="ServiceNameSpace">

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

<service name="ServiceNameSpace.ServiceClass">

Для других людей, подобных мне.


1
Вы имеете в виду, как я ответил здесь четыре года назад?
SteveCav 01

Они выглядят одинаково, но с одним отличием. Ваш неправильный пример касается записи только имени класса ( TechResponse), а мой - только пространства имен ( ServiceNameSpace).
Uur Aldanmaz

4

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

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

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

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

и в файле App.config в разделе services я имел в виду старое имя класса обслуживания, изменив его на исправленную проблему New 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>

Тоже самое. Я изменил заглавные буквы в имени моего класса и контракта, и все заработало. Спасибо.
Chazaq

3

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


Когда я использую этот метод, я получаю AddressAccessDeniedException, хотя я могу использовать этот адрес в качестве адреса addServiceReferance.
ZoomVirus

2

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

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

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

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

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

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

2

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

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

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

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


2

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

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


Просто испытал то же самое. Иногда бывает сложно найти, особенно при рефакторинге больших баз кода. Не забывайте обновлять пространства имен в конфигурации WCF при перемещении вещей.
Арве Систад,

2

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


Это сэкономило мне много времени. :)
Параг

1

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


1

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

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


1

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

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

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

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


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.