Эти конструкции могут часто заменяться полиморфизмом. Это даст Вам короче и менее хрупкому коду.
Одно из решений - переопределить метод GetWebRequest (Uri uri)
.
Информация, которая привела меня к этому решению, была найдена в сообщении форума MSDN
Вставьте этот фрагмент в файл 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;
}
Создайте файл и вставьте следующий код в него. Измените пространство имен и имя класса, чтобы они соответствовали вашему веб-сервису.
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 он используется по умолчанию.