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

问题描述:

我有一个托管在Windows服务中的WCF服务。 Windows服务有OnStart方法是这样的:在Windows服务中托管WCF服务的问题

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还可以管理创建配置,使代理文件,然后在客户端里面,我做代理的实例,并打开它,一切仍然正常,但在c代理第一种方法,我得到以下例外:

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

我知道,我的客户是试图连接到该服务的唯一的事情,所以为什么我得到这个错误信息呢?我该如何解决这个问题?它在尝试调用方法时没有超时,它几乎立即抛出异常。

编辑

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

然后我试着将端口更改为8080而不是8000,并且工作正常。然后我试图为Windows服务相同,而且还曾

所以出事了HTTP上由于某种原因端口8000(运行新的端口上netsh http命令后)。当然我也试过重新启动系统。

这让我感到困惑,所以如果任何人有任何想法在这里发生了什么,我将不胜感激。

+0

你的服务返回什么类型?我在服务中看到这个问题,返回无法序列化的类型。这也可能是服务主机的应用程序池无法启动或类似的问题。 – Henric 2011-05-20 11:24:27

+1

我同意@daft,由于序列化问题,该服务可能无法返回数据类型。应用程序池(如果适用)不应该担心,因为它是服务于wsdl/config的同一个池(至少在IIS中),它允许您生成代理类(您已成功完成该代理类)。 – Smudge202 2011-05-20 11:37:23

+0

+1来澄清应用程序池问题。感谢涂抹。 – Henric 2011-05-20 11:40:33

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

我创建了Windows服务,并试图启动它,我不能因为我不得不注册NETWORK SERVICE用户首先在http post 8000上监听。所以我跑这个命令:

的netsh的http添加urlacl URL = HTTP:// +:8000/RouterService用户= “网络服务”

它给了一个成功的结果,但后来我试着开始该服务,并得到相同的错误信息。然后我跑不RouterService指定相同的命令:

的netsh的http添加urlacl URL = HTTP:// +:8000 /用户= “网络服务”

它给了一个成功的结果,现在我的窗户服务启动没有任何问题,但我得到了上述问题中提到的问题。

看来第一次调用netsh会导致所有这些问题。我试图用这个命令再次将其取出:

netsh的HTTP删除urlacl URL = HTTP:// +:8000/RouterService

然后一切都工作正常。

调试这一点,因为异常无关,与实际问题的母狗,所以我希望这个问题可以节省别人一两个小时:)

继@岛之风 - 克诺布洛赫-Bråthen如此阐述的答案考虑要使用众所周知的SID字符串而不是“用户”命令行键,这会给你跨文化的可移植性(我在法语本地化的Win7机器上遇到过问题)。欲了解更多信息,请参阅SID strings。对于你的情况,这将是:

的netsh的http添加urlacl URL = HTTP:// +:8000/SDDL = “○:NS”

a link to SDDL on MSDN