Wie verhindere ich, dass mein .NET SOAP-Client „Verbindung:KeepAlive“ in den HTTP-Headern.(mit WSE3.0)
-
20-09-2019 - |
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.
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.