Comment puis-je empêcher mon .NET client SOAP à partir notamment de la Connexion“:KeepAlive” dans les en-têtes HTTP.(à l'aide de WSE3.0)

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

Question

Dans le HTTP en-tête de Connexion, mon client de service web est notamment:Connection: Keep-Alive

Je veux désactiver cette option. Après avoir fait quelques recherches, il semble que la façon de le faire est de définir le KeepAlive membre de l' SoapHttpChannelOptions classe de faux.Mais, je ne vois pas le moyen d'y accéder/modifier SoapHttpChannelOptions dans le webservice classe client qui a été généré pour moi dans Visual Studio à l'aide de WSE3.0 (Service Web De Mise En Valeur.

Dans mon cas, le produit de la classe de stub s'étend Microsoft.Web.Services3.WebServicesClientProtocol

J'ai été incapable de trouver des exemples de recherche google et la plupart des membres de la SoapHttpChannelOptions classe sont héritées dans le WebServicesClientProtocol classe...

SoapHttpChannelOptions De Référence
WebServicesClientProtocol De Référence

Note:Je ne suis pas en train de modifier le serveur web.Je suis en train de modifier le client de service web.

Était-ce utile?

La solution

Une solution est de remplacer la GetWebRequest(Uri uri) la méthode.
Les informations qui m'amènent à cette solution qui a été trouvée sur ce MSDN Post sur le Forum

Méthode 1:Modifier la génération Automatique d'un fichier.

Coller cet extrait dans la Référence.cs fichier qui a été généré automatiquement pour vous.L'inconvénient de cette approche est que si jamais vous régénérer le client de service web des adaptateurs (c'est à dire la mise à Jour des Références Web), vous devrez alors modifier le fichier de nouveau.

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

Méthode 2:Créer une classe partielle

Créer un fichier et collez le code suivant dans ce.Modifier l'espace de noms et le nom de classe afin qu'elles correspondent à votre webservice.

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

Notes

Cette approche peut travail si vous n'utilisez pas WSE.J'ai été en mesure de le coller la méthode ci-dessus en vertu de la non WSE classe webservice...qui s'étend System.Web.Services.Protocols.SoapHttpClientProtocol.De mon test, il est apparu que ce fait-il pas comprendre toute l'adresse Http de la ligne de Connexion à tous où que quand je l'ai fait à l'intérieur d'un WSE classe (qui sont issus de Microsoft.Web.Services3.WebServicesClientProtocol) ensuite, elle comprend une Connexion:Proche" de la ligne.Selon ce site sur HTTP KeepAlive:

En vertu de HTTP 1.1, l'officiel keepalive la méthode est différente.Toutes les connexions sont maintenus en vie, à moins d'indication sinon, avec l'en-tête suivant:Connexion:fermer

Ainsi, même s'il ne peut pas inclure de KeepAlive dans l'en-tête...plusJe pense que dans HTTP1.1 c'est supposé être la valeur par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top