Как делают я предотвращаю свой клиент SOAP.NET от включения “Соединения: KeepAlive” в HTTP-заголовках. (использующий WSE3.0)

Эти конструкции могут часто заменяться полиморфизмом. Это даст Вам короче и менее хрупкому коду.

7
задан blak3r 7 October 2009 в 17:37
поделиться

1 ответ

Одно из решений - переопределить метод GetWebRequest (Uri uri) .
Информация, которая привела меня к этому решению, была найдена в сообщении форума MSDN

Метод 1: изменить автоматически созданный файл.

Вставьте этот фрагмент в файл Reference.cs, который был автоматически создан для вас. Обратной стороной этого подхода является то, что если вы когда-либо повторно создадите клиентские адаптеры веб-службы (например, обновите веб-ссылки), вам придется затем снова изменить файл.

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
    System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
    webRequest.KeepAlive = false;
    return webRequest;
}

Метод 2: Создать частичный класс

Создайте файл и вставьте следующий код в него. Измените пространство имен и имя класса, чтобы они соответствовали вашему веб-сервису.

namespace YourNamespace
{
    using System.Diagnostics;
    using System.Web.Services;
    using System.ComponentModel;
    using System.Web.Services.Protocols;
    using System;
    using System.Xml.Serialization;

    /// <summary>
    /// This partial class makes it so all requests specify
    /// "Connection: Close" instead of "Connection: KeepAlive" in the HTTP headers.
    /// </summary>
    public partial class YourServiceNameWse : Microsoft.Web.Services3.WebServicesClientProtocol
    {
        protected override System.Net.WebRequest GetWebRequest(Uri uri)
        {
            System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
            webRequest.KeepAlive = false;
            return webRequest;
        }
    }
}

Примечания

Этот подход может работать, если вы не используете WSE. Мне удалось вставить приведенный выше метод в класс веб-службы без WSE ... который расширяет System.Web.Services.Protocols.SoapHttpClientProtocol . По результатам моего тестирования выяснилось, что из-за этого он вообще не включал какую-либо строку Http Connection, тогда как когда я делал это внутри класса WSE (производного от Microsoft.Web.Services3.WebServicesClientProtocol ), он затем включал Строка «Подключение: Закрыть». Согласно этот сайт в HTTP KeepAlive :

В HTTP 1.1 официальный KeepAlive метод другой. Все подключения остаются в живых, если не указано иное в противном случае со следующим заголовком: Connection: close

Итак, хотя он может больше не включать KeepAlive в заголовок ... Я думаю, что в HTTP1.1 он используется по умолчанию.

12
ответ дан 6 December 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: