在WCF服务中“请求通道在等待回复时超时”

时间:2010-01-13 10:17:49

标签: wcf wcf-binding

我正在运行由Windows服务托管的WCF服务(从asp.net站点调用)。

当我通过“BasicHttp”端点调用时超时(因为已超出 sendTimeout 属性),我得到预期的错误消息:

“请求频道在等待00:01:00之后的回复时超时....”

但是当通过NetTcp端点(使用传输安全性)进行调用时,我得到了更一般的错误:

“通信对象System.ServiceModel.Channels.ServiceChannel不能用于通信,因为它处于Faulted状态。”

有人知道为什么吗?我在配置中遗漏了什么吗?

我的客户端配置是:

    <netTcpBinding>
            <binding name="netTcpBindingConfig" closeTimeout="00:01:00"
             openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:00:10"
             transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
             hostNameComparisonMode="StrongWildcard" listenBacklog="10"
             maxBufferPoolSize="524288" maxBufferSize="655360" maxConnections="10"
             maxReceivedMessageSize="65536000">
                <readerQuotas maxDepth="32" maxStringContentLength="65536000" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows"  />
                </security>
            </binding>
        </netTcpBinding>


        <basicHttpBinding>

            <binding name="basicHttpBindingConfig" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:00:00.500"
                bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536000"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="65536000" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            </binding>

        </basicHttpBinding>

服务配置:

    <basicHttpBinding>
      <binding name="basicHttpBinding_config" maxReceivedMessageSize="5000000">
        <readerQuotas maxDepth="9000000" maxStringContentLength="9000000"
        maxArrayLength="9000000" maxBytesPerRead="9000000" maxNameTableCharCount="9000000" />
      </binding>
    </basicHttpBinding>

    <netTcpBinding>
      <binding name="tcpBinding_config" maxReceivedMessageSize="5000000" maxBufferSize="5000000" maxBufferPoolSize="5000000" >
        <readerQuotas maxDepth="9000000" maxStringContentLength="9000000"
          maxArrayLength="9000000" maxBytesPerRead="9000000" maxNameTableCharCount="9000000" />
      </binding>
    </netTcpBinding>

非常感谢任何帮助! 谢谢!

乔恩

1 个答案:

答案 0 :(得分:2)

超时异常导致您的代理进入故障状态。

您没有使用BasicHttpBinding获取此异常的原因是因为此绑定不使用会话。如果使用会话的绑定存在异常,则通道将出现故障并且会话将被销毁。

这往往会隐藏问题的真正原因。调查原始异常的一种方法是使用WCF跟踪。

可以将WCF配置为跨应用程序的所有组件输出流程里程碑的跟踪,例如操作调用,代码异常,警告和其他重要的处理事件。

以下是启用跟踪的.config示例。

<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true" >
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>

      <source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>
    </sources>

    <sharedListeners>
      <add name="xml" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData="C:\logs\TraceLog.svclog" />
    </sharedListeners>

  </system.diagnostics>
</configuration>

确保您的服务可以写入initializeData中定义的路径。您可以从MSDN: Configuring Tracing了解有关WCF跟踪的更多信息。

Microsoft提供Service Trace Viewer Tool来读取.svclog文件。