Windows服务托管的TCP WCF服务
我试图在Windows 2008 R2服务器上托管WCF服务作为Windows服务。我遵循了msdn提供的指导(found here)。只要所有东西都是Visual Studio中同一解决方案的一部分,一切都可以正常工作。但是,我试图在不同的解决方案中创建客户端(在同一台机器上),并且找不到该服务。我收到下面显示的“添加服务引用错误”。Windows服务托管的TCP WCF服务
我的目标是能够远程访问WCF服务,但我似乎无法连本地访问它,除非客户在同一客户端中创建。是否有任何指导,教程或有帮助的提示,任何人都可以让我得到这个工作?
更新: 看来,即使Windows服务正在运行,WCF服务似乎没有监听任何端口。这表明它没有运行。这也解释了为什么每个人的第一个想法我没有运行服务。我认为,自Windows服务运行并且相同的解决方案客户端工作以来,WCF服务也运行良好。事实证明,当我运行相同的解决方案客户端时,Visual Studio正在启动一个WCF服务。
那么,为什么不启动WCF服务的Windows服务?有任何想法吗?
事实证明,有与MSDN提供的教程的一个问题(在上面的问题提供)。他们将Windows服务和WCF服务Service1
命名为两者的默认名称。
Windows服务假设启动WCF服务,但是,它实际上是试图再次启动自己,因为这两个服务具有相同的名称。
myServiceHost = new ServiceHost(typeof(Service1));
若要解决此问题,您可以重命名其中一个服务或完全限定在Windows服务中引用WCF服务时。
myServiceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1));
有趣的是,仍然提供的代码看起来像它的作品,因为Visual Studio是足够聪明,发现了WCF服务没有运行,并且启动一个实例在背后。
这是一个简单的bug修复,但由于Visual Studio隐藏了我的问题,我不认为没有Espen Burud的帮助我会找到它。
好找!非常微妙。 – 2012-04-18 16:44:24
有两种方式添加服务引用,以了解服务:
Discover
按钮:搜索在当前解决方案的项目。 Go
按钮:连接到地址框中的服务并检索元数据。
在点击Go
之前,您需要确实已经有服务在运行。
编辑
我只是从你的截图,你试图连接到一个URL的net.tcp注意到。我认为在MEX上使用http更常见。你的app.config看起来是这样的:
<services>
<service behaviorConfiguration="WcfServiceLibrary1.Service1Behavior"
name="WcfServiceLibrary1.Service1">
<endpoint address="" binding="netTcpBinding" bindingConfiguration=""
contract="WcfServiceLibrary1.IService1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8523/Service1" />
<add baseAddress="http://localhost:8524/Service1" />
</baseAddresses>
</host>
</service>
</services>
注意的HTTP基地址不同的端口号。然后,您可以在“添加服务参考”工具中使用“http:// localhost:8524/Service1”。您还应该能够使用您的网络浏览器连接到它。
允许通过HTTP GET(例如从浏览器)元数据交换,还需要通过行为来启用它:
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
我不知道,如果添加服务引用工具在乎这些。即使您不想允许http获取访问(httpGetEnabled =“False”),您仍然需要包含此行为以启用MEX(除非您以编程方式添加它)。
是的,我明白这一点,但它并不能真正帮助我解决问题。 – 2012-04-17 16:09:55
刚刚注意到了一些东西 - 请参阅我的编辑。 – 2012-04-17 16:39:28
我在上面引用的教程中有您利用tcp的元数据交换,而无需添加http基地址。我想我可以尝试添加一个http基地址来查看它是否有效,但我真的不想通过http访问该服务。 – 2012-04-17 17:42:41
我已经测试过MSDN文章,它的工作原理没有修改。如果服务器上启用了防火墙,我认为您需要为您的服务添加一些规则。
要验证服务正在侦听正确的TCP端口,可以使用命令:netstat -a
。如果该服务被正确的端口上侦听,该命令将返回:
Proto Local Address Foreign Address State
TCP 0.0.0.0:8523 machinename:0 LISTENING
我没有修改也能正常工作。但是,它在相同的解决方案中创建客户端。如果我尝试在服务的相同解决方案之外创建客户端,即使它在同一台计算机上并且服务运行良好,它也无法连接到该服务。 – 2012-04-17 20:41:38
它适用于我,也是当我在单独的解决方案中创建客户端时。 – 2012-04-17 20:49:45
因此,我尝试了你建议的'netstat'命令,并注意到即使windows服务正在运行,wcf服务似乎没有运行。你有没有同样的问题?可能是我的问题? – 2012-04-18 12:44:16
我设法弄清楚了这个问题。我的服务并不知道端点,因为我没有将WCF项目中的app.config中的服务配置复制到实际的Windows服务的app.config中。一旦我做到了,它的功能正确。
尽管在WCF app.config中的评论中提到了这一点,但在原始的MSDN文章中我没有明确说明。
尝试添加服务引用时是否运行该服务? – 2012-04-17 15:13:28
是的,如上所述,我已经完成了本教程中解释的所有工作,其中包括启动服务。 – 2012-04-17 16:07:08
没错,但是当你尝试从你的新客户端添加服务引用时,你是否有实际运行的服务? – 2012-04-17 16:09:52