2012-03-05 28 views
6

¿Hay alguna manera de establecer un tiemout en el lado del servicio para que la solicitud detenga el procesamiento si supera el tiempo de espera? Sé que puedo cronometrar la solicitud en el lado del cliente, pero eso no detiene el procesamiento de la solicitud en el servidor.Tiempo de espera del servicio WCF

He intentado añadir la siguiente unión:

<basicHttpBinding> 
    <binding name="timeout" receiveTimeout="00:01:00" closeTimeout="00:01:00" openTimeout="00:01:00" sendTimeout="00:01:00" /> 
</basicHttpBinding> 

También he intentado la adición de lo siguiente en el nodo system.web (por separado y junto con la anterior):

<httpRuntime executionTimeout="60" /> <!-- timeout after 60 seconds --> 
+2

Los tiempos de espera que se pueden configurar en la configuración de enlace del punto final se debió principalmente a los tiempos de espera de transporte/canal, lo que está pidiendo es una manera de plazo su procesamiento- servicio código independientemente de cuánto tiempo de comunicación es necesario, ¿verdad? por ejemplo, le gustaría establecer que su servicio WCF abortará las operaciones de procesamiento si lleva más de 2 minutos ... ¿es esto lo que está preguntando? – CSharpenter

+0

@Csharpenter - eso es básicamente correcto. – zimdanen

Respuesta

7

No hay construido en (fuera de la caja) forma de hacer esto. Todos los tiempos de espera que puede establecer están relacionados con la configuración de transporte. En pocas palabras, tienes que hacer eso tú mismo.

Consulte también this answer para limitar el tiempo de ejecución de WCF.

+0

Gracias. Puede que tenga que esperar para un proyecto posterior, entonces, ya que no tendré tiempo para obtener una solución personalizada en el proyecto actual. – zimdanen

1

Podemos establecer el tiempo del lado del servidor en "unión" con:

Binding.ReceiveTimeout 

Este es el tiempo de espera que especifica el tiempo que el servicio puede esperar desde el comienzo de la recepción de una solicitud hasta que el el mensaje se procesa Es configuración del lado del servidor. Cuando envía un mensaje grande al servicio y el servicio necesita mucho tiempo para procesarse, debe aumentar esta configuración.

http://msdn.microsoft.com/en-us/library/ms731361.aspx

El uso de estas dos tiempos de espera debe resolver la mayoría de problemas de tiempo de espera. Sin embargo, cuando un servicio WCF está alojado en IIS/ASP.NET, a otro entorno sería también el control de la vida útil de la solicitud:

HttpRuntimeSection.ExecutionTimeout

<configuration> 
    <system.web> 
    <httpRuntime executionTimeout="600"/> 
    </system.web> 
</configuration> 
+0

Vea mi edición más reciente, que no parece limitar el tiempo desde el inicio hasta el final de la llamada de servicio completo, que es lo que estoy tratando de hacer. – zimdanen

+0

AFAIK eso no es verdad. Para obtener más información sobre 'ReceiveTimeout', consulte http://www.rauch.io/2015/06/25/all-wcf-timeouts-explained/ –

0

sí yo puedo manejar lo que tiene que configurar el archivo web.config se vea como

<?xml version="1.0" encoding="UTF-8"?> 

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="DomainServiceModule" preCondition="managedHandler" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    </modules> 
    <directoryBrowse enabled="false" /> 
</system.webServer> 

<system.web> 
    <httpModules> 
     <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    </httpModules> 
    <compilation debug="true" targetFramework="4.0"> 
     <assemblies><add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     </assemblies> 
    </compilation> 
    <httpRuntime executionTimeout="36000"/> 
    <!--<sessionState mode="InProc" timeout="36000" />--> 
</system.web> 


<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 

    <bindings> 
    <basicHttpBinding> 
     <binding name="Sbinding" maxReceivedMessageSize="1500000000" maxBufferSize="1500000000"> 
     <readerQuotas maxArrayLength="1500000000" maxStringContentLength="1500000000" /> 
     </binding> 
    </basicHttpBinding> 

    <webHttpBinding> 
     <binding name="Ubinding" maxBufferSize="1500000000" maxBufferPoolSize="1500000000" maxReceivedMessageSize="1500000000" transferMode="Streamed"> 
     <readerQuotas maxStringContentLength="1500000000" maxArrayLength="1500000000" maxBytesPerRead="1500000000" maxNameTableCharCount="1500000000" /> 
     </binding> 
    </webHttpBinding> 

    </bindings> 

    <behaviors> 
    <serviceBehaviors> 
      <behavior name="ClientUpload.Web.UploadService"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 

      <behavior name="ServiceBehaviour"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 
    </serviceBehaviors> 

    <endpointBehaviors> 
     <behavior name="web"> 
     <webHttp /> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 


    <services> 
    <service behaviorConfiguration="ClientUpload.Web.UploadService" name="ClientUpload.Web.Services.UploadService"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="Sbinding" contract="ClientUpload.Web.Services.IUploadService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 

    <service name="ClientUpload.Web.Services.RestService" behaviorConfiguration="ServiceBehaviour"> 
     <endpoint address="Rest" binding="webHttpBinding" contract="ClientUpload.Web.Services.IService1" behaviorConfiguration="web" bindingConfiguration="Ubinding"> 
     </endpoint> 
    </service> 
    </services>    


</system.serviceModel> 

-> ->

Y Sus ServiceReferences del lado del cliente.archivo ClientConfig ve como

<configuration> 
<system.serviceModel> 

    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IUploadService" closeTimeout="00:10:00" 
       openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
       maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
       <security mode="None" /> 
      </binding> 
      <binding name="BasicHttpBinding_IUploadService1" closeTimeout="00:10:00" 
       openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
       maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
       <security mode="None" /> 
      </binding> 

     </basicHttpBinding> 
    </bindings> 

    <!--<client> 
    <endpoint address="http://localhost/ClientUpload.Web_deploy/Services/UploadService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IUploadService" 
     contract="ServiceReference1.IUploadService" name="BasicHttpBinding_IUploadService" /> 
    </client>--> 


    <client> 
    <endpoint address="http://localhost:50503/Services/UploadService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IUploadService1" 
     contract="ServiceReference.ClientUpload.Web.Services.UploadService.IUploadService" 
     name="BasicHttpBinding_IUploadService1" /> 
    <endpoint address="http://localhost:50503/Services/UploadService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IUploadService" 
     contract="ServiceReference1.IUploadService" name="BasicHttpBinding_IUploadService" /> 
    </client> 

    <!--<client> 
    <endpoint address="http://10.223.211.37:81/ClientUpload/Services/UploadService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IUploadService" 
     contract="ServiceReference1.IUploadService" name="BasicHttpBinding_IUploadService" />   
    </client>-->  

</system.serviceModel> 

Cuestiones relacionadas