Wie verhindere ich, dass mein .NET SOAP-Client „Verbindung:KeepAlive“ in den HTTP-Headern.(mit WSE3.0)

StackOverflow https://stackoverflow.com/questions/1527407

Frage

Im HTTP-Verbindungsheader enthält mein Webdienst-Client Folgendes:Connection: Keep-Alive

Ich möchte dies deaktivieren. Nach einigen Recherchen scheint es so zu sein, dass dies dadurch zu erreichen ist, dass das KeepAlive-Mitglied von festgelegt wird SoapHttpChannelOptions Klasse auf false.Aber ich sehe keine Möglichkeit, darauf zuzugreifen/Änderungen vorzunehmen SoapHttpChannelOptions in der Webservice-Client-Klasse das wurde für mich in Visual Studio mit WSE3.0 (Web Service Enhancement) generiert.

In meinem Fall wird die generierte Stub-Klasse erweitert Microsoft.Web.Services3.WebServicesClientProtocol

Ich konnte bei der Google-Suche keine Beispiele finden und die meisten Mitglieder der SoapHttpChannelOptions-Klasse werden in die WebServicesClientProtocol-Klasse geerbt ...

SoapHttpChannelOptions-Referenz
WebServicesClientProtocol-Referenz

Notiz:Ich versuche nicht, den Webserver zu ändern.Ich versuche, den Webdienst-Client zu ändern.

War es hilfreich?

Lösung

Eine Lösung besteht darin, das zu überschreiben GetWebRequest(Uri uri) Methode.
Die Informationen, die mich zu dieser Lösung geführt haben, wurden hier gefunden MSDN-Forumsbeitrag

Methode 1:Ändern Sie die automatisch generierte Datei.

Fügen Sie dieses Snippet in die Datei Reference.cs ein, die automatisch für Sie generiert wurde.Der Nachteil dieses Ansatzes besteht darin, dass Sie die Datei erneut ändern müssen, wenn Sie die Webdienst-Client-Adapter jemals neu generieren (z. B. Webreferenzen aktualisieren).

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
    System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
    webRequest.KeepAlive = false;
    return webRequest;
}

Methode 2:Erstellen Sie eine Teilklasse

Erstellen Sie eine Datei und fügen Sie den folgenden Code ein.Ändern Sie den Namespace und den Klassennamen so, dass sie zu Ihrem Webservice passen.

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;
        }
    }
}

Anmerkungen

Dieser Ansatz Mai funktioniert, wenn Sie WSE nicht verwenden.Ich konnte die obige Methode unter der Nicht-WSE-Webservice-Klasse einfügen ...was sich erstreckt System.Web.Services.Protocols.SoapHttpClientProtocol.Bei meinen Tests stellte sich heraus, dass dies dazu führte, dass es überhaupt keine Http-Verbindungszeile enthielt, während ich es in einer WSE-Klasse (von der abgeleitet ist) gemacht habe Microsoft.Web.Services3.WebServicesClientProtocol) es enthielt dann eine „Verbindung:Schließen"-Zeile.Entsprechend diese Seite auf HTTP KeepAlive:

Nach HTTP 1.1 ist die offizielle Keepalive -Methode unterschiedlich.Alle Verbindungen werden am Leben erhalten, sofern nicht mit dem folgenden Kopfball etwas anderes angegeben ist:Verbindung:schließen

Auch wenn KeepAlive möglicherweise nicht mehr im Header enthalten ist ...Ich denke, in HTTP1.1 wird davon ausgegangen, dass es die Standardeinstellung ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top