在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
命令后)。当然我也试过重新启动系统。
这让我感到困惑,所以如果任何人有任何想法在这里发生了什么,我将不胜感激。
好吧,经过很长时间的试图弄清楚这里发生了什么,我找到了解决方案。
我创建了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”
你的服务返回什么类型?我在服务中看到这个问题,返回无法序列化的类型。这也可能是服务主机的应用程序池无法启动或类似的问题。 – Henric 2011-05-20 11:24:27
我同意@daft,由于序列化问题,该服务可能无法返回数据类型。应用程序池(如果适用)不应该担心,因为它是服务于wsdl/config的同一个池(至少在IIS中),它允许您生成代理类(您已成功完成该代理类)。 – Smudge202 2011-05-20 11:37:23
+1来澄清应用程序池问题。感谢涂抹。 – Henric 2011-05-20 11:40:33