4

我正在尝试在 Windows 2008 R2 服务器上托管 WCF 服务作为 Windows 服务。我按照 msdn 提供的说明进行操作(在此处找到)。只要一切都是视觉工作室中相同解决方案的一部分,一切都可以正常工作。但是,我尝试在不同的解决方案中(在同一台机器上)创建客户端,但找不到该服务。我收到如下所示的“添加服务参考错误”。

在此处输入图像描述

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

更新: 似乎即使 Windows 服务正在运行,WCF 服务似乎也没有监听任何端口。这表明它没有运行。这也解释了为什么每个人首先认为我没有运行该服务。我假设由于 Windows 服务正在运行并且相同的解决方案客户端工作,WCF 服务也在工作。事实证明,每当我运行相同的解决方案客户端时,Visual Studio 都会启动 WCF 服务。

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

4

4 回答 4

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 的帮助,我认为我不会找到它。

于 2012-04-18T13:57:45.567 回答
3

Add Service Reference 有两种方法可以了解服务:

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

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

编辑

我刚刚从您的屏幕截图中注意到您正在尝试连接到 net.tcp URL。我认为在 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 get 访问 (httpGetEnabled="False"),您仍然需要包含此行为以启用 MEX(除非您以编程方式添加它)。

于 2012-04-17T15:17:15.730 回答
2

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

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

Proto  Local Address          Foreign Address        State
TCP    0.0.0.0:8523           machinename:0          LISTENING
于 2012-04-17T19:47:45.113 回答
0

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

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

于 2012-08-10T11:05:55.510 回答