.net core HttpClient、UseDefaultCredentials、Windows身份验证、.NET Core 2.0+;控制台应用程序收到401个未经授权的
我正在尝试从.NET Core 3.0控制台应用程序进行HTTP GET调用。终结点需要Windows身份验证。该端点是IIS上的生产中.NET Framework 4.5.2 Web API服务,已被多个客户端应用程序成功使用 对于.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
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许可证。