1つの解決策は、メソッドをオーバーライドするGetWebRequest(Uri uri)
ことです。
このソリューションにつながる情報は、このMSDNフォーラムの投稿にあります。
方法1:自動生成ファイルを変更します。
このスニペットを、自動的に生成されたReference.csファイルに貼り付けます。このアプローチの欠点は、Webサービスクライアントアダプタを再生成する(つまり、Web参照を更新する)場合は、ファイルを再度変更する必要があることです。
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
webRequest.KeepAlive = false;
return webRequest;
}
方法2:部分クラスを作成する
ファイルを作成し、次のコードをそのファイルに貼り付けます。名前空間とクラス名を変更して、Webサービスと一致させます。
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を使用しない場合に機能する可能性があります。上記のメソッドを非WSEWebサービスクラスの下に貼り付けることができました...拡張しSystem.Web.Services.Protocols.SoapHttpClientProtocol
ます。私のテストから、これによりHttp接続行がまったく含まれなくなったように見えましたが、WSEクラス(から派生Microsoft.Web.Services3.WebServicesClientProtocol
)内で行った場合は、「接続:閉じる」行が含まれていました。HTTPキープアライブのこのサイトによると:
HTTP 1.1では、公式のキープアライブ方式が異なります。次のヘッダーで特に明記されていない限り、すべての接続は有効に保たれます。接続:閉じる
したがって、ヘッダーにKeepAliveが含まれなくなった可能性がありますが、HTTP1.1ではデフォルトであると想定されています。