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

StackOverflow https://stackoverflow.com/questions/1527407

Вопрос

В заголовке HTTP-соединения мой клиент веб-службы включает:Connection: Keep-Alive

Я хочу отключить это. После проведения некоторых исследований выяснилось, что способ сделать это - установить элемент KeepAlive в SoapHttpChannelOptions присвоить классу значение false.Но я не вижу способа получить доступ / изменить SoapHttpChannelOptions в клиентском классе webservice это было сгенерировано для меня в Visual Studio с использованием WSE3.0 (Улучшение веб-службы.

В моем случае сгенерированный класс-заглушка расширяет Microsoft.Web.Services3.WebServicesClientProtocol

Я не смог найти никаких примеров в Google, и большинство членов класса SoapHttpChannelOptions наследуются в классе WebServicesClientProtocol...

Ссылка на SoapHttpChannelOptions
Ссылка на WebServicesClientProtocol

Примечание:Я не пытаюсь модифицировать веб-сервер.Я пытаюсь изменить клиент веб-службы.

Это было полезно?

Решение

Одно из решений состоит в том, чтобы переопределить 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.Мне удалось вставить описанный выше метод в класс webservice, отличный от WSE...который расширяет System.Web.Services.Protocols.SoapHttpClientProtocol.Из моего тестирования выяснилось, что из-за этого он вообще не включал ни одной строки Http-соединения, где, как и тогда, когда я делал это внутри класса WSE (которые являются производными от Microsoft.Web.Services3.WebServicesClientProtocol) затем он включил "Соединение:Закрыть" строку.Согласно этот сайт на HTTP KeepAlive:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top