WCF ServiceHost REST API会在一段时间后变为空闲状态,并返回超时错误

时间:2019-01-03 08:57:15

标签: rest wcf service

我们正面临Windows服务中托管的WCF REST API的生产问题。

我们让客户每30秒向客户发出GET和PUT请求,以及对服务的常规Ping()请求。

所有的Get,Put请求在一段时间(2或3天)内都可以正常工作,并且在以后的某个时刻不再提供任何WEB-API请求。我们不得不再次重新启动Windows服务,以使REST服务恢复到工作状态。

客户端错误消息:状态代码为503服务不可用。

可以通过以下方案在本地开发环境中重现该问题。

在每2秒发出一次Ping请求和每4秒发出一次Put请求后,在示例测试客户端的帮助下,模拟连续的REST本地服务调用,我们能够在发出68个Put请求和152 Get后在5分钟内重现该问题要求 。没有错误登录服务。状态代码为503服务不可用。

这是WCF REST服务的服务器配置。

WCF REST服务配置:

var restURL = string.Format("{0}{1}/v{2}", (isHttps ? WsSprotocol : WsProtocol), Config.Server, Config.Version);
            var webServiceHost = new WebServiceHost(typeof(EngageWebServiceHostREST), new Uri(restURL));

var webHttpBinding = new WebHttpBinding { Security = new WebHttpSecurity { Mode = isHttps ? WebHttpSecurityMode.Transport : WebHttpSecurityMode.None }, MaxReceivedMessageSize = int.MaxValue, ReaderQuotas = { MaxArrayLength = int.MaxValue }, OpenTimeout = new TimeSpan(0, 01, 00), CloseTimeout = new TimeSpan(0, 10, 00), SendTimeout = new TimeSpan(0, 10, 00), CrossDomainScriptAccessEnabled = true, TransferMode = TransferMode.StreamedResponse }; if (isHttps) { bindHttpCertificate(webServiceHost); if (webServiceHost.Credentials.ServiceCertificate != null && webServiceHost.Credentials.ServiceCertificate.Certificate != null) { webHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; Log.Info(string.Format("Https Certificate {0} binded to {1}", webServiceHost.Credentials.ServiceCertificate.Certificate.SubjectName.Name, restURL)); } } var customBinding = new CustomBinding(webHttpBinding); for (int counter = 0; counter < customBinding.Elements.Count; counter++) { if (customBinding.Elements[counter] is WebMessageEncodingBindingElement) { WebMessageEncodingBindingElement webBE = (WebMessageEncodingBindingElement)customBinding.Elements[counter]; customBinding.Elements[counter] = new GZipMessageEncodingBindingElement(webBE); } else if (customBinding.Elements[counter] is TransportBindingElement) { ((TransportBindingElement)customBinding.Elements[counter]).MaxReceivedMessageSize = int.MaxValue; } } ServiceEndpoint endpoint = webServiceHost.AddServiceEndpoint(typeof(IEngageWebServiceREST), customBinding, ""); endpoint.Behaviors.Add(new WebHttpBehavior() { AutomaticFormatSelectionEnabled = true, DefaultOutgoingResponseFormat = WebMessageFormat.Json }); endpoint.Behaviors.Add(new EnableCrossOriginResourceSharingBehavior()); endpoint.Behaviors.Add(new HelpPageEndPointBehavior("Product Suite")); var serviceDebugBehaviorLocal = webServiceHost.Description.Behaviors.Find<ServiceDebugBehavior>(); if (serviceDebugBehaviorLocal == null) { webServiceHost.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true }); } else { if (!serviceDebugBehaviorLocal.IncludeExceptionDetailInFaults) serviceDebugBehaviorLocal.IncludeExceptionDetailInFaults = true; }

等待并欣赏解决问题的想法和想法。

谢谢

Dileep

1 个答案:

答案 0 :(得分:0)

我建议您参考以下配置。

<system.serviceModel>
    <services>
      <service behaviorConfiguration="Service1Behavior" name="VM1.MyService">
        <endpoint address="" binding="webHttpBinding" contract="VM1.IService" behaviorConfiguration="rest" bindingConfiguration="mybinding" >
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <webHttpBinding>
        <binding name="mybinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" sendTimeout="00:10:00" receiveTimeout="00:10:00">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" />
          <security mode="Transport">
            <transport clientCredentialType="None"></transport>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Service1Behavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="rest">
          <webHttp/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>  

请随时让我知道问题是否仍然存在。