2010-08-12 7 views
16

Der HTTP-Transportkanal in WCF verwendet standardmäßig persistente HTTP-Verbindungen. Wie kontrolliere ich das Timeout für diese Verbindungen? Der Standardwert ist 100s. Ich habe diesen Wert durch Überwachung der Anwendung in Procmon gefunden. Ich habe keine Einstellung in HTTP-Transport-Bindungselement gefunden, das dieses Timeout konfiguriert. Gibt es eine .NET-Klasse, die dieses Zeitlimit steuern kann?Festlegen des Keep Alive-Intervalls für HTTP-Verbindung in WCF

Antwort

7

Werfen Sie einen Blick hier:

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

Es gibt eine ausführliche Diskussion über die Manipulation der lebendig Eigenschaft während einer HTTP-Verbindung ist zu halten.

+2

Dank für die Post aber die Frage nicht beantworten. Bei der Frage geht es nicht darum, Keep am Leben zu lassen, sondern über Keep Alive Timeout. Also möchte ich am Leben bleiben und ich möchte seine Dauer kontrollieren. –

+3

Url nicht gefunden, es ist schade – Kiquenet

0

Von this answer, und was ich here lesen kann, sieht es aus wie Sie eine benutzerdefinierte HTTP-Bindung, erstellen möchten, und stellen Sie die inactivityTimeout Attribut.

Aus dem MSDN-Artikel:

<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

Nein. Ich möchte HTTP am Leben lassen nicht zuverlässig Sitzung aufrecht erhalten. HTTP keep alive ist in der HTTP-Protokollspezifikation beschrieben. –

+0

Scheint, dass HTTP-Verbindungen immer persistent sein sollten, gemäß RFC 2616 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.1). – louisgab

+1

Ich glaube nicht. Der RFC besagt, dass die HTTP-Implementierung HTTP-persistente Verbindungen implementieren sollte. Nicht, dass nur persistente Verbindung verwendet werden sollte. –

0

Wie wäre das? Scheint es eine Funktion Ihres IIS-Servers und nichts mit dem WCF-Dienst zu tun? Ich weiß, dass dieser Link für IIS6 gilt, aber vielleicht dient er als Grundlage für etwas Ähnliches in IIS7? http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/73566f83-c257-4941-8ed8-7ae45b2e7985.mspx?mfr=true

+1

Ich habe bereits versucht, Verbindungstimeout auf IIS einzurichten, und es hat nicht funktioniert. Es hat nichts damit zu tun, die Einstellung beizubehalten. Jedenfalls werde ich es in den nächsten Tagen noch einmal versuchen. Wenn es funktioniert, werde ich das neue Kopfgeld setzen und dich auszeichnen. –

1

Es klingt für mich, als ob Sie den HTTP-Header Keep-Alive anpassen möchten. Sie sollten this article auf HTTP keep-alive lesen und zuerst feststellen, ob dies wirklich etwas wert ist.

Wenn dies der Fall ist, erstellen Sie eine Message Inspector. Dies sollte Ihnen ermöglichen, die HTTP-Header für jede Nachricht, die gesendet wird, zu ändern:

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

Diese Idee ist interessant. Ich habe so etwas in Verbindung mit Cassini gesehen, aber ich denke, es ist kein Standard-Header. Jedenfalls werde ich es in den nächsten Tagen versuchen. Wenn es funktioniert, werde ich das neue Kopfgeld setzen und dich auszeichnen. –

+0

BTW. Ich brauche es nicht zu benutzen. Ich möchte nur wissen, ob es möglich ist, es irgendwie zu ändern und wo der Standardwert 100s herkommt. –

+0

@Ladislav Mrnka: Entschuldigen Sie diesen alten Post, aber Sie konnten diesen HTTP Keep-Alive-Wert setzen oder lesen.Wenn ja, wäre ich sehr daran interessiert, mehr darüber zu erfahren. Danke –

1

Ich fand die Lösung dafür. Das Problem ist, dass der zugrunde liegende Kernel http.sys eine eigene Zeitüberschreitung hat und die Verbindung unterbrochen wird.

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

netsh http add timeout timeouttype=idleconnectiontimeout value=120 

Auch diese Frage ist ähnlich wie dieser What 130 second timeout is killig my WCF streaming service call?

Verwandte Themen