【问题标题】:The request channel timed out while waiting for a reply请求通道在等待回复时超时
【发布时间】:2012-06-26 20:36:52
【问题描述】:

我有一个使用 WCF 与网络服务器通信的小型应用程序。该程序被大约 200 个客户端使用,每个客户端大约以 5-20 个请求/分钟的速度发送。

查看我经常得到的错误日志:

请求通道在等待回复后超时 00:00:59.9989999

请求如下:

ClientService Client = new ClientService();
Client.Open();
Client.updateOnline(userID);
Client.Close();

这是 app.config

<configuration>
<configSections>
</configSections>
<startup><supportedRuntime version="v2.0.50727"/></startup><system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IClientService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="None">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="PATH TO SERVICE"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IClientService"
            contract="IClientService" name="WSHttpBinding_IClientService">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

在每天大约 200-800 次“多次通话”中失败。大约 n-1 是可以的。我很困惑这个问题可能是什么。查看服务器统计信息,几乎没有汗水 - 每个请求都需要不到 2 秒的时间来处理。它发送的数据由“int”或“非常小的字符串”组成 - 所以,如果是大小,它不是由于大小 - 应该是一致的失败..

建议?

【问题讨论】:

  • 您是在 IIS 中托管此服务还是由 Windows 服务或其他应用程序托管?
  • 您是否尝试过在配置文件中设置超时和引用设置?
  • 实际上,我建议打开 WCF 跟踪(如此处所述:msdn.microsoft.com/en-us/library/ms733025.aspx)并查看出现这些错误时记录的消息。
  • 附带说明,如果您按照帖子中显示的方式调用服务,则不应使用启用会话的绑定。这是一种资源浪费,并增加了整体通信的开销。
  • 服务托管在 IIS 中。我尝试过使用超时和配额 - 是的。 (如何禁用会话?)

标签: c# wcf


【解决方案1】:

尝试将超时值添加到服务和客户端:

<binding name="BasicHttpBinding_SomeName" closeTimeout="00:01:00"
    openTimeout="00:01:00" receiveTimeout="00:10:00"
    sendTimeout="00:10:00" maxBufferPoolSize="2147483647"
    maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">

【讨论】:

  • 它有效。简单而简单的解决方案。我已经在客户端和服务上设置了这个。非常感谢。
【解决方案2】:

您的请求似乎在处理之前在服务器上排队,然后开始超时。您可以在这里尝试几件事,看看到底发生了什么

1) 尝试限制 WCF 服务,例如:尝试增加并发会话。看一看 WCF Throttling

2) 尝试在此处使用 PerCall 而不是使用 Sessions 以确保没有会话保留在那里。 您可以在界面上执行以下操作来删除会话

[ServiceContract(Namespace="YOUR NAMESPACE", SessionMode=SessionMode.NotAllowed)]

以及实现这些接口的合约类

ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

并且 .... 您应该启用跟踪以查看到底发生了什么。

【讨论】:

  • 我已经按照你的建议做了......现在让它运行了大约 15 分钟......只有一个客户端报告了问题......(同样的超时问题)......我会让它运行一段时间看看它现在是否只有一个客户报告问题..如果是,那么将其归因于他的连接..(又名..迟到了)...
【解决方案3】:

检查此性能计数器 - ASP.NET Requests Queued

一个 Web 应用程序可以托管许多网页和服务。默认情况下,IIS 每个 CPU 核心仅处理 12 个并发请求。

这意味着即使您的服务很快但其他页面/服务很慢,您的请求也必须在队列中等待才能执行。

ASP.NET Requests Queued 应该为零或接近于零。

Performance Counters for ASP.NET on MSDN

【讨论】:

  • 超过 2 分钟 - 排队的最大 ASP.NET 请求数为 1.. 排队的 ASP.NET v4 请求数为 0(正在运行 .NET 4)
猜你喜欢
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2021-11-10
  • 2011-12-22
  • 2016-07-25
  • 2019-12-25
相关资源
最近更新 更多