在 Windows 服务中承载 WCF 服务时出现问题

本文关键字:服务 WCF 问题 Windows | 更新日期: 2023-09-27 17:56:57

>我有一个托管在Windows服务中的WCF服务。Windows 服务有一个OnStart方法,如下所示:

protected override void OnStart(string[] args)
{
  serviceHost = new ServiceHost(typeof (RouterService));
  serviceHost.Open();
}

现在它非常小,因为我试图找到问题。由于我没有在这里进行任何错误处理,因此此时的任何异常都应该阻止服务正常启动。它将启动,然后立即自动再次停止。

我的 WCF 服务的配置文件如下所示:

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <system.serviceModel>
    <services>
      <service name="WcfService.RouterService"
               behaviorConfiguration="serviceBehavior" >
        <endpoint address="RouterService" contract="WcfService.IRouterService" binding="wsHttpBinding" bindingConfiguration="NoSecurity" />
        <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpBinding" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="NoSecurity">
          <security mode="None" />
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior" >
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

此外,我还添加了网络服务用户(该服务正在运行,以便能够在指定端口侦听 Http:

netsh http add urlacl url=http://+:8000/ user="NETWORK SERVICE"

现在,在客户端中,我选择 Add Service Reference .我可以找到服务器,VS还设法创建配置并制作代理文件。然后在客户端内部,我创建代理的实例,并打开它。一切都还好。但是在代理上调用第一种方法时,我得到以下异常:

位于 http://localhost:8000/RouterService 的 HTTP 服务太忙。

我知道我的客户端是唯一尝试连接到此服务的东西,那么为什么我会收到此错误消息呢?我该如何解决这个问题?当它尝试调用该方法时,它不会超时,它几乎会立即引发异常。

编辑

好的,现在我发现我的测试服务器(不是Windows客户端服务器,而是控制台应用程序)也给出了相同的错误。今天早些时候它没有,WCF 服务和测试服务器都没有改变。

然后我尝试将端口更改为 8080 而不是 8000,它奏效了。然后我对 Windows 服务尝试了相同的方法,这也有效(在新端口上运行 netsh http 命令后)

因此,由于某种原因,端口 8000 上的 http 发生了一些事情。当然,我也尝试重新启动系统。

这让我感到困惑,所以如果有人知道这里发生了什么,我将不胜感激。

在 Windows 服务中承载 WCF 服务时出现问题

好的,经过很长时间试图弄清楚这里发生了什么,我找到了解决方案。

在我创建了 Windows 服务并尝试启动它后,我无法启动它,因为我必须首先注册网络服务用户以侦听 http post 8000。因此,我运行了以下命令:

netsh http add urlacl url=http://+:8000/RouterService user="NETWORK SERVICE"

它给出了一个成功的结果,但后来我尝试启动该服务,并收到相同的错误消息。然后我在没有指定路由器服务的情况下运行相同的命令:

netsh http add urlacl url=http://+:8000/user="NETWORK SERVICE"

它给出了一个成功的结果,现在我的 Windows 服务启动没有任何问题,但我遇到了上面问题中提到的问题。

似乎第一次调用netsh会导致所有这些问题。我尝试使用以下命令再次删除它:

netsh http delete urlacl url=http://+:8000/RouterService

然后一切都很完美。

调试这个的婊子,因为异常与实际问题无关,所以我希望这个问题可以节省其他人几个小时:)

以下答案 @oyvind-knobloch-brathen 考虑使用众所周知的 SID 字符串而不是"user"命令行键,这将为您提供跨文化可移植性(我在法语本地化的 Win7 机器上遇到了问题)。有关详细信息,请参阅 SID 字符串。对于您的情况,这将是:

netsh http add urlacl url=http://+:8000/sddl="O:NS"

指向 MSDN 上的 SDDL 的链接。