SoaphttpclientProtocol Caches Proxy Detrenties?
-
10-10-2019 - |
Вопрос
В .net4 я заметил, что SoaphttpclientProtocol, по -видимому, кэш прокси -сервера. Кто -нибудь знает, правда ли это, и как обновить этот кеш? Если мои пользователи изменят свои учетные данные, я бы хотел попробовать их, но как только я получу какой -либо soaphttpclientprotocol, чтобы успешно подключиться, любой вызов для вызова, похоже, работает.
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;
}
Вывод этой программы (я ожидаю, что последние два будут ложными)
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
Решение
Быстрый взгляд на HttpWebRequest
с отражателем показывает, что он не дифференцирует ServicePoint
Объекты на основе учетных данных прокси. Таким образом, он повторно использует один и тот же пул соединений HTTP для всех этих запросов, и, поскольку одно и то же соединение остается в живых после первой успешной аутентификации прокси, он даже не пытается использовать учетные данные, предоставленные для двух последних запросов.
Вы можете попробовать установить ConnectionGroupName
свойство для какой -то строки, содержащей имя пользователя и пароль Proxy, в то время, когда вы устанавливаете Proxy
Собственность (с помощью помощника, возможно,).
Другой вариант - использовать Proxyuser: Password@BasicProxy: 2121 схема URL -адреса для WebProxy
конструктор.