Come posso evitare che il mio .NET client SOAP tra cui “la Connessione:KeepAlive” nelle intestazioni HTTP.(utilizzando WSE3.0)
-
20-09-2019 - |
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.
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.