如何防止我的.NET SOAP客户端在HTTP标头中包含"Connection:KeepAlive".(使用WSE3.0)

bla*_*k3r 7 .net wse keep-alive webservice-client wse3.0

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

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

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

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

SoapHttpChannelOptions参考
WebServicesClientProtocol Reference

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

bla*_*k3r 12

一种解决方案是覆盖该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;
}
Run Code Online (Sandbox Code Playgroud)

方法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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

笔记

如果您不使用WSE,此方法可能有效.我能够将上面的方法粘贴到非WSE webservice类...扩展System.Web.Services.Protocols.SoapHttpClientProtocol.从我的测试看来,这使得它不包括任何Http连接线,就像我在WSE类(它是派生的Microsoft.Web.Services3.WebServicesClientProtocol)里面做的那样它然后包括一个"Connection:Close"线.根据HTTP KeepAlive上的这个网站:

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

所以,虽然它可能不再在标题中包含KeepAlive ......我认为在HTTP1.1中它被认为是默认值.