¿Cómo evito que mi cliente .NET SOAP incluya “Conexión:KeepAlive” en los encabezados HTTP.(usando WSE3.0)
-
20-09-2019 - |
Pregunta
En el encabezado de la Conexión HTTP, mi cliente de servicio web incluye:Connection: Keep-Alive
Quiero desactivar esto. Después de investigar un poco, parece que la forma de hacerlo es configurar el miembro KeepAlive del SoapHttpChannelOptions
clase a falso.Pero no veo una manera de acceder/modificar SoapHttpChannelOptions
en la clase de cliente de servicio web que se generó para mí en Visual Studio usando WSE3.0 (Web Service Enhancement.
En mi caso, la clase stub generada se extiende Microsoft.Web.Services3.WebServicesClientProtocol
No he podido encontrar ningún ejemplo buscando en Google y la mayoría de los miembros de la clase SoapHttpChannelOptions se heredan en la clase WebServicesClientProtocol...
Referencia de opciones de SoapHttpChannel
Referencia del protocolo WebServicesClient
Nota:No estoy intentando modificar el servidor web.Estoy intentando modificar el cliente del servicio web.
Solución
Una solución es reemplazar el método GetWebRequest(Uri uri)
.
La información que me llevan a esta solución se encontró en este Foro de MSDN Mensaje
Método 1:. Modificar el archivo generado automáticamente
Pega este fragmento en el archivo Reference.cs que se generó automáticamente. La desventaja de este enfoque es que si alguna vez regenerar los adaptadores de clientes de servicios web (es decir Actualizar Referencias Web), tendrá que modificar a continuación el archivo de nuevo.
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
webRequest.KeepAlive = false;
return webRequest;
}
Método 2: Crear una clase parcial
Crea un archivo y pegar el código siguiente en él. Modificar el nombre de espacio de nombres y clase para que coincida con su servicio web.
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;
}
}
}
Notas
Este enfoque puede trabajo si no usar WSE. Yo era capaz de pegar el método anterior en la clase de servicio web WSE no ... que se extiende System.Web.Services.Protocols.SoapHttpClientProtocol
. De mis pruebas, parecía que esto hizo que no incluye ninguna línea de conexión HTTP en absoluto donde como cuando lo hice dentro de una clase de WSE (que se derivan de Microsoft.Web.Services3.WebServicesClientProtocol
) que luego incluyó un "Connection: Close" línea. De acuerdo con este sitio en HTTP KeepAlive :
En HTTP 1.1, el oficial de mantenimiento de conexión método es diferente. todas las conexiones se mantienen con vida, a menos que se de otro modo con la siguiente cabecera: Conexión: cerrar
Así que, aunque no se puede incluir en la cabecera KeepAlive más ... Creo que en HTTP1.1 se supone que es el valor predeterminado.