服务没有应用程序(非基础设施)端点
我最近创build了一个WCF服务(dll)和一个服务主机(exe)。 我知道我的WCF服务工作正常,因为我能够成功地将服务添加到WcfTestClient。
但是,我似乎遇到了一个问题,当我从服务主机(EXE)使用我的WCF。 我可以添加一个对WCF(DLL)的引用到我的服务主机(EXE),并创buildexe的必要组件; 如服务安装程序,服务主机和app.config,编译,然后最终使用InstallUtil安装该exe文件。 但是,当我尝试在Microsoftpipe理控制台中启动服务时,服务在启动后立即停止。
所以我开始调查究竟是什么原因导致这个问题出现在应用程序日志中的事件查看器中的错误。
描述:
服务无法启动。 System.InvalidOperationException:服务“服务”没有应用程序(非基础设施)端点。 这可能是因为没有为您的应用程序findconfiguration文件,或者是因为在configuration文件中找不到匹配服务名称的服务元素,或者是因为服务元素中没有定义端点。
这个错误实际上是在OnStart
产生的; 我的exe,当我执行此调用ServiceHost.Open()
。 我看过很多其他人遇到这个问题的post,但是大多数(如果不是全部的话)声称服务名称或合同; 命名空间和类名,没有被指定。 我在我的configuration文件中检查了这两个条目; 在EXE以及在DLL中,他们匹配完美。 我有办公室里的其他人仔细检查,确保我一点都不盲目,但当然他们得出和我一样的结论,一切看起来都是正确的。 在这一点上我真的很迷茫。 有谁能帮我解决这个问题吗?
另一件可能的原因是app.config永远不会被读取; 至less不是我认为应该阅读的那个。 这可能是问题吗? 如果是这样,我该怎么去解决这个问题。 再次,任何帮助将不胜感激。
我刚刚遇到了这个问题,并通过将名称空间添加到服务名称来解决它,例如
<service name="TechResponse">
成为
<service name="SvcClient.TechResponse">
我也看到它解决了一个Web.config而不是一个App.config。
端点还应该有名称空间:
<endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />
有一点要考虑的是:你的WCF与WindowsService(WS)完全脱钩了吗? WS是痛苦的,因为你对他们没有太多的控制和可见性。 我试图通过在自己的类中使用所有非WS的东西来减轻这个负担,以便可以独立于主机WS进行testing。 使用这种方法可以帮助您消除WS运行时发生的任何事情,特别是与您的服务相比。
约翰可能是正确的,它是一个.config文件的问题。 WCF将始终查找执行上下文.config 。 因此,如果您在不同的执行上下文中托pipeWCF(即使用控制台应用程序进行testing,并使用WS进行部署),则需要确保将WCFconfiguration数据移至正确的.config文件。 但是对我来说,根本的问题是你不知道问题是什么,因为WS goo阻碍了你。 如果你还没有重构,那么你可以在任何情况下(即unit testing或控制台)运行你的服务,那么我会build议你这么做。 如果你在一个unit testing中把你的服务放在一个地方,那么你可能会用同样的方式来看待WS,这个WS更容易debugging,而不是试图用这个糟糕的WSpipe道来实现。
只需将App.config文件从服务项目复制到控制台主机应用程序并粘贴到此处,然后将其从服务项目中删除即可。
当我以编程方式添加它时,我得到了一个更详细的exception – 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();
我有同样的问题。 一切工作在VS2010中,但是当我在VS2008中运行相同的项目时,我得到了提到的exception。
我在VS2008项目中做的工作就是向我的ServiceHost对象的AddServiceEndpoint
成员添加一个调用。
这是我的代码片段:
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文件中。
为WCF准备工作是困难的,有时服务types定义不被注意。
我只写了服务标签中的命名空间,所以我得到了同样的错误。
<service name="ServiceNameSpace">
不要忘记,服务标签需要一个完全合格的服务类名称。
<service name="ServiceNameSpace.ServiceClass">
对于像我这样的其他人
我刚刚在我的服务上解决了这个问题。 这是我收到的错误:
服务“EmailSender.Wcf.EmailService”没有应用程序(非基础设施)端点。 这可能是因为没有为您的应用程序findconfiguration文件,或者是因为在configuration文件中找不到匹配服务名称的服务元素,或者是因为服务元素中没有定义端点。
以下是我用来修复它的两个步骤:
-
使用正确的完全合格的类名称:
<service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
-
使用mexHttpBinding启用端点,最重要的是使用IMetadataExchange协定:
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
我的问题是当我将我的默认Service1类.svc文件重命名为更有意义的名称,这导致web.config behaviorConfiguration和端点对应于旧的命名约定。 尝试修复你的web.config。
如果您的WCF服务的托pipe应用程序的configuration文件没有正确的configuration,则会发生此错误。
记住这个configuration的评论:
在部署服务库项目时,必须将configuration文件的内容添加到主机的app.config文件中。 System.Configuration不支持库的configuration文件。
如果你有一个在IIS中托pipe的WCF服务,在运行时通过VS.NET它将读取服务库项目的app.config,但读取主机的web.config一旦部署。 如果web.config没有相同的<system.serviceModel>
configuration,您将收到此错误。 一旦完成,请确保从app.config复制configuration。
我刚刚遇到这个问题,并检查了所有上述的答案,以确保我没有失去任何明显的东西。 那么,我有一个半明显的问题。 我在代码中的classname的shell和我在configuration文件中使用的classname不匹配。
例如:如果类名是CalculatorService,并且configuration文件引用了Calculatorservice …则会出现此错误。
我以pipe理员模式运行Visual Studio,并为我工作:)另外,请确保您用于编写WCFconfiguration的app.config文件必须位于使用“ServiceHost”类的项目中,而不是在实际的WCF服务中项目。
对于使用Console应用程序来托pipeWCF服务的人来说,记住一件重要的事情是WCF项目中的Web.config文件被完全忽略。 如果您的system.serviceModel
configuration存在,那么您需要将该configuration部分移到Console项目的App.config 。
这是关于确保在正确位置指定名称空间的答案的补充。
另一个线索,这确实解决了这个问题在我的情况。
我正在将一些WCF服务从控制台应用程序(在代码中configuration几个WCF服务)迁移到Azure WebRole以在Azure中发布它们。 每次我添加一个新的服务VS编辑我的web.config并添加此行:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
那么,以上的所有build议和答案,我不能让它工作,直到我删除了serviceHostingEnvironment元素中的所有属性。 正如你所看到的,我不是一个WCF摇滚明星,但我把它configuration为:
<service name="FirstService" behaviorConfiguration="metadataBehavior"> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_WcfServicesBinding" contract="IFirstService" /> </service>
但是当我添加第二个服务,它停止工作,我意识到那些属性在那里再次。
我希望它能节省你的时间。
当我创build的WCF服务库没有连接托pipe,但连接了连接时,我在Windows服务中有这个错误。 我错过了一个端点。 (我希望连接和托pipe在我的Windows服务,以便我可以提供WCF服务到其他连接,以及我的Windows服务的主要过程也使用它以及定时器/时间表上执行各种任务。)
解决方法是我右键单击我的App.config文件,然后select编辑WCFconfiguration。 然后,我做了创build服务的步骤,以便我可以连接到我的WCF服务。 现在我的App.config中有两个端点,而不仅仅是一个。 一个端点是连接到WCF服务库,另一个是托pipe它。