我正在尝试在Windows 2008 R2服务器上托管WCF服务作为Windows服务。我按照msdn(found here)提供的指示进行操作。只要所有内容都是Visual Studio中同一解决方案的一部分,一切都可以正常工作。但是,我尝试在不同的解决方案(在同一台机器上)创建客户端,但无法找到该服务。我收到如下所示的“添加服务引用错误”。
我的目标是能够远程访问wcf服务,但我似乎甚至无法在本地访问它,除非客户端是在同一客户端内创建的。是否有任何指南,教程或有用的提示,任何人都可以让我让它工作?
更新 似乎即使Windows服务正在运行,WCF服务似乎也没有监听任何端口。这表明它没有运行。这也解释了为什么每个人都认为我没有运行该服务。我曾经假设,因为Windows服务正在运行并且同一个解决方案客户端工作,所以WCF服务也正常运行。事实证明,只要我运行相同的解决方案客户端,Visual Studio就会启动WCF服务。
那么,为什么Windows服务没有启动WCF服务呢?有什么想法吗?
答案 0 :(得分:7)
事实证明,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的帮助我就不会发现它。
答案 1 :(得分:3)
添加服务参考有两种方法可以了解服务:
Discover
按钮:在当前解决方案中搜索项目
Go
按钮:连接到地址框中的服务并检索元数据。
在点击Go
之前,您需要实际运行该服务。
修改强>
我刚刚从您的屏幕截图中注意到您正在尝试连接到net.tcp网址。我认为将http用于MEX更为常见。你的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”。您还应该能够使用Web浏览器连接到它。
要允许通过http GET(例如,从浏览器)进行元数据交换,您还需要通过行为启用它:
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
我不确定添加服务参考工具是否关心这一点。
即使您不想允许http get访问(httpGetEnabled =“False”),您仍然需要包含此行为以启用MEX(除非您以编程方式添加它)。
答案 2 :(得分:2)
我已经测试了MSDN中的文章,并且无需修改即可使用。如果在服务器上启用了防火墙,我认为您需要为您的服务添加一些规则。
要验证服务是否正在侦听正确的tcp端口,您可以使用命令:netstat -a
。如果服务正在侦听正确的端口,则此命令将返回:
Proto Local Address Foreign Address State
TCP 0.0.0.0:8523 machinename:0 LISTENING
答案 3 :(得分:0)
我设法解决了这个问题。我的服务不了解端点,因为我没有将服务配置从WCF项目中的app.config复制到实际Windows服务的app.config中。一旦我这样做,它就能正常运作。
虽然在WCF app.config的评论中提到了,但我在原来的MSDN文章中也没有说明这一点。