7

在 HTTP 连接标头中,我的 Web 服务客户端包括: Connection: Keep-Alive

我想禁用它。 在做了一些研究之后,看起来这样做的方法是将SoapHttpChannelOptions类的 KeepAlive 成员设置为 false。但是,我看不到SoapHttpChannelOptions在使用 WSE3.0(Web 服务增强)为我在 Visual Studio 中生成的 Web 服务客户端类中访问/修改的方法。

在我的例子中,生成的存根类扩展Microsoft.Web.Services3.WebServicesClientProtocol

我一直无法找到搜索谷歌的任何示例,并且 SoapHttpChannelOptions 类的大多数成员都被继承到 WebServicesClientProtocol 类中......

SoapHttpChannelOptions 参考
WebServicesClientProtocol 参考

注意:我不是要修改网络服务器。我正在尝试修改 Web 服务客户端。

4

1 回答 1

12

一种解决方案是覆盖该GetWebRequest(Uri uri)方法。在此MSDN 论坛帖子
中找到了导致我找到此解决方案的信息

方法一:修改自动生成文件。

将此代码段粘贴到自动为您生成的 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;
}

方法二:创建分部类

创建一个文件并将以下代码粘贴到其中。修改命名空间和类名,使其与您的 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,此方法可能会起作用。我能够将上述方法粘贴到非 WSE webservice 类下...扩展System.Web.Services.Protocols.SoapHttpClientProtocol. 从我的测试来看,这似乎使它根本不包含任何 Http Connection 行,而当我在 WSE 类(派生自Microsoft.Web.Services3.WebServicesClientProtocol)中执行它时,它包含了一个“Connection: Close”行。根据HTTP KeepAlive 上的这个站点

在 HTTP 1.1 下,官方的 keepalive 方法有所不同。除非使用以下标头另有说明,否则所有连接都保持活动状态:连接:关闭

因此,虽然它可能不再在标头中包含 KeepAlive ......我认为在 HTTP1.1 中它被假定为默认值。

于 2009-10-07T18:04:50.960 回答