我有一个托管在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客户端,而是控制台应用程序)也会出现同样的错误。今天早些时候它没有,WCF服务或TestServer都没有改变。
然后我尝试将端口更改为8080而不是8000,并且它工作正常。然后我尝试了相同的Windows服务,这也有效(在新端口上运行netsh http
命令后)
因为某些原因,端口8000上的http发生了变化。我当然也试过重启系统。
这令我感到困惑,所以如果有人知道这里发生了什么,我将不胜感激。
答案 0 :(得分: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
然后一切都很完美。
一个调试这个的婊子,因为异常与实际问题无关,所以我希望这个问题可以节省其他人几个小时:)
答案 1 :(得分:4)
回答@ oyvind-knobloch-brathen考虑使用众所周知的SID字符串而不是“user”命令行键,这将为您提供跨文化可移植性(我在法语本地化的Win7机器上遇到了问题)。有关更多信息,请参阅SID strings。对于您的情况,这将是:
netsh http add urlacl url = http:// +:8000 / sddl =“O:NS”