服务具有零个应用程序(非基础结构)端点


91

我最近创建了WCF服务(dll)和服务主机(exe)。我知道我的WCF服务正常运行,因为我能够成功将服务添加到WcfTestClient。

但是,当我从服务主机(exe)中使用WCF时似乎遇到了一个问题。我可以将对WCF(dll)的引用添加到我的服务主机(exe),并为exe创建必要的组件。例如服务安装程序,服务主机和app.config,然后使用InstallUtil编译并最终安装exe。但是,当我尝试在Microsoft管理控制台中启动服务时,该服务在启动后立即停止。

因此,我开始研究到底是什么引起了该问题,并从事件查看器中的应用程序日志中发现了此错误。

描述:

服务无法启动。System.InvalidOperationException:服务“服务”具有零个应用程序(非基础结构)端点。这可能是因为没有为您的应用程序找到配置文件,或者是因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在服务元素中未定义端点。

该错误实际上是在OnStart;中产生的。我的exe的名称,当我执行此调用时ServiceHost.Open()。我见过很多帖子,其他人也遇到过这个问题,但是大多数(如果不是全部)都声称服务名称或合同;未指定名称空间和类名称。我在配置文件中检查了这两个条目;在exe和dll中,它们完全匹配。我在办公室里有其他人在我身后仔细检查,以确保我不会在某一时刻失明,但他们当然得出了与我相同的结论,即一切看起来都正确地指定了。我对现在发生的事情确实迷失了。有人可以帮我解决这个问题吗?

可能发生这种情况的另一件事是,从未读取过app.config。至少不是我认为应该读的书。这可能是问题吗?如果是这样,我该如何解决这个问题。再次,任何帮助将不胜感激。


2
服务合同的定义必须从service.dll.config复制到service.exe.config。
约翰·桑德斯

1
您可以向我们展示该服务的app.config吗?您在NT服务中是否执行任何特殊操作以实例化/打开ServiceHost?
marc_s

Answers:


93

我只是遇到了这个问题,并通过将名称空间添加到服务名称来解决了该问题,例如

 <service name="TechResponse">

成为

 <service name="SvcClient.TechResponse">

我还看到它通过Web.config而不是App.config解决。


是的,我们更改了名称空间,使其无法在.svc文件中找到与之匹配的服务(下划线被点号替换了!)快速检查服务名称发现了问题所在。

1
也解决了我的问题,喜欢这些快速简便的修复程序!
vfilby 2012年

添加web.config可以帮助我解决此错误。
Ryan Rodemoyer 2014年

2
这解决了我的问题!!!非常感谢!对于像我这样的所有新生代:建议这个非常清晰的教程:lourenco.co.za/blog/2013/08/…–
Homer1982

12

端点还应该具有名称空间:

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

我在app.config中有这个,但是我想在代码中更改它而不将其从app.config中删除。将新的ServiceHost与新的终结点地址一起使用会产生错误。
Paul McCarthy

9

要考虑的一件事是:您的WCF是否与WindowsService(WS)完全分离?WS之所以痛苦,是因为您对其没有太多的控制权或可见性。我试图通过将所有非WS知识放到自己的类中来减轻这种情况,以便可以独立于宿主WS进行测试。使用这种方法可能有助于您消除WS运行时与服务(尤其是服务)之间发生的一切。

John可能是正确的,它是.config文件问题。WCF将始终寻找执行上下文.config。因此,如果要在不同的执行上下文中托管WCF(即,使用控制台应用程序进行测试,并使用WS进行部署),则需要确保已将WCF配置数据移至正确的.config文件中。但是对我而言,潜在的问题是您不知道问题出在哪里,因为WS goo妨碍了您。如果您还没有重构它,以便可以在任何上下文中(即单元测试或控制台)运行服务,那么我建议这样做。如果您在单元测试中启动服务,则可能会出现与WS相同的失败方式,这比调试WS管道要麻烦得多,而调试起来要容易得多。


1
感谢您如此迅速的回复。我确实从WCF(dll)复制了我的app.config,所以我不认为这是问题所在。但是我确实觉得很奇怪,我能够使用WcfTestclient.exe启动WCF(dll),而没有任何问题。在我看来,如果配置文件中有任何问题,它也应该在那里失败,而不仅仅是在我尝试在Windows Service Host(exe)中运行它时。如果我听到“丢失”的声音,我深表歉意。不幸的是,我仍然是WCF和服务期的新手。还有其他建议吗?
user280626'2

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
谢谢!通过这种方式传递地址,向我显示了该异常的更多详细信息。在我的情况下,端口只是被另一个进程使用了​​:)
Hernan Veiras 2014年

我有一个相同的问题,基址是否与您在添加服务引用中单击发现时的地址相同?
ZoomVirus 2014年

4

为WCF准备配置很困难,有时会忽略服务类型定义。

我只在服务标签中写了名称空间,所以我遇到了同样的错误。

<service name="ServiceNameSpace">

不要忘记,服务标签需要完全限定的服务类名称。

<service name="ServiceNameSpace.ServiceClass">

对于像我这样的其他人。


1
你是说像我四年前在这里回答?
SteveCav '16

它们看起来相同,但有一个区别。您的错误示例只写了类名(TechResponse),而我只写了名字空间(ServiceNameSpace)。
维吾尔族Aldanmaz

4

今天,我遇到了同样的问题,在这里发布了我的错误和更正,以便对他人有所帮助。

在重组代码时,我实际上已经更改了Service类和IService名称,并更改了ServiceHost以指向此新的Service类名称(如代码段所示),但是在我的主机应用程序App.Config文件中,我仍在使用旧的Service类名称。 。(请参见以下代码段中的“配置”部分的名称字段)

这是代码片段,

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

在App.config文件的“ 服务 ”部分下,我指的是旧的serviceclass名称,对我来说,将其更改为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项目中所做的就是将调用添加到AddServiceEndpointServiceHost对象的成员。

这是我的代码段:

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文件中。


当我使用此方法时,即使我可以将此地址用作addServiceReferance地址,也会得到AddressAccessDeniedException。
ZoomVirus 2014年

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不支持库的配置文件。

如果您在IIS中托管了WCF服务,则在运行时通过VS.NET它将读取服务库项目的app.config,但在部署后将读取主机的web.config。如果web.config不具有相同的<system.serviceModel>配置,则将收到此错误。完成配置后,请确保从app.config复制配置。


2

我只是遇到了这个问题,并检查了以上所有答案,以确保我没有发现任何明显的问题。好吧,我有一个半明显的问题。我的代码中的类名大小写与配置文件中使用的类名不匹配。

例如:如果类名是CalculatorService,而配置文件引用了Calculatorservice ...,则会出现此错误。


刚刚经历过同样的事情。很难找到,尤其是在重构大型代码库时。移动时,切记要在WCF配置中更新名称空间。
到达Arve Systad

2

我在管理员模式下运行了Visual Studio,并且对我有用:)另外,请确保用于编写WCF配置的app.config文件必须位于使用“ ServiceHost”类的项目中,而不是实际的WCF服务中项目。


这节省了我很多时间。:)
Parag

1

我的问题是,当我将.svc文件的默认Service1类重命名为一个更有意义的名称时,这导致web.config behaviorConfiguration和Endpoint与旧的命名约定相对应。尝试修复您的web.config。


1

对于那些使用控制台应用程序托管WCF服务的人员,要记住的一件重要事情是WCF项目中的Web.config文件被完全忽略了。如果您的system.serviceModel配置在那里,则需要将config的该部分移至Console项目的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

当我创建的WCF服务库未连接进行托管,但已连接进行连接时,Windows服务中出现此错误。我没有终点。(我希望在Windows服务中同时进行连接和托管,以便可以将WCF服务提供给其他连接使用,并使Windows Service的主要过程也可以使用它来在计时器/计划上执行各种任务。)

解决的方法是,我右键单击了App.config文件,然后选择“编辑WCF配置”。然后,我执行了创建服务的步骤,以便可以连接到WCF服务。现在,我的App.config中有两个端点,而不仅仅是一个。一个端点用于连接到WCF服务库,另一个端点用于承载它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.