¿Cómo evito que mi cliente .NET SOAP incluya “Conexión:KeepAlive” en los encabezados HTTP.(usando WSE3.0)

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

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top