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

Posted

技术标签:

【中文标题】服务具有零个应用程序(非基础设施)端点【英文标题】:Service has zero application (non-infrastructure) endpoints 【发布时间】:2011-01-20 16:38:12 【问题描述】:

我最近创建了一个 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 从未被读取;至少不是我认为应该阅读的那本书。这可能是问题吗?如果是这样,我该如何解决这个问题。再次,任何帮助将不胜感激。

【问题讨论】:

服务契约的定义必须从service.dll.config复制到service.exe.config。 你能告诉我们服务的 app.config 吗?你在 NT 服务中有什么特别的东西来实例化/打开 ServiceHost 吗? pmichaels.net/2014/11/19/… 【参考方案1】:

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

 <service name="TechResponse">

成为

 <service name="SvcClient.TechResponse">

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

【讨论】:

是的,我们更改了命名空间,因此它无法找到与 .svc 文件中的服务匹配的服务(下划线换成了点!)起来。 也解决了我的问题,喜欢这些快速简单的修复! 添加 web.config 帮助我解决了这个错误。 这解决了我的问题!!!非常感谢!对于像我这样的所有新手:推荐这个非常清晰的教程:lourenco.co.za/blog/2013/08/…【参考方案2】:

端点也应该有命名空间:

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

【讨论】:

我在 app.config 中有这个,但我想在代码中更改它而不从 app.config 中删除它。使用带有新端点地址的新 ServiceHost 会出错。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

感谢您如此迅速地回复。我确实从我的 WCF (dll) 复制了我的 app.config,所以我认为这不是问题所在。但我确实觉得很奇怪,我能够使用 WcfTestclient.exe 启动我的 WCF (dll) 而没有任何问题。在我看来,如果配置文件有任何问题,它也应该在那里失败,而不仅仅是当我尝试在 Windows 服务主机 (exe) 中运行它时。如果我听起来“有点”失落,我深表歉意,不幸的是,我仍然是 WCF 和服务期的新手。还有其他建议吗?【参考方案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】:

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

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

<service name="ServiceNameSpace">

别忘了,服务标签需要一个完全限定的服务类名。

<service name="ServiceNameSpace.ServiceClass">

对于和我一样的其他人。

【讨论】:

你的意思是像我四年前在这里回答的那样? 它们看起来一样,但有一个区别。你的错误示例是关于只写类名(TechResponse),但我的只是写命名空间(ServiceNameSpace)。【参考方案7】:

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

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

这里是代码sn-p,

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

services 部分下的 App.config 文件中,我指的是旧的服务类名称,将其更改为 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>

【讨论】:

这里也一样。我更改了班级和合同名称的大写,一切正常。谢谢。【参考方案8】:

我遇到了同样的问题。在 VS2010 中一切正常,但是当我在 VS2008 中运行相同的项目时,我得到了上述异常。

我在 VS2008 项目中为使其正常工作所做的工作是添加对 ServiceHost 对象的 AddServiceEndpoint 成员的调用。

这是我的代码 sn-p:

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 地址。【参考方案9】:

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

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

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

    使用正确的全限定类名:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
    

    使用 mexHttpBinding 启用端点,最重要的是,使用 IMetadataExchange 合约:

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

【讨论】:

【参考方案10】:

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

记住配置中的这条评论:

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

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

【讨论】:

【参考方案11】:

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

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

【讨论】:

刚刚经历了同样的事情。可能很难找到,尤其是在重构大型代码库时。 记得在移动东西时更新 WCF 配置中的命名空间。【参考方案12】:

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

【讨论】:

这为我节省了很多时间。 :)【参考方案13】:

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

【讨论】:

【参考方案14】:

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

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

【讨论】:

【参考方案15】:

作为另一个线索,这确实解决了我的问题。

我正在将一些 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>

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

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

【讨论】:

【参考方案16】:

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

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

【讨论】:

【参考方案17】:

正如其他人所提到的,我的问题是我的托管应用程序的 app.config 中没有 system.serviceModel。例如:

<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>

【讨论】:

以上是关于服务具有零个应用程序(非基础设施)端点的主要内容,如果未能解决你的问题,请参考以下文章

程序设计基础第四章 程序的灵魂------算法

“找不到具有名称的端点元素...”

二叉树相关基础知识总结

具有外部和内部端点的 Service Fabric Web Api

Nginx的基础应用

Spring Boot响应式WebClient调用遗留端点