任何人都可以将IIS作为WCF客户端可靠地运行

时间:2009-11-10 12:13:48

标签: wcf iis nettcpbinding netnamedpipebinding

我正在尝试使用我在同一台计算机上的单独Windows服务应用程序中托管的WCF服务使IIS6可靠地工作。用户通过一些HTTP公开的服务连接到IIS,这是正常工作,然后IIS需要从Windows服务获取一些信息以放入HTTP响应。我还需要Windows服务和IIS之间的回调通道。

经过大量努力后,我使用了netTcpBinding,所有内容都会花费5或10分钟,但之后IIS会报告WCF通道出现故障,然后吵起并停止处理任何请求直到工作进程得到了回收,整个过程重复了。

我一直在尝试交换到netNamedPipeBinding,但IIS拒绝或拒绝访问管道,其中“没有端点侦听net.pipe:// localhost / mypipename”错误。我可以从控制台应用程序连接到管道。

所以我的问题是,是否有人将这两个绑定中的任何一个用作IIS作为客户端或者有其他任何方法?

3 个答案:

答案 0 :(得分:2)

我们使用IIS 7托管大约20个服务与net.tcp和net.pipe绑定,它工作正常。

您对管道的问题看起来像是对我的错误配置。如果有帮助,我们就可以配置它们了:

服务器:

 <endpoint address ="" binding="fooBinding" 
           contract="Bla.IBlaAPI" 
           bindingConfiguration="BlaAPI.BindingConfig">

绑定配置:

<binding name="BlaAPI.BindingConfig"
                 receiveTimeout = "10:50:00"
                 sendTimeout = "10:50:00"
                 maxReceivedMessageSize="2147483647"
                 maxBufferSize="2147483647"
                 maxBufferPoolSize="2147483647"
                 transactionFlow="false">
          <readerQuotas maxDepth="32"
                       maxStringContentLength="2147483647"
                       maxArrayLength="2147483647"
                       maxBytesPerRead="8192"
                       maxNameTableCharCount="2147483647" />
          <security mode="None"/>
</binding>

请注意,我们正在使用较长的超时时间,并且对于邮件大小等具有非常高的配额,因为我们通过此服务传递了一大块数据。您可以根据自己的需要进行调整。我们将安全性设置为“无”,因为只能从受保护的本地计算机联系该服务。同样,您的里程可能会有所不同。

客户端:

<endpoint name="Bla.Bindings.BlaAPI" address="net.pipe://localhost/bla/IBlaAPI.svc"
                behaviorConfiguration="BlaAPI.ServiceBehavior"
                binding="netNamedPipeBinding" bindingConfiguration="BlaAPI.BindingConfig"
                contract="Bla.IBlaAPI" />

关于Faulted状态问题,请注意,如果在执行服务代码期间发生未处理的异常,则服务实例将保持故障状态,直到它正确关闭为止。要避免这种情况,请在服务顶级处理异常,或者使用Enterprise Library Excexption Handling块。

答案 1 :(得分:1)

Re NetNamedPipeBinding和“net.pipe:// localhost / mypipename没有端点监听”

您的网络应用是否模仿其用户?如果您尝试通过命名管道绑定在登录令牌具有NETWORK USERS成员身份的安全上下文中访问WCF服务,则会出现上述错误。当WCF客户端通道堆栈尝试读取服务创建的共享内存对象以发布正在使用的管道名称时,它不区分访问被拒绝错误和“未找到”错误。 (见http://blogs.charteris.com/blogs/chrisdi/archive/2008/05.aspx等)

IIS应用程序中的模拟令牌始终具有NETWORK USERS成员资格。

答案 2 :(得分:0)

你能告诉我你用来处理wcf客户端代理的代码吗?

永远不要在wcf代理上使用'using',因为它不会每次都正确处理。这可能会导致故障状态。