Как установить интервал поддержания активности для HTTP-соединения в WCF - PullRequest
17 голосов
/ 12 августа 2010

Http транспортный канал в WCF по умолчанию использует постоянные HTTP-соединения. Как контролировать время ожидания для этих соединений? Значение по умолчанию - 100 с. Я нашел это значение путем мониторинга приложения в Procmon. Я не нашел никаких настроек в http-обязательном элементе транспорта, который настраивает этот тайм-аут. Есть ли какой-либо класс .NET, который может контролировать это время ожидания?

Ответы [ 6 ]

8 голосов
/ 23 августа 2010

Посмотрите здесь:

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

Подробно обсуждается манипулирование свойством keep alive во время http-соединения.

1 голос
/ 08 мая 2018

Настройка ServicePoint.MaxIdleTime должна позволить вам изменить 100-секундный тайм-аут простоя на постоянных соединениях HTTP.

https://www.visualbasicplanet.info/windows-communication/configuring-http-connections.html

1 голос
/ 27 августа 2013

Я нашел решение для этого.Проблема в том, что базовое ядро ​​http.sys имеет свой собственный тайм-аут, и он разорвет соединение.

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

netsh http add timeout timeouttype=idleconnectiontimeout value=120

Кроме того, этот вопрос похож на этот Какой 130-секундный таймаут уничтожает мою потоковую передачу WCFсервисный звонок?

1 голос
/ 25 августа 2010

Мне кажется, что вы хотите настроить HTTP-заголовок Keep-Alive. Вы должны прочитать эту статью о поддержании HTTP и сначала определить, действительно ли это стоит вашего времени.

Если это так, попробуйте создать Инспектор сообщений . Это должно позволить вам изменять заголовки HTTP для каждого отправляемого сообщения:

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;
    }

    // ...
}
0 голосов
/ 25 августа 2010

Как насчет этого?Кажется, это может быть функция вашего сервера IIS и не имеет никакого отношения к службе WCF?Я знаю, что эта ссылка относится к IIS6, но, может быть, она служит основой для чего-то подобного в IIS7?http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/73566f83-c257-4941-8ed8-7ae45b2e7985.mspx?mfr=true

0 голосов
/ 24 августа 2010

Из этого ответа , и что я могу прочитать здесь , похоже, что вы хотите создать пользовательскую привязку http и установить атрибут inactivityTimeout.

Из статьи 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...