我在.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
答案 0 :(得分:1)
使用Reflector快速查看HttpWebRequest
表明它不会根据代理凭据区分ServicePoint
个对象。因此,它为所有这些请求重用相同的http连接池,并且由于在第一次成功进行代理身份验证后相同的连接保持活动状态,因此它甚至不会尝试使用为最后两个请求提供的凭据。
您可以尝试将ConnectionGroupName
属性设置为包含代理用户名和密码的字符串,在设置Proxy
属性时(可能使用辅助方法)。
另一个选择是为WebProxy
构造函数使用proxyuser:password @ basicproxy:2121 url方案。