Windows服务托管TCP WCF服务

我试图在Windows 2008 R2服务器上托管WCF服务作为Windows服务。 我按照msdn( 在这里找到 )提供的指示。 只要一切都是视觉工作室中同一解决方案的一部分,一切都很好。 但是,我尝试在不同的解决方案(在同一台机器上)创建客户端,但无法找到该服务。 我收到如下所示的“添加服务引用错误”。

在此处输入图像描述

我的目标是能够远程访问wcf服务,但我似乎甚至无法在本地访问它,除非客户端是在同一客户端内创建的。 是否有任何指南,教程或有用的提示,任何人都可以让我让这个工作?

更新:似乎即使Windows服务正在运行,WCF服务似乎没有监听任何端口。 这表明它没有运行。 这也解释了为什么每个人都认为我没有运行该服务。 我曾经假设,因为Windows服务正在运行并且同一个解决方案客户端工作,所以WCF服务也正常运行。 事实certificate,只要我运行相同的解决方案客户端,Visual Studio就会启动WCF服务。

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

事实certificate,MSDN提供的教程存在问题(在上面的问题中提供)。 他们将Windows服务和WCF服务Service1命名为两者的默认名称。

Windows服务假设启动WCF服务,但是,实际上它试图再次启动,因为两个服务具有相同的名称。

 myServiceHost = new ServiceHost(typeof(Service1)); 

要解决此问题,您可以在Windows服务中引用时重命名其中一个服务或完全限定WCF服务。

 myServiceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1)); 

有趣的是,提供的代码看起来仍然有效,因为Visual Studio足够聪明,可以注意到WCF服务没有运行,并且它在幕后启动了一个实例。

修复这是一个简单的错误,但由于Visual Studio隐藏了我的问题,我认为如果没有Espen Burud的帮助我就不会发现它。

添加服务引用有两种方法可以了解服务:

Discover按钮:搜索当前解决方案中的项目。
Go按钮:连接到“地址”框中的服务并检索元数据。

在单击Go之前,您需要实际运行该服务。

编辑

我刚刚从您的屏幕截图中注意到您正在尝试连接到net.tcpurl。 我认为使用http for MEX更常见。 您的app.config看起来像:

                 

请注意http基址的不同端口号。 然后,您将在“添加服务引用”工具中使用“http:// localhost:8524 / Service1”。 您还应该能够使用Web浏览器连接到它。

要允许通过http GET进行元数据交换(例如,从浏览器),您还需要通过以下行为启用它:

        

我不确定添加服务引用工具是否关心它。

即使您不想允许http get访问(httpGetEnabled =“False”),您仍然需要包含此行为以启用MEX(除非您以编程方式添加它)。

我已经测试了MSDN中的文章,它无需修改即可使用。 如果在服务器上启用了防火墙,我认为您需要为您的服务添加一些规则。

要validation服务是否正在侦听正确的tcp端口,可以使用命令: netstat -a 。 如果服务正在侦听正确的端口,则此命令将返回:

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

我设法弄明白了这个问题。 我的服务不了解端点,因为我没有将服务配置从WCF项目中的app.config复制到实际Windows服务的app.config中。 一旦我这样做,它运作正常。

虽然在WCF app.config的评论中提到了这篇文章,但我在原来的MSDN文章中也没有明确说明这一点。