我最近创建了一个WCF服务(dll)和一个服务主机(exe)。我知道我的WCF服务正常工作,因为我能够成功地将服务添加到WcfTestClient。
然而,当我从服务主机(exe)开始使用我的WCF时,我似乎遇到了一个问题。我可以向我的服务主机(exe)添加对WCF(dll)的引用,并为exe创建必要的组件;例如服务安装程序,服务主机和app.config,编译然后最后使用InstallUtil安装exe。但是,当我尝试在Microsoft管理控制台中启动该服务时,该服务在启动后立即停止。
因此,我开始调查可能导致此问题的原因是从事件查看器中的应用程序日志中得出此错误。
描述:
无法启动服务。 System.InvalidOperationException: 服务'服务'没有应用 (非基础设施)端点。这个 可能是因为没有配置文件 是为您的申请找到的,或 因为没有服务元素匹配 服务名称可以在。中找到 配置文件,或因为没有 端点是在服务中定义的 元件。
此错误实际上是在OnStart
生成的;当我执行此调用ServiceHost.Open()
时,我的exe。我看过很多其他人遇到过这个问题的帖子,但是大多数(如果不是全部的话)声称服务名称或合同;命名空间和类名,未指定。我在配置文件中检查了这两个条目;在exe和dll中,它们完美匹配。我已经让办公室里的其他人仔细检查我,以确保我不会在某一点上失明,但当然他们得出了与我相同的结论,即一切看起来都是正确的。对于此时发生的事情,我真的很迷茫。任何人都可以帮我解决这个问题吗?
另一件可能导致这种情况发生的原因是app.config永远不会被读取;至少不是我认为应该阅读的那个。这可能是问题吗?如果是这样,我该如何解决这个问题。再次,任何帮助将不胜感激。
答案 0 :(得分:90)
我遇到了这个问题并通过将名称空间添加到服务名称来解决它,例如
<service name="TechResponse">
成了
<service name="SvcClient.TechResponse">
我也看到它使用Web.config而不是App.config解决。
答案 1 :(得分:10)
端点还应具有命名空间:
<endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />
答案 2 :(得分:9)
只需将App.config文件从服务项目复制到控制台主机应用程序并粘贴到此处,然后将其从服务项目中删除。
答案 3 :(得分:8)
要考虑的一件事是:您的WCF是否完全与WindowsService(WS)脱钩? WS很痛苦,因为你对它们没有很多控制或可见性。我尝试通过将所有非WS内容放在他们自己的类中来缓解这种情况,这样他们就可以独立于主机WS进行测试。使用此方法可以帮助您消除WS运行时与特定服务发生的任何事情。
John可能是正确的,它是.config文件问题。 WCF将始终查找执行上下文.config 。因此,如果您在不同的执行上下文中托管WCF(即,使用控制台应用程序进行测试,并使用WS进行部署),则需要确保将WCF配置数据移至正确的.config文件中。但对我来说,潜在的问题是你不知道问题是什么,因为WS goo阻碍了。如果你还没有重构,那么你可以在任何上下文(即单元测试或控制台)中运行你的服务,那么我建议你这样做。如果你在一个单元测试中旋转你的服务,它可能会失败的方式与你看到的WS一样容易调试,而不是试图用令人讨厌的WS管道这样做。
答案 4 :(得分:4)
准备WCF的配置很困难,有时服务类型定义会被忽视。
我只在服务标签中写了命名空间,所以我得到了同样的错误。
<service name="ServiceNameSpace">
不要忘记,服务标签需要一个完全合格的服务类名称。
<service name="ServiceNameSpace.ServiceClass">
对于像我这样的其他人。
答案 5 :(得分:4)
当我以编程方式添加它时,我得到了一个更详细的例外 - 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 :(得分:3)
我遇到了同样的问题。一切都在VS2010中有效但是当我在VS2008中运行相同的项目时,我得到了提到的异常。
我在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文件中。
答案 7 :(得分:3)
今天,我遇到了同样的问题,在这里发布了我的错误和更正,以便对他人有所帮助。
在重组代码时,我实际上已经更改了Service类和IService名称,并更改了ServiceHost以指向这个新的Service类名称(如代码片段所示),但是在我的主机应用程序App.Config文件中,我仍然使用旧的服务类名称。(请参见下面的代码段中的“配置”部分的名称字段)
这是代码段,
ServiceHost myServiceHost = new ServiceHost(typeof(NewServiceClassName));
,在 services 部分下的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>
答案 8 :(得分:2)
如果WCF服务的托管应用程序的配置文件具有正确的配置,则会发生此错误。
记住配置中的这条评论:
部署服务库项目时,配置的内容 必须将文件添加到主机的app.config文件中。系统配置 不支持库的配置文件。
如果您在IIS中托管了WCF服务,则在运行时通过VS.NET,它将读取服务库项目的app.config,但在部署后读取主机的web.config。如果web.config没有相同的<system.serviceModel>
配置,您将收到此错误。确保在完成配置后从app.config复制配置。
答案 9 :(得分:2)
我在管理员模式下运行Visual Studio,它对我有用:) 另外,请确保您用于编写WCF配置的app.config文件必须位于&#34; ServiceHost&#34;使用了类,而不是在实际的WCF服务项目中。
答案 10 :(得分:2)
我刚刚在我的服务上解决了这个问题。这是我收到的错误:
服务'EmailSender.Wcf.EmailService'没有应用程序(非基础架构)端点。这可能是因为没有为您的应用程序找到配置文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在服务元素中没有定义端点。
以下是我用来修复它的两个步骤:
使用正确的完全限定类名:
<service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
使用mexHttpBinding启用端点,最重要的是,使用IMetadataExchange合同:
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
答案 11 :(得分:1)
我刚遇到这个问题并检查了上述所有答案,以确保我没有遗漏任何明显的问题。好吧,我有一个半明显的问题。我的代码中的classname和我在配置文件中使用的类名不匹配。
例如:如果类名是CalculatorService 配置文件是指Calculatorservice ... 你会收到这个错误。
答案 12 :(得分:1)
我的问题是当我将.svc文件的默认Service1类重命名为更有意义的名称时,这导致web.config behaviorConfiguration和endpoint对应于旧的命名约定。尝试修复您的web.config。
答案 13 :(得分:1)
对于使用Console应用程序来托管WCF服务的人来说,要记住的一件重要事情是WCF项目中的 Web.config 文件被完全忽略。如果您的system.serviceModel
配置存在,那么您需要将该部分配置移动到您的控制台项目的 App.config 。
这是有关确保在正确位置指定名称空间的答案的补充。
答案 14 :(得分: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>
但是当我添加第二个服务时,它停止工作,我意识到那些属性再次出现。
我希望它可以节省你的时间。
答案 15 :(得分:0)
当我创建的WCF服务库未连接进行托管但已连接以进行连接时,我在Windows服务中出现此错误。我错过了一个端点。 (我希望在我的Windows服务中连接和托管,以便我可以将WCF服务提供给其他连接,以及让我的Windows服务的主要进程使用它以及在计时器/日程表上执行各种任务。)
修复是我右键检查了我的App.config文件并选择了编辑WCF配置。然后,我完成了创建服务的步骤,以便我可以连接到我的WCF服务。现在我的App.config中有两个端点,而不仅仅是一个端点。一个端点用于连接到WCF服务库,另一个端点用于托管它。
答案 16 :(得分:0)
正如其他人所提到的,我的问题是我的托管应用程序的 app.config 中没有 <html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
</head>
<body>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script type="text/javascript" src="{{asset('js/landingpages/pagescript2.js')}}"></script>
<form method = "POST" onsubmit="return VForm('<?php echo $_SERVER['REMOTE_ADDR'];?>');" class="needs-validation">
<div>
<label for="fname">First Name</label>
<input id= "fname" class="form-control" name="fname" type = "text" required />
<label for="email">Email Address</label>
<input id = "email" class="form-control" name="email" type="email" required/>
</div>
<button value="Submit" type="submit">Send Up!!</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-U1DAWAznBHeqEIlVSCgzq+c9gqGAJn5c/t99JyeKa9xxaYpSvHU5awsuZVVFIhvj" crossorigin="anonymous"></script>
</body>
</html>
。例如:
system.serviceModel