一种解决方案是覆盖该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 中它被假定为默认值。