Wal*_*lly 12 dotnet-httpclient .net-core
我正在尝试从.NET Core 2.0控制台应用程序进行HTTP GET调用.端点需要Windows身份验证.
我的测试程序成功实现了net45框架目标.相比之下,netcoreapp3.0构建接收401 Unauthorized.
这是我的方法:
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
static async Task<string> Get(string serverUri, string requestUri)
{
var handler = new HttpClientHandler() { UseDefaultCredentials = true };
var client = new HttpClient(handler) { BaseAddress = new Uri(serverUri) };
return await client.GetStringAsync(requestUri);
}
Run Code Online (Sandbox Code Playgroud)
这是我的项目文件.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net45;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
<PackageReference Include="System.Net.Http" Version="4.3" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
运行.\bin\Debug\net45\HttpClientTest.exe返回预期的JSON结果.
跑步dotnet .\bin\Debug\netcoreapp3.0\HttpClientTest.dll收到401 Unauthorized.
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
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
我也尝试过以下变化,输出没有任何变化:
handler.Credentials = CredentialCache.DefaultNetworkCredentials;
handler.Credentials = CredentialCache.DefaultCredentials;
handler.Credentials = new NetworkCredential(username, password, domain);
Run Code Online (Sandbox Code Playgroud)
小智 -1
因此,我们在 HttpClient 上遇到了同样的问题,但在第一个请求上它是未经授权的,但如果我们进行另一个快速请求调用,它会顺利进行,并且我们会获得授权。
如果我在 .NET 4.7.1 控制台应用程序上执行此操作,则效果完美。如果我在 .NET 4.7.1 空 Web 应用程序中执行此操作,则它工作正常,只有当我执行 .NET Core 2.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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2726 次 |
| 最近记录: |