【问题标题】:WCF web service is too busyWCF Web 服务太忙
【发布时间】:2013-07-17 13:25:47
【问题描述】:

我遇到了繁忙的 wcf 服务问题,客户端可以通过该服务连接并使用它。 下面是关于类的服务器配置和属性的错误和堆栈跟踪。

错误信息和堆栈跟踪:

The HTTP service located at https://my.web.service.com/Service/Service.svc is unavailable.  This could be because the service is too busy or because no endpoint was found listening at the specified address. Please ensure that the address is correct and try accessing the service again later.ExST: 
Server stack trace: 
   at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation(SecuritySessionOperation operation, EndpointAddress target, Uri via, SecurityToken currentToken, TimeSpan timeout)
   at System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(TimeSpan timeout)
   at System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan timeout)
   at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

网络服务器配置:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="Server.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
      <section name="ServerEdi.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>

  <system.web>
    <httpRuntime maxRequestLength="65536"/>
    <customErrors mode="Off"/>
    <compilation targetFramework="4.5"/>
    <pages controlRenderingCompatibilityVersion="4.0"/>
  </system.web>

  <system.serviceModel>

    <bindings>
      <wsHttpBinding>
        <binding name="IWebService" closeTimeout="01:00:00" openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
            <message clientCredentialType="UserName" negotiateServiceCredential="true"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <services>
      <service behaviorConfiguration="nowa" name="ServiceWeb.WebService">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="IWebService"
          contract="ServiceWeb.IWebService" />
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="nowa">
          <serviceMetadata httpsGetEnabled="true"/>
          <serviceCredentials>
            <serviceCertificate findValue="xxxyyyzzz.com" storeLocation="LocalMachine" x509FindType="FindBySubjectName"/>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ServiceWeb.MyCustomUserNamePasswordValidator,ServiceWeb"/>
            <windowsAuthentication includeWindowsGroups="false" allowAnonymousLogons="false"/>
          </serviceCredentials>
          <serviceAuthorization impersonateCallerForAllOperations="false"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceThrottling maxConcurrentCalls="500" maxConcurrentInstances="500" maxConcurrentSessions="500" />

        </behavior>

      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>

  <system.webServer>
    <urlCompression doStaticCompression="false"/>
  </system.webServer>

</configuration>   

类属性:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
   //[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
  //  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
   //              ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class WebService : IWebService {}

如果有人可以提供帮助,我将不胜感激 stackoverflow 上描述的案例不完全适合并解决我的案例。目前,该服务正在使用大约 50 个客户。当我调用一个返回一些东西的方法并且你不能异步调用它时,问题就来了,因为答案必须立即传递。

【问题讨论】:

  • 当你说“当我调用一个返回一些东西的方法时问题就来了,你不能异步调用它,因为答案必须立即传递。”它将花费尽可能长的时间,并且使其同步不会使它更快地返回?
  • 我知道,客户将等待答案是对象,并为他提供下一步该做什么的信息。
  • 我可以建议你也考虑线程池设置..(见答案stackoverflow.com/questions/2835595/…)
  • Phil_P - 线程池设置似乎没问题,但如果您有任何疑问,我可以提供线程池配置

标签: c# wcf service web


【解决方案1】:

WCF 有一些默认限制值,因此您可能会遇到这些值,请参阅:http://blogs.msdn.com/b/wenlong/archive/2009/07/26/wcf-4-higher-default-throttling-settings-for-wcf-services.aspx

通常,当客户端不关闭连接时,您会收到此错误,连接会一直打开直到超时,阻止任何新调用。

【讨论】:

  • 如果他们在拨打电话时没有在他们的代码周围使用“using”语句会导致这种情况吗?
  • 我不这么认为,在我的代码中,我尝试了在 try 中使用 close() 的 try catch 和在 catch 中调用 abort() 的选项。解决不了问题。
  • Shiraz Bhaiji - 所以我可以删除我的节流设置,因为默认设置很好。
  • @shiraz:所以如果我的客户端代码没有关闭 WCF 服务连接,会发生这种情况吗?
猜你喜欢
  • 2011-12-24
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2010-09-25
  • 2018-02-15
相关资源
最近更新 更多