【问题标题】:Windows Service Hosted TCP WCF ServiceWindows 服务托管 TCP WCF 服务
【发布时间】:2012-04-28 22:43:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在尝试添加服务引用时,服务是否正在运行?
  • 是的,如上所述,我已经完成了教程中解释的所有工作,包括启动服务。
  • 对,但是当您尝试从新客户端添加服务引用时,您开发的服务是否实际运行?
  • 是的,我认为很明显,服务必须在我可以连接到它甚至从中提取元数据之前运行。
  • 但是,服务实际运行可能并不那么明显。事实证明 WCF 服务没有启动,即使是 windows 服务也是如此。我不知道为什么也不知道如何解决它......

标签: c# wcf windows-services wcf-client


【解决方案1】:

我设法找出了问题所在。我的服务不知道端点,因为我没有将 WCF 项目中的 app.config 中的服务配置复制到实际 Windows 服务的 app.config 中。一旦我这样做了,它就可以正常工作了。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这解决了我的(相同的)问题,即使这两个服务(WCF 和 Windows 服务)有不同的名称!!
    【解决方案3】:

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

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

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

    【讨论】:

    • 我也无需修改即可工作。但是,它会在同一解决方案中创建客户端。如果我尝试在服务的相同解决方案之外创建客户端,即使它在同一台机器上并且服务运行良好,它也无法连接到服务。
    • 它适用于我,当我在单独的解决方案中创建客户端时也是如此。
    • 所以,我尝试了您建议的netstat 命令,并注意到即使windows 服务正在运行,wcf 服务似乎也没有运行。你有同样的问题吗?我的问题可能是什么?
    • @BryanWatts:运行该服务的用户是否有权使用该端口?如果没有,您将需要创建 ACL 或以提升的权限运行服务。
    • 它有权限。在您回答的帮助下,我最终找出了主要问题。有关详细信息,请参阅我的答案。谢谢。
    【解决方案4】:

    添加服务参考有两种方式了解服务:

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

    【讨论】:

    • 是的,我明白这一点,但这对我的问题并没有真正的帮助。
    • 我上面引用的教程让您通过 tcp 使用元数据交换,而无需添加 http 基地址。我想我可以尝试添加一个 http 基地址以查看它是否有效,但我真的不想通过 http 访问该服务。
    • 我从未这样做过,但这里有一个通过 TCP 公开 MEX 的示例:social.technet.microsoft.com/wiki/contents/articles/…
    • 对于 http,您可能需要包含 serviceMetadata 行为,请参阅我的上次编辑。我查看了您引用的教程,它已将 httpGetEnabled 设置为 false(很明显,这会阻止通过 http GET 访问元数据)。
    • 已经确认不需要乱搞HTTP了。我可以用 TCP 实现一切,但我还没有完全弄清楚如何去做(参见 Espen 的回答)我用更多细节更新了这个问题。
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多