Question

Je l'ai remarqué dans .NET4 que le SoapHttpClientProtocol semble mettre en cache les informations d'identification proxy. Est-ce que quelqu'un sait si cela est vrai, et comment actualiser ce cache? Si mes utilisateurs de changer leurs lettres de créance, je voudrais les essayer, mais une fois que je reçois un SoapHttpClientProtocol à connecter avec succès, tout appel à Invoke semble fonctionner.

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 sortie de ce programme (je prévois les deux derniers faux)

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
Était-ce utile?

La solution

Un rapide coup d'oeil à HttpWebRequest avec réflecteur montre qu'il ne ServicePoint pas Différencier objets basés sur les informations d'identification proxy. Donc, il réutilise le même pool de connexion http pour toutes ces demandes et que les mêmes séjours de connexion en vie après la première authentification proxy réussie, il ne cherche même pas à utiliser les informations d'identification fournies pour les deux dernières demandes.

Vous pouvez essayer de définir la propriété ConnectionGroupName à une chaîne contenant le nom d'utilisateur et mot de passe proxy au moment où vous définissez la propriété Proxy (avec une méthode d'assistance peut-être).

Une autre option consiste à utiliser le proxyuser: mot de passe @ basicproxy:. 2121 schéma d'URL pour le constructeur de WebProxy

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top