94

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

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

所以我开始调查究竟是什么导致了这个问题,并从事件查看器中的应用程序日志中发现了这个错误。

描述:

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

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

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

4

17 回答 17

98

我刚刚遇到这个问题并通过将命名空间添加到服务名称来解决它,例如

 <service name="TechResponse">

变成了

 <service name="SvcClient.TechResponse">

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

于 2010-07-22T02:00:31.457 回答
12

端点也应该有命名空间:

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />
于 2010-09-08T14:21:41.077 回答
10

只需将 App.config 文件从服务项目复制到控制台主机应用程序并粘贴到此处,然后将其从服务项目中删除。

于 2011-02-13T01:36:38.253 回答
9

需要考虑的一件事是:您的 WCF 是否与 WindowsService (WS) 完全分离?WS 很痛苦,因为您对它们没有太多的控制或可见性。我试图通过将我所有的非 WS 内容放在它们自己的类中来缓解这种情况,这样它们就可以独立于主机 WS 进行测试。使用这种方法可能会帮助您消除与 WS 运行时相关的任何事情,尤其是您的服务。

John 很可能是正确的,这是一个 .config 文件问题。WCF 将始终查找执行上下文 .config。因此,如果您在不同的执行上下文中托管 WCF(即,使用控制台应用程序进行测试,并使用 WS 进行部署),则需要确保将 WCF 配置数据移至正确的 .config 文件。但对我来说,根本问题是你不知道问题出在哪里,因为 WS goo 挡住了路。如果您尚未对此进行重构以便可以在任何上下文(即单元测试或控制台)中运行您的服务,那么我建议您这样做。如果您在单元测试中启动您的服务,它可能会以与您在 WS 中看到的相同方式失败,这比使用令人讨厌的 WS 管道更容易调试而不是尝试这样做。

于 2010-02-24T19:36:23.803 回答
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();
于 2013-03-20T17:36:38.100 回答
5

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

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

<service name="ServiceNameSpace">

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

<service name="ServiceNameSpace.ServiceClass">

对于和我一样的其他人。

于 2014-12-05T11:50:04.807 回答
4

今天我遇到了同样的问题,在这里发布我的错误并更正它,以便它可以帮助某人。

在重构代码时,我实际上更改了服务类和 IService 名称,并将 ServiceHost 更改为指向这个新的服务类名称(如代码片段所示),但在我的主机应用程序 App.Config 文件中,我仍在使用旧的服务类名称.(参考下面片段中的配置部分的名称字段)

这是代码片段,

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

在服务部分下的 App.config 文件中,我指的是旧的服务类名称,将其更改为新的服务类名称解决了我的问题。

  <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>
于 2018-11-20T16:02:19.377 回答
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 文件中。

于 2010-09-22T12:10:40.340 回答
2

如果您的 WCF 服务的宿主应用程序的配置文件没有正确配置,则会出现此错误。

记住配置中的这条评论:

部署服务库项目时,必须将config文件的内容添加到宿主机的app.config文件中。System.Configuration 不支持库的配置文件。

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

于 2012-10-31T18:26:41.130 回答
2

我刚刚在我的服务中解决了这个问题。这是我收到的错误:

服务“EmailSender.Wcf.EmailService”的应用程序(非基础设施)端点为零。这可能是因为没有为您的应用程序找到配置文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在服务元素中没有定义端点。

这是我用来修复它的两个步骤:

  1. 使用正确的完全限定类名:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
    
  2. 使用 mexHttpBinding 启用端点,最重要的是,使用 IMetadataExchange 合约:

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    
于 2011-05-23T21:18:13.243 回答
2

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

例如:如果类名是 CalculatorService 并且配置文件引用 Calculatorservice ...你会得到这个错误。

于 2011-07-21T20:08:25.783 回答
2

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

于 2016-02-27T17:52:41.577 回答
1

我的问题是当我将 .svc 文件的默认 Service1 类重命名为更有意义的名称时,这导致 web.config 行为配置和端点对应于旧的命名约定。尝试修复您的 web.config。

于 2011-07-05T20:06:04.313 回答
1

对于那些使用控制台应用程序来托管 WCF 服务的人来说,要记住的一件重要事情是 WCF 项目中的Web.config文件被完全忽略。如果您的system.serviceModel配置在那里,那么您需要将该部分配置移动到您的控制台项目的App.config中。

这是关于确保在正确位置指定命名空间的答案的补充。

于 2016-03-18T02:07:59.503 回答
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>

但是当我添加第二个服务时,它停止工作,我意识到那些属性又在那里了。

我希望它可以节省您的时间。

于 2016-09-01T08:21:58.463 回答
0

正如其他人所提到的,我的问题是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>
于 2021-08-10T21:43:48.423 回答
0

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

解决方法是我正确地勾选了我的 App.config 文件并选择了编辑 WCF 配置。然后,我执行了创建服务的步骤,以便可以连接到我的 WCF 服务。现在我的 App.config 中有两个端点,而不仅仅是一个。一个端点用于连接到 WCF 服务库,另一个用于托管它。

于 2017-10-04T04:05:24.023 回答