2012-04-17 237 views
3

我试图在Windows 2008 R2服务器上托管WCF服务作为Windows服务。我遵循了msdn提供的指导(found here)。只要所有东西都是Visual Studio中同一解决方案的一部分,一切都可以正常工作。但是,我试图在不同的解决方案中创建客户端(在同一台机器上),并且找不到该服务。我收到下面显示的“添加服务引用错误”。Windows服务托管的TCP WCF服务

enter image description here

我的目标是能够远程访问WCF服务,但我似乎无法连本地访问它,除非客户在同一客户端中创建。是否有任何指导,教程或有帮助的提示,任何人都可以让我得到这个工作?

更新: 看来,即使Windows服务正在运行,WCF服务似乎没有监听任何端口。这表明它没有运行。这也解释了为什么每个人的第一个想法我没有运行服务。我认为,自Windows服务运行并且相同的解决方案客户端工作以来,WCF服务也运行良好。事实证明,当我运行相同的解决方案客户端时,Visual Studio正在启动一个WCF服务。

那么,为什么不启动WCF服务的Windows服务?有任何想法吗?

+0

尝试添加服务引用时是否运行该服务? – 2012-04-17 15:13:28

+0

是的,如上所述,我已经完成了本教程中解释的所有工作,其中包括启动服务。 – 2012-04-17 16:07:08

+0

没错,但是当你尝试从你的新客户端添加服务引用时,你是否有实际运行的服务? – 2012-04-17 16:09:52

回答

6

事实证明,有与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的帮助我会找到它。

+0

好找!非常微妙。 – 2012-04-18 16:44:24

3

有两种方式添加服务引用,以了解服务:

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(除非您以编程方式添加它)。

+0

是的,我明白这一点,但它并不能真正帮助我解决问题。 – 2012-04-17 16:09:55

+0

刚刚注意到了一些东西 - 请参阅我的编辑。 – 2012-04-17 16:39:28

+0

我在上面引用的教程中有您利用tcp的元数据交换,而无需添加http基地址。我想我可以尝试添加一个http基地址来查看它是否有效,但我真的不想通过http访问该服务。 – 2012-04-17 17:42:41

2

我已经测试过MSDN文章,它的工作原理没有修改。如果服务器上启用了防火墙,我认为您需要为您的服务添加一些规则。

要验证服务正在侦听正确的TCP端口,可以使用命令:netstat -a。如果该服务被正确的端口上侦听,该命令将返回:

Proto Local Address   Foreign Address  State 
TCP 0.0.0.0:8523   machinename:0   LISTENING 
+0

我没有修改也能正常工作。但是,它在相同的解决方案中创建客户端。如果我尝试在服务的相同解决方案之外创建客户端,即使它在同一台计算机上并且服务运行良好,它也无法连接到该服务。 – 2012-04-17 20:41:38

+0

它适用于我,也是当我在单独的解决方案中创建客户端时。 – 2012-04-17 20:49:45

+1

因此,我尝试了你建议的'netstat'命令,并注意到即使windows服务正在运行,wcf服务似乎没有运行。你有没有同样的问题?可能是我的问题? – 2012-04-18 12:44:16

0

我设法弄清楚了这个问题。我的服务并不知道端点,因为我没有将WCF项目中的app.config中的服务配置复制到实际的Windows服务的app.config中。一旦我做到了,它的功能正确。

尽管在WCF app.config中的评论中提到了这一点,但在原始的MSDN文章中我没有明确说明。

相关问题