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

Øyv*_*hen 13 .net c# wcf windows-services

我有一个托管在Windows服务中的WCF服务.Windows服务有这样的OnStart方法:

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

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

我的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>
Run Code Online (Sandbox Code Playgroud)

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

netsh http add urlacl url=http://+:8000/ user="NETWORK SERVICE"
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑

好的,现在我发现我的TestServer(不是Windows Client,而是控制台应用程序)也会出现同样的错误.今天早些时候它没有,并且WCF服务或TestServer都没有改变.

然后我尝试将端口更改为8080而不是8000,并且它工作正常.然后我尝试了相同的Windows服务,这也工作(在netsh http新端口上运行命令后)

因此,出于某种原因,端口8000上的http发生了变化.我当然也试过重启系统.

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

Øyv*_*hen 13

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

在我创建了Windows服务之后,我试图启动它,因为我必须首先注册NETWORK SERVICE用户才能收听http post 8000.因此我运行了这个命令:

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

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

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

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

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

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

然后一切都很完美.

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