2010-08-12 6 views
16

Il canale di trasporto HTTP in WCF utilizza connessioni HTTP permanenti per impostazione predefinita. Come controllare mantenere il timeout attivo per quelle connessioni? Il valore predefinito è 100 secondi. Ho trovato questo valore monitorando l'applicazione in Procmon. Non ho trovato alcuna impostazione nell'elemento di binding del trasporto http che configura questo timeout. C'è qualche classe .NET che può controllare quel timeout?Come impostare l'intervallo keep-alive per la connessione HTTP in WCF

risposta

7

dare uno sguardo qui:

http://web.archive.org/web/20080721055556/http://blog.magenic.com/blogs/jons/archive/2007/05/04/The-Tao-of-Microsoft-WCF-CustomBinding-Configuration-Elements.aspx

C'è una discussione dettagliata di manipolare il mantenere la proprietà in vita durante una connessione http.

+2

Grazie per post, ma questo non risponde alla domanda. La domanda non riguarda lo spegnimento, ma mantenere il timeout. Quindi voglio tenere vivo il turno e voglio controllarne la durata. –

+3

Url non trovato, è un peccato – Kiquenet

0

Da this answer e quello che posso leggere here, sembra che si desideri creare un binding http personalizzato e impostare l'attributo inactivityTimeout.

Dall'articolo MSDN:

<bindings> 
    <customBinding> 
    <binding name="Binding1"> 
     <reliableSession acknowledgementInterval="00:00:00.2000000" enableFlowControl="true" 
         maxTransferWindowSize="32" inactivityTimeout="00:10:00" maxPendingChannels="128" 
         maxRetryCount="8" ordered="true" /> 
     <security mode="None"/> 
     <httpTransport authenticationScheme="Anonymous" bypassProxyOnLocal="false" 
        hostNameComparisonMode="StrongWildcard" 
        proxyAuthenticationScheme="Anonymous" realm="" 
        useDefaultWebProxy="true" /> 
    </binding> 
    </customBinding> 
</bindings> 
+1

No. Voglio impostare HTTP keep alive Non è possibile mantenere una sessione affidabile. HTTP keep alive è descritto nelle specifiche del protocollo HTTP. –

+0

Sembra che le connessioni HTTP siano sempre persistenti, come da RFC 2616 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.1). – louisgab

+1

Non credo. La RFC afferma che l'implementazione HTTP dovrebbe implementare connessioni persistenti HTTP. Non si dovrebbe usare solo la connessione persistente. –

0

ne dici di questo? Sembra che potrebbe essere una funzione del tuo server IIS e nulla a che fare con il servizio WCF? So che questo collegamento si applica a IIS6, ma forse serve come base per qualcosa di simile in IIS7? http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/73566f83-c257-4941-8ed8-7ae45b2e7985.mspx?mfr=true

+1

Ho già provato a configurare il timeout della connessione su IIS e non ha funzionato. Non è legato al mantenimento della vita. Comunque lo riproverò nei prossimi giorni. Se funziona, stabilirò la nuova taglia e ti assegnerò. –

1

Mi sembra che tu voglia regolare l'intestazione HTTP Keep-Alive. Dovresti leggere this article su HTTP keep-alive e determinare se è davvero qualcosa che vale la pena.

In caso affermativo, provare a creare un Message Inspector. Ciò dovrebbe consentire di modificare le intestazioni HTTP per ogni messaggio che viene inviato:

public class KeepAliveMessageInspector : IClientMessageInspector 
{ 
    // ... 

    public object BeforeSendRequest(
     ref System.ServiceModel.Channels.Message request, 
     System.ServiceModel.IClientChannel channel) 
    { 
     // Add/modify the Keep-Alive header 
     var httpRequestMessage = new HttpRequestMessageProperty(); 
     httpRequestMessage.Headers.Add("Keep-Alive", "9000"); 
     request.Properties.Add(
      HttpRequestMessageProperty.Name, httpRequestMessage); 
     return null; 
    } 

    // ... 
} 
+2

Questa idea è interessante. Ho visto qualcosa di simile in comunicazione con Cassini, ma penso che non sia l'intestazione standard. Comunque lo proverò nei prossimi giorni. Se funziona, stabilirò la nuova taglia e ti assegnerò. –

+0

Btw. Non ho bisogno di usarlo. Voglio solo sapere se è possibile cambiarlo in qualche modo e da dove proviene il valore predefinito 100s. –

+0

@Ladislav Mrnka: Ci scusiamo per svelare questo vecchio post, ma sei stato in grado di impostare o leggere questo valore keep-alive HTTP.Se sì, sarei molto interessato a saperne di più. Grazie –

1

Ho trovato la soluzione per questo. Il problema è che il kernel http.sys sottostante ha il proprio timeout e interromperà la connessione.

http://mmmreddy.wordpress.com/2013/07/11/wcf-use-of-http-transport-sharing-persistent-tcp-sessions/ 

netsh http add timeout timeouttype=idleconnectiontimeout value=120 

Inoltre, questa domanda è simile a questo What 130 second timeout is killig my WCF streaming service call?

Problemi correlati