繁体   English   中英

在Windows Service中托管WCF服务的问题

[英]Problem with hosting WCF service in a Windows Service

我有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>

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

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

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

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

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

编辑

好的,现在我发现我的TestServer(不是Windows Client,而是控制台应用程序)也给出了相同的错误。 今天早些时候没有,WCF服务或TestServer均未更改。

然后,我尝试将端口更改为8080,而不是8000,然后它起作用了。 然后,我对Windows服务尝试了同样的方法,并且同样有效(在新端口上运行netsh http命令之后)

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

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

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

创建Windows服务并尝试启动后,我无法注册,因为我必须注册NETWORK SERVICE用户才能首先收听http post 8000。 因此,我运行了以下命令:

netsh http add urlacl url = http:// +:8000 / RouterService user =“网络服务”

它给出了成功的结果,但是随后我尝试启动该服务,并得到了相同的错误消息。 然后我在没有指定RouterService的情况下运行了相同的命令:

netsh http add urlacl url = http:// +:8000 / user =“网络服务”

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

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

netsh http删除urlacl url = http:// +:8000 / RouterService

然后,一切正常。

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

在回答@ oyvind-knobloch-brathen之后,考虑使用众所周知的SID字符串代替“用户”命令行键,这将为您提供跨文化的可移植性(我在法语本地化的Win7机器上遇到了问题)。 有关更多信息,请参见SID字符串 对于您的情况,这将是:

netsh http添加urlacl url = http:// +:8000 / sddl =“ O:NS”

在MSDN上指向SDDL的链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM