0

私はAzure ADに接続しようとしていますが、私はこのコードを使用しています。プロセスを殺すのを待つ

try 
{ 
    var clientCredential = new ClientCredential(_clientId, _clientSecret); 
    var authContext = new AuthenticationContext(AuthUri + _tenant); 
    var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential); 
    var authString = authResult.CreateAuthorizationHeader(); 
    var client = new HttpClient(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    var request = new HttpRequestMessage 
    { 
     Method = HttpMethod.Get, 
     RequestUri = _requestUri, 
    }; 
    request.Headers.Add("Authorization", authString); 
    HttpResponseMessage response = null; 
    await client.SendAsync(request).ContinueWith(taskWithMessage => 
    { 
     response = taskWithMessage.Result; 
    }); 
    return await response.Content.ReadAsStringAsync(); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex); 
} 

私は理解していない大きな問題は、実行が最初のawait(var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential);)に達するとプロセスが単純に殺されていることです。例外はスローされず、何もスローされません。

私は実行プロセスがスローされた例外または警告か何かの任意のメッセージを表示せずに再び殺されるawait client.SendAsync(request).ContinueWith(taskWithMessage...までに行く

var authResult = authContext.AcquireTokenAsync(GraphUri,clientCredential); 
var authString = authResult.Result.CreateAuthorizationHeader(); 

でそのラインを交換する場合。

このコードは別のプロジェクトでうまく動作しますが、ここでは動作しません。

編集:

static void ImportLicence() 
{ 
    InsertToDb(); 
} 

public async void InsertoDb() 
{ 
    var x = await GetSP(); 
} 

public async Task<Dictionary<ServicePlanViewModel, List<ServicePlanViewModel>>> GetSP() 
{ 
    var sp = await MakeRq(); 
} 

public async Task<string> MakeRequest() 
{ 
    var authString = await GetAuth(); 
    .......... 
    return await response.Content.ReadAsStringAsync(); 
} 

private async Task<string> GetAuth() 
{ 
    ..... 
    var authResult = await authContext.AcquireTokenAsync(GraphUri, clientCredential); 
    return authResult.CreateAuthorizationHeader(); 
} 
+0

あなたは '.ContinueWith'を無視し、単に使用することができます' 'async' await'、両方を組み合わせて、問題が繰り返されるかどうかを確認しようとしないでください。 –

+0

@AkashKavaと同じことが起こります。プロセスは強制終了されます。 – viktorfilim

+2

@viktorfilimでは、同期と非同期の実装が混在しています。このコードがカプセル化されているメソッドを表示します。 – Nkosi

答えて

5

プロセスが簡単に殺されます。例外はスローされず、何もスローされません。

は、私はあなたがコンソールアプリケーションでこれを実行していることを前提とし、トップレベルのコードは次のようになりますこと:

static void Main() 
{ 
    MyMethodAsync(); 
} 

、その場合には、mainメソッドだろう実際出口では、非同期コードが完了するのを待っているわけではないからです。

コンソールアプリケーションでasyncを使用する方法の1つは、Mainメソッドでブロックすることです。通常は、「すべての道非同期(async)」に行きたいが、コンソールアプリのMainメソッドは、この規則の例外です:

static void Main() => MainAsync().GetAwaiter().GetResult(); 
static async Task MainAsync() 
{ 
    // Original code from Main, but adding any necessary `await`s. 
    await MyMethodAsync(); 
} 

更新:Don't use async void。代わりにasync Taskを使用します。

static async Task ImportLicenceAsync() 
{ 
    await InsertToDbAsync(); 
} 

public async Task InsertoDbAsync() 
{ 
    var x = await GetSPAsync(); 
} 
+0

同じ結果です。私はこれを試しました。これは私の初期のコードにありました。 – viktorfilim

+1

@viktorfilimそれであなたの質問でそれをしたコードを表示し、すべての呼び出しを 'Main()'まで続けます –

1

更新コード、それは介してすべての道非同期(async)になるように。コールスタックの上にある非同期コードと同期コードを混ぜていないことを確認してください。 async voidは使用しないでください。

public async Task<string> SomeMethodAsync() { 
    try { 
     var clientCredential = new ClientCredential(_clientId, _clientSecret); 
     var authContext = new AuthenticationContext(AuthUri + _tenant); 
     var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential); 
     var authString = authResult.CreateAuthorizationHeader(); 
     var client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     var request = new HttpRequestMessage { 
      Method = HttpMethod.Get, 
      RequestUri = _requestUri, 
     }; 
     request.Headers.Add("Authorization", authString); 

     using(var response = await client.SendAsync(request)) { 
      return await response.Content.ReadAsStringAsync(); 
     }  
    } catch (Exception ex) { 
     Console.WriteLine(ex); 
    } 
} 
+0

はい、コンソールアプリケーションです。コードはすべて非同期です。しかし結果は同じです。 – viktorfilim

関連する問題