我们有一个第三方Web服务,我们从我们的Web应用程序中使用。我已经创建了一个Windows服务,为我们所有的客户调用这个Web服务,每个客户都有自己的凭据。
Web服务正在使用基本身份验证。
在循环使用凭据时,它始终使用第一个经过身份验证的凭据。
示例代码如下:
private void testConnection(string username, string password)
{
_url = "https://somewebservice.com.au/transport/SomeService";
using (var someWebService = new someWebService {Url = _url})
{
var netCredential = new NetworkCredential(username, password);
var credential = new CredentialCache
{
{new Uri(someWebService.Url), "Basic", new NetworkCredential(username, password)}
};
someWebService.Credentials = credential;
someWebService.PreAuthenticate = true;
someWebService.Timeout = 1200000;
try
{
var result = someWebService.testConnection();
textBoxMsg.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), result);
}
catch (SoapException soapex)
{
textBoxMsg.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), "SOAP Error: " + soapex.Message + "\r\n");
}
catch (WebException webex)
{
textBoxMsg.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), "Web Error: " + webex.Message + "\r\n");
}
catch (Exception ex)
{
textBoxMsg.Invoke(new UpdateTextBoxDelegate(UpdateTextBox), "Error: " + ex.Message + "\r\n");
}
finally
{
credential.Remove(new Uri(someWebService.Url), "Basic");
}
}
}
private void buttonTest2_Click(object sender, EventArgs e)
{
ThreadStart start = () => testConnection("user1", "123");
new Thread(start).Start();
}
private void buttonTest3_Click(object sender, EventArgs e)
{
ThreadStart start = () => testConnection("user2", "1234");
new Thread(start).Start();
}
如果首先对“user1”进行身份验证,则对testConnection的第二次调用将始终使用“user1”凭据。
我已经尝试将HttpWebRequest KeepAlive设置为false,因此不会重复使用连接。 TCP监视显示连接在设置为false后被杀死。这并没有解决问题。
如果我关闭应用程序并重新启动,并为“user2”运行testConnection,它会给出正确的结果。
似乎在过程中缓存了凭据。摆脱它的唯一方法是退出进程。
当我必须循环通过大约1000个凭证时,这会带来一些挑战。
有没有办法清除进程中的凭据缓存?如果那是正在发生的事情。看到这个链接How to stop credential caching on Windows.Web.Http.HttpClient?
我探索过的选项和原型
我上面的问题是它们必须是顺序的,所以要循环1000次它们需要一段时间。每个凭证大约需要20-30秒。
在最后一个catch块之后尝试使用CredentialCache.Remove()方法。 https://msdn.microsoft.com/en-us/library/4zaz5c95(v=vs.110).aspx
这将从缓存中删除它。
也许这是一个有点老问题,但你PreAuthenticate
应该是false
HttpClient不要缓存凭据。