2017-09-19 30 views
7

.NET Core 2.0コンソールアプリケーションからHTTP GET呼び出しを作成しようとしています。エンドポイントはWindows認証を要求します。HttpClient、UseDefaultCredentials、Windows認証、.NET Core 2.0コンソールアプリケーションが401を受信する

私のテストプログラムはnet45フレームワークターゲットで成功しました。対照的に、netcoreapp2.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); 
} 

がここに私のプロジェクトファイルです:

は、ここに私の方法です。

<Project Sdk="Microsoft.NET.Sdk"> 
    <PropertyGroup> 
    <OutputType>Exe</OutputType> 
    <TargetFrameworks>net45;netcoreapp2.0</TargetFrameworks> 
    </PropertyGroup> 
    <ItemGroup Condition="'$(TargetFramework)' != 'netcoreapp2.0'"> 
    <PackageReference Include="System.Net.Http" Version="4.3" /> 
    </ItemGroup> 
</Project> 

.\bin\Debug\net45\HttpClientTest.exeは、予想されるJSON結果を返します。

dotnet .\bin\Debug\netcoreapp2.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>d__27.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at HttpClientTest.Program.<Get>d__1.MoveNext() in C:\temp\HttpClientTest\Program.cs:line 24 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 
    at HttpClientTest.Program.Main(String[] args) in C:\temp\HttpClientTest\Program.cs:line 16 

これを修正するにはどうすればよいですか?

は、私はまた、出力を変更せず、下記のバリエーションを試してみました:

handler.Credentials = CredentialCache.DefaultNetworkCredentials; 
handler.Credentials = CredentialCache.DefaultCredentials; 
handler.Credentials = new NetworkCredential(username, password, domain); 

答えて

0

だから我々は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; 
関連する問題