WCF间歇性地停止响应

时间:2013-05-21 11:03:50

标签: asp.net wcf freeze throttling

我有一个ASP.Net网站,可以从WCF托管站点(IIS)获取所有业务逻辑。有一段时间,看起来后端WCF被冻结,这使得Web前端停止响应。我必须回收两个应用程序池才能使它再次运行。

  • 最近经常发生这种情况,可能是因为我们有更多&更多客户使用该网站。以前,它每个月发生一次,现在每周发生一次。也许更多。
  • 我们在每次SVC通话后关闭连接。
  • 我回收池后在事件日志中收到错误消息
  

消息:System.ServiceModel.CommunicationException:接收到........... / ..... BusinessServices.svc的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。请参阅服务器日志以获取更多详---> System.Net.WebException:基础连接已关闭:接收时发生意外错误。 ---> System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭现有连接。 ---> System.Net.Sockets.SocketException:远程主机强制关闭现有连接

  • 网络应用的Web.config:
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IBusinessServices" closeTimeout="00:31:00" openTimeout="00:31:00"
receiveTimeout="00:10:00" sendTimeout="00:31:00"
bypassProxyOnLocal="false" transactionFlow="false"
hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
maxReceivedMessageSize="2147483647" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
  <readerQuotas maxDepth="999" maxStringContentLength="2147483647" maxArrayLength="1638400"
  maxBytesPerRead="4096" maxNameTableCharCount="16384" />
   <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      <security mode="Message">
          <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
       <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" />
          </security>
   </binding>
        </wsHttpBinding>
      </bindings>
   <client>
    <endpoint address="http://localhost:8890/MyBusinessServices.svc" binding="wsHttpBinding"
 bindingConfiguration="WSHttpBinding_IBusinessServices"
contract="MyBusinessServices.IBusinessServices"
 name="WSHttpBinding_IBusinessServices" />
 </client>
  • WCF服务的Web.config,限制设置为1500

    .....                                                                                                                                                                                                         

        <behavior name="AppServiceBehaviors">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
          <serviceTimeouts transactionTimeout="00:15:00" />
          <serviceThrottling maxConcurrentCalls="1500" maxConcurrentSessions="1500"
            maxConcurrentInstances="2147483647" />
        </behavior>
    
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    

这个问题是间歇性的,但它让我发疯。任何想法/建议表示赞赏。

埃里克

2 个答案:

答案 0 :(得分:0)

您现在面临的问题可能是由于许多其他因素需要比我们现有的更多描述。

抛出异常是一种通用异常,可能指向许多可能的情况。例如,如果服务服务器前面有负载均衡器,其中一个在运行时出错,而另一个则没有。另一个例子是sql server在服务器端创建异常,但是你的包装异常可能不会将相关信息发送给你的客户端。所以你无法准确知道发生了什么。

我有一些建议可以检查:

我可以看到你表示你在每次通话后关闭连接。但是您需要确保接收异常的调用也已关闭。所以你的svc调用应该是这样的:

try
  {
     if (this.client != null)
     {
        IClientChannel channel = this.client as IClientChannel;
        if (channel.State == CommunicationState.Faulted)
        {
           channel.Abort();
        }
        else
        {
           channel.Close();
        }
     }
  }
  finally
  {
     this.client = null;
  }

除此之外,您可能还想检查IIS上的应用程序池设置。您可以从事件日志中确保您不会被迫使用“最大失败”设置进行回收/关闭。 (在高级应用程序池设置中 - rapidFailProtectionMaxCrashes)

答案 1 :(得分:0)

我的2美分,

服务中止 - 由于内部发生致命错误而导致错误,

确保在Dev中的VS IDE中调试WCF时,保留例外(Ctrl D,E),检查所有“未处理的异常”列。这使得IDE可以准确地破坏应用程序代码行,尽管存在CATCH ..这将发现任何错误。

如果有任何调查结果,请告诉我们......

祝你好运, HydTechie