我们正面临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服务的服务器配置。
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
答案 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>
请随时让我知道问题是否仍然存在。