Pregunta

Me he dado cuenta de que el .NET4 SoapHttpClientProtocol aparece en caché las credenciales de proxy. ¿Alguien sabe si esto es cierto, y cómo cargar esta caché? Si mis usuarios cambien sus credenciales me gustaría probarlos, pero una vez que conseguir cualquier SoapHttpClientProtocol conectarse correctamente, cualquier llamada para invocar parece funcionar.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Web.Services;
    class Program : System.Web.Services.Protocols.SoapHttpClientProtocol
{
    public Program()
    {
        base.Url = "something";
    }
    static void Main(string[] args)
    {
        Program x = new Program();
        x.Proxy = new WebProxy("basicproxy", 2121);
        x.Proxy.Credentials = new NetworkCredential("proxyuser", "IncorrectPassword");
        Console.WriteLine("Attempt with proxyuser and IncorrectPassword: " + x.NoOp());

        x.Proxy.Credentials = new NetworkCredential("proxyuser", "password");
        Console.WriteLine("Attempt with proxyuser and password: " + x.NoOp());

        x.Proxy.Credentials = new NetworkCredential("proxyuser", "IncorrectPassword");
        Console.WriteLine("Attempt with proxyuser and IncorrectPassword: " + x.NoOp());

        Program y = new Program();
        y.Proxy = new WebProxy("basicproxy", 2121);
        y.Proxy.Credentials = new NetworkCredential("proxyuser", "IncorrectPassword");
        Console.WriteLine("Attempt with proxyuser and IncorrectPassword: " + y.NoOp());
    }

    /// <remarks/>
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("...", RequestNamespace = "...", ResponseNamespace = "...", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    public bool NoOp()
    {
        try
        {
            object[] results = this.Invoke("NoOp", new object[0]);
            return ((bool)(results[0]));
        }
        catch (WebException e)
        {
            if (e.Response != null && ((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.ProxyAuthenticationRequired)
            {
                Console.WriteLine("incorrect Credential attempt!");
            }
            else
            {
                Console.WriteLine("Exception: " + e.Message);
            }
        }
        return false;
    }

La salida de este programa (estoy esperando los dos últimos para ser falso)

incorrect Credential attempt!
Attempt with proxyuser and IncorrectPassword: False
Attempt with proxyuser and password: True
Attempt with proxyuser and IncorrectPassword: True
Attempt with proxyuser and IncorrectPassword: True
¿Fue útil?

Solución

Un rápido vistazo a HttpWebRequest con reflector de espectáculos que no ServicePoint diferenciar objetos en función de las credenciales de proxy. Por lo que vuelve a utilizar el mismo conjunto de conexiones HTTP para todas aquellas solicitudes y desde las mismas estancias de conexión con vida después de la primera autenticación de proxy éxito, ni siquiera intenta utilizar las credenciales proporcionadas para las dos últimas peticiones.

Se podría tratar de establecer la propiedad ConnectionGroupName a alguna cadena que contiene el nombre de usuario y contraseña del proxy en el momento de establecer la propiedad Proxy (con un método de ayuda tal vez).

Otra opción es utilizar el proxyuser: contraseña @ basicproxy:. 2121 esquema de URL para el constructor WebProxy

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