WCF中服务太忙的错误

时间:2009-05-23 01:23:01

标签: wcf web-services throttling

我在.Net WCF服务中间歇性地获得以下异常。 “位于http://MyServer/TestWCF/MyService.svc的HTTP服务太忙了。”

我在这里错过了什么吗?

使用基本的http绑定并启用了WCF限制。

<basicHttpBinding>
        <binding name="BasicHttpBinding_MyService" maxReceivedMessageSize="2147483647"
                 messageEncoding="Text" textEncoding="utf-16" sendTimeout="00:01:00" >
          <readerQuotas maxStringContentLength="2147483647" maxArrayLength="163840000"
                        maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" />
        </binding>

。 。 。

<behavior name="MyWCFServices.MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceThrottling
                    maxConcurrentCalls="16"
                    maxConcurrentInstances="2147483647"
                    maxConcurrentSessions="10"/>
        </behavior>

限制有助于解决问题吗? 另外,我可以知道高流量网站的限制推荐参数值吗?

8 个答案:

答案 0 :(得分:10)

您绝对可以尝试将服务限制行为中的maxConcurrentSessionsmaxConcurrentCalls增加到标准值30左右,看看是否会导致错误消失。服务器太忙似乎表明更多的请求已经进入,而不是服务限制行为允许的区域,并且它们已被丢弃,因为在给定的超时时间内没有服务实例可用于服务它们。

答案 1 :(得分:9)

我的答案是,检查应用程序池是否正常运行?

我已经看到当应用程序池由于未被捕获的异常而死亡时发生此错误。

例如,考虑自定义配置部分 - 在那里出现错误,将导致您的应用在启动之前失败。在很短的时间内,太多这些会杀死应用程序池。

答案 2 :(得分:4)

如果您的服务正在您的帐户下运行(身份),您很可能最近更改了密码 - 您需要在高级设置中为其IIS应用程序池重置密码。身份对话框。

答案 3 :(得分:2)

这不仅仅是maxConcurrentSessions,也是会话持续的时间。

如果客户端没有关闭连接,它将保持打开状态直到超时。然后,您可以在服务器上执行非常少的活动时达到maxConcurrentSessions限制。

答案 4 :(得分:2)

确保你也检查内部异常;在我们的部署期间,我们禁用了WCF Web服务的应用程序池,并且客户端在此期间开始收到此错误:

  

System.ServiceModel.ServerTooBusyException:位于https://ourserver.x.com/path/service.svc的HTTP服务太忙了。 ---&GT; System.Net.WebException:远程服务器返回错误:(503)服务器不可用。

因此,在这种情况下,HTTP错误503被(错误?)解释为&#34;服务器太忙&#34;。

答案 5 :(得分:1)

我所知道的这个异常的唯一来源是你正在使用会话,并设法达到MaxPendingChannels限制。它的默认值非常低,如4.您可以尝试将其设置得更高(例如128),或者如果您只想重新设置,请将其设置为1,您应该在负载测试下看到它。

有关会话的详情,请参阅此处:http://msdn.microsoft.com/en-us/library/ms733795.aspx

答案 6 :(得分:1)

我刚遇到这个错误,它归结为一个简单的配置问题。我在完全相同的端口和相同的接口(模拟服务)上获得了服务。我使用适当的命令行开关运行该服务以运行我想要的“原始”服务。错误消失了。

答案 7 :(得分:0)

我的解决方案是,检查App.Config文件,该服务标签是否适用于此特定服务。

例如:

<service name="MyServices.ServiceName">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="TestBinding"   contract="MyServices.ServiceName">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyServices/ServiceName/" />
          </baseAddresses>
        </host>
</service>
相关问题