【问题标题】:Anyone got IIS working reliably as a WCF client任何人都可以让 IIS 作为 WCF 客户端可靠地工作
【发布时间】:2010-12-15 00:25:50
【问题描述】:

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

经过大量的努力,我让它与 netTcpBinding 一起工作,5 或 10 分钟内一切都会顺利,但之后 IIS 会报告 WCF 通道出现故障,然后停止处理任何请求,直到工作进程被回收了,整个事情又重复了。

我一直在尝试切换到 netNamedPipeBinding,但 IIS 拒绝或被拒绝访问管道,并出现“在 net.pipe://localhost/mypipename 处没有端点监听”错误。我可以从控制台应用程序很好地连接到管道。

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

【问题讨论】:

    标签: wcf iis nettcpbinding netnamedpipebinding


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案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状态问题,请注意如果在服务代码执行过程中出现未处理的异常,服务实例会一直保持Faulted状态,直到它被正常关闭。为避免这种情况,要么在服务顶层处理异常,要么使用企业库异常处理块等。

      【讨论】:

      • 你能发布你的绑定配置节点吗?此外,对于您的命名管道,您是否必须对权限或身份做任何事情?
      • 完成,添加了我们的绑定配置。关于安全性,我们使用“无”,因为所有访问都是本地的。
      • 看起来我的 netNamedPipeBinding 问题是 Vista 和/或 IIS7 问题。即使尝试完全相同的配置,它在我的 Vista 开发 PC 上对我不起作用,但在我的 Win2k3/IIS6 服务器上工作正常。
      • 我们的开发盒是 vista + iis7(Vista 中包含的“轻型”IIS)。确保在控制面板的 Vista 功能部分中启用所有相关的 IIS 功能(Framework 3.0、ISAPI Extensions、ISAPI Filters、ASP.NET、Http Activation、Non-Http Activation、Windows Process Activation Service、.NET Environment、Configuration API,流程模型)。还要检查您是否在运行服务的 IIS 站点中启用了 net.tcp 和 net.pipe 绑定...
      【解决方案3】:

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

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

      【讨论】:

      • 那个似乎确实吸引了很多人:)。这不是我的问题,但我正在调整我的错误处理,看看我是否可以从尝试缩小它们突然出现的范围开始改进它。