7

HTTP接続ヘッダーに、私のWebサービスクライアントには次のものが含まれています。 Connection: Keep-Alive

これを無効にしたい。 調査を行った後、これを行う方法は、SoapHttpChannelOptionsクラスのKeepAliveメンバーをfalseに設定することであるように見えます。SoapHttpChannelOptionsしかし、 WSE3.0(Webサービス拡張)を使用してVisualStudioで生成されたWebサービスクライアントクラスにアクセス/変更する方法がわかりません。

私の場合、生成されたスタブクラスは拡張されますMicrosoft.Web.Services3.WebServicesClientProtocol

グーグルを検索する例を見つけることができず、SoapHttpChannelOptionsクラスのほとんどのメンバーがWebServicesClientProtocolクラスに継承されています...

SoapHttpChannelOptionsリファレンス
WebServicesClientProtocolリファレンス

注:私はWebサーバーを変更しようとはしていません。Webサービスクライアントを変更しようとしています。

4

1 に答える 1

12

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ではデフォルトであると想定されています。

于 2009-10-07T18:04:50.960 に答える