0

我有一个使用 .NET core 2.2 和 HTTP.Sys 的 Web API。我已经设置了 Windows 身份验证,当用户获得授权时,我可以看到 401 WWW-Negotiate 质询,然后是 200。

现在我已经多次执行相同的请求,但我发现每个请求都面临挑战,这会减慢系统速度并影响性能。我的示例客户:

var httpHandler = new HttpClientHandler
{
    UseDefaultCredentials = true,
    Proxy = new WebProxy
    {
        Address = new Uri("http://HOSTNAME:8888"),
    }
};

using (var client = new HttpClient(httpHandler))
{

client.BaseAddress = new Uri("http://HOSTNAME:5000/");
for (int i = 0; i < 10; i++)
{
    try
    {
        HttpResponseMessage response = client.GetAsync("api/user").Result;
        response.EnsureSuccessStatusCode();
        string result = response.Content.ReadAsStringAsync().Result;
        Console.WriteLine("Result: " + result);
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex);
    }
}

我读到 IIS 似乎可以authPersistNonNTLM=true 在这里使用,但我无法为纯 HTTP.sys 设置类似的设置。任何想法?

谢谢,

4

1 回答 1

0

我在课堂上看不到任何类似HttpSysOptions的选项(您传递给 HTTP.sys 的选项)。

可能有帮助的是不要处理你的HttpClient(不要using在上面使用)。HttpClient是线程安全的,旨在被重用。实际上,您应该保留对它的static引用并重用它。这里有一个冗长的讨论,但简而言之:如果你不这样做,它就不会重用连接。

这可能与您看到此内容的原因有关。但如果这不能解决问题,请监控流量并查看客户端是否在第一次请求时发送了身份验证详细信息。他们应该是,因为你设置UseDefaultCredentials了,但如果不是,那是你的问题。

更新:您也可以尝试PreAuthenticate在您的HttpClientHandler

var httpHandler = new HttpClientHandler
{
    UseDefaultCredentials = true,
    PreAuthenticate = true,
    Proxy = new WebProxy
    {
        Address = new Uri("http://HOSTNAME:8888"),
    }
};

根据文档,在第一次成功认证后,它会将所有后续请求的凭据发送到相同的主机,而无需等待 401 质询。

于 2019-09-03T13:46:30.700 回答