2013-07-17 70 views
0

我遇到了一個繁忙的wcf服務,客戶端可以通過它連接並使用它。 以下是服務器配置和類的屬性上的錯誤和堆棧跟蹤。WCF Web服務太忙

錯誤消息和堆棧跟蹤:

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) 

Web服務器配置:

<?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名客戶。當我調用返回某個方法的方法並且不能異步調用它時,問題就出現了,因爲必須立即傳遞答案。

+0

當你說「當我調用一個返回某個方法的方法,並且你不能異步調用它,因爲答案必須立即傳遞。」它會花費時間,並使其同步不會使它更快返回? – Belogix

+0

我知道,客戶端會等待回答,這是對象的信息,他下一步該怎麼做。 –

+0

我可以建議你也考慮線程池設置..(見答案http://stackoverflow.com/questions/2835595/does-wcf-use-the-threadpool-to-bring-up-new-instances-for-a -percall-service) –

回答

2

WCF有一些默認的限制值,那麼你很可能擊中這些,請參閱:http://blogs.msdn.com/b/wenlong/archive/2009/07/26/wcf-4-higher-default-throttling-settings-for-wcf-services.aspx

通常你當客戶端不關閉連接出現此錯誤,連接是開放的,直到他們超時,阻止任何新調用。

+0

如果在撥打電話時沒有在代碼周圍使用「using」語句,可能會導致這種情況嗎? –

+0

我不這麼認爲,在我的代碼中,我嘗試嘗試使用try()函數中的close()和catch()中的catch()調用。它不能解決問題。 –

+0

Shiraz Bhaiji - 所以我可以刪除我的限制設置,因爲默認情況很好。 –