Come posso evitare che il mio .NET client SOAP tra cui “la Connessione:KeepAlive” nelle intestazioni HTTP.(utilizzando WSE3.0)

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

Domanda

In Connessione HTTP intestazione, il mio client del servizio web è comprensivo di:Connection: Keep-Alive

Voglio disattivare questa opzione. Dopo aver fatto alcune ricerche, sembra che il modo per farlo è quello di impostare il KeepAlive membro del SoapHttpChannelOptions classe false.Ma non vedo un modo per accedere/modificare SoapHttpChannelOptions nel webservice classe client che è stato generato per me in Visual Studio utilizzando WSE3.0 (Web Di Miglioramento Del Servizio.

Nel mio caso, lo stub generato classe estende Microsoft.Web.Services3.WebServicesClientProtocol

Sono stato in grado di trovare alcuni esempi di ricerca di google e la maggior parte dei membri del SoapHttpChannelOptions classe vengono ereditate in WebServicesClientProtocol classe...

SoapHttpChannelOptions Di Riferimento
WebServicesClientProtocol Di Riferimento

Nota:Non sto cercando di modificare il server web.Sto cercando di modificare il client del servizio web.

È stato utile?

Soluzione

Una soluzione è quella di ignorare il GetWebRequest(Uri uri) metodo.
Le informazioni che mi portano a questa soluzione è stato trovato su questo MSDN Post del Forum

Metodo 1:Modificare le Auto di file Generato.

Incolla questo frammento di codice nella di Riferimento.cs file che è stato generato automaticamente per voi.Lo svantaggio di questo approccio è, se mai, per rigenerare il client del servizio web adattatori (ie Aggiornamento Riferimenti Web) si dovrà quindi modificare di nuovo il file.

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

Metodo 2:Creare una classe parziale

Creare un file e incollare il codice seguente.Modificare lo spazio dei nomi e il nome della classe in modo che corrispondano il 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;
        }
    }
}

Note

Questo approccio può di lavoro se non si utilizza WSE.Sono stato in grado di incollare il metodo sopra sotto non WSE classe webservice...che si estende System.Web.Services.Protocols.SoapHttpClientProtocol.Dal mio test è emerso che questo fatto non includere qualsiasi Connessione Http riga a tutti dove come quando l'ho fatto all'interno di un WSE classe (che sono derivati da Microsoft.Web.Services3.WebServicesClientProtocol) è quindi un Collegamento:Chiudere" la linea.Secondo questo sito HTTP KeepAlive:

In HTTP 1.1, ufficiale keepalive il metodo è diverso.Tutte le connessioni sono tenuti in vita, a meno che non indicato altrimenti, con la seguente intestazione:Connessione:chiudere

Così, mentre non può non includere KeepAlive nell'intestazione più...Penso che in HTTP1.1 è assunto per essere il default.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top