.net core HttpClient、UseDefaultCredentials、Windows身份验证、.NET Core 2.0+;控制台应用程序收到401个未经授权的

.net core HttpClient、UseDefaultCredentials、Windows身份验证、.NET Core 2.0+;控制台应用程序收到401个未经授权的,.net-core,dotnet-httpclient,.net Core,Dotnet Httpclient,我正在尝试从.NET Core 3.0控制台应用程序进行HTTP GET调用。终结点需要Windows身份验证。该端点是IIS上的生产中.NET Framework 4.5.2 Web API服务,已被多个客户端应用程序成功使用 对于net45框架目标,我的测试程序成功。相反,netcoreapp3.0build会收到未经授权的401请求 Unhandled exception. System.AggregateException: One or more errors occurred. (R

我正在尝试从.NET Core 3.0控制台应用程序进行HTTP GET调用。终结点需要Windows身份验证。该端点是IIS上的生产中.NET Framework 4.5.2 Web API服务,已被多个客户端应用程序成功使用

对于
net45
框架目标,我的测试程序成功。相反,
netcoreapp3.0
build会收到未经授权的401请求

Unhandled exception. System.AggregateException: One or more errors occurred. (Response status code does not indicate success: 401 (Unauthorized).)
    ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized).
    at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
    at System.Net.Http.HttpClient.GetStringAsyncCore(Task`1 getTask)
    at ConsoleApp1.Program.Get(String serverUri, String requestUri) in C:\temp\coreapp3\Program.cs:line 16
    --- End of inner exception stack trace ---
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
    at System.Threading.Tasks.Task`1.get_Result()
    at ConsoleApp1.Program.Main(String[] args) in C:\temp\coreapp3\Program.cs:line 22
以下是我的方法:

使用系统;
Net系统;
使用System.Net.Http;
使用System.Net.Http.Header;
使用System.Threading.Tasks;
静态异步任务Get(字符串serverUri、字符串requestUri)
{
var handler=new-HttpClientHandler(){UseDefaultCredentials=true};
var client=newhttpclient(handler){BaseAddress=newuri(serverUri)};
返回wait client.GetStringAsync(requestUri);
}
这是我的项目文件


Exe
net45;netcoreapp3.0
运行
\bin\Debug\net45\HttpClientTest.exe
返回预期的JSON结果

运行
dotnet.\bin\Debug\netcoreapp3.0\HttpClientTest.dll
会收到一个未经授权的文件

Unhandled exception. System.AggregateException: One or more errors occurred. (Response status code does not indicate success: 401 (Unauthorized).)
    ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized).
    at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
    at System.Net.Http.HttpClient.GetStringAsyncCore(Task`1 getTask)
    at ConsoleApp1.Program.Get(String serverUri, String requestUri) in C:\temp\coreapp3\Program.cs:line 16
    --- End of inner exception stack trace ---
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
    at System.Threading.Tasks.Task`1.get_Result()
    at ConsoleApp1.Program.Main(String[] args) in C:\temp\coreapp3\Program.cs:line 22
如何解决此问题?

我还尝试了以下变化,输出没有任何变化:

handler.Credentials=CredentialCache.DefaultNetworkCredentials;
handler.Credentials=CredentialCache.DefaultCredentials;
handler.Credentials=新的网络凭据(用户名、密码、域);

因此,我们在HttpClient上遇到了同样的问题,但在第一次请求时,它是未经授权的,但是如果我们进行另一次快速请求调用,它会正常运行,我们会获得授权

Unhandled exception. System.AggregateException: One or more errors occurred. (Response status code does not indicate success: 401 (Unauthorized).)
    ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized).
    at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
    at System.Net.Http.HttpClient.GetStringAsyncCore(Task`1 getTask)
    at ConsoleApp1.Program.Get(String serverUri, String requestUri) in C:\temp\coreapp3\Program.cs:line 16
    --- End of inner exception stack trace ---
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
    at System.Threading.Tasks.Task`1.get_Result()
    at ConsoleApp1.Program.Main(String[] args) in C:\temp\coreapp3\Program.cs:line 22
如果我在.NET4.7.1控制台应用程序上执行此操作,它的工作效果会非常完美。如果我在一个.NET4.7.1空的web应用程序中这样做,它工作得很好,只有在我使用.NETCore2.x时,我们才会遇到这个问题

var result = string.Empty;
var responseMessage = _client.GetAsync(url).Result;

if (responseMessage.IsSuccessStatusCode)
{
    result = await responseMessage.Content.ReadAsStringAsync();
}
else
{
    var responseMessage2 = _client.GetAsync(url).Result;

    if (responseMessage2.IsSuccessStatusCode)
    {
        result = await responseMessage2.Content.ReadAsStringAsync();
    }
}

return result;

此解决方法适用于我在创建HttpClient/Handler之前添加以下内容:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

可能重复的我继续遇到这个问题。我现在使用的是.NETCore2.2。为了记录在案,我尝试了这个可能重复的解决方案。。。没有成功。在最新版本的netcoreapp中试用。@pavinan我用.NETCore3.0重新运行了我的实验。同样的结果。对于.NET4.5,它可以正常工作。对于.NETCore3.0,我得到了一个401许可证。