Как мне запретить моему .NET SOAP-клиенту включать “Подключение:KeepAlive” в заголовках HTTP.(используя WSE3.0)
-
20-09-2019 - |
Вопрос
В заголовке 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 предполагается, что это значение по умолчанию.