0

Я пытаюсь подключиться к Azure AD, и я использую этот код.Await kills process

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); 
} 

Большая проблема, которую я не понимаю, что, когда исполнение достигает первого ОЖИДАНИЕ (var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential);) процесс просто убит. Никакое исключение не выбрасывается, ничего.

Если я заменить эту строку с

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

выполнение продолжается до await client.SendAsync(request).ContinueWith(taskWithMessage..., где процесс убит снова без каких-либо исключений быть брошенными или любым сообщением предупреждения или что-то.

Даже странная вещь заключается в том, что этот код работает очень хорошо в другом проекте, но здесь он просто не работает.

Edit:

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(); 
} 

В этом случае, основной метод будет на самом деле выход, так как он не ждет завершения вашего асинхронного кода.

Один из способов работы с async в консольных приложениях заключается в блокировке в методе Main. Как правило, вы хотите пойти «асинхронный весь путь», но Main метода консольного приложения является исключением из этого правила:

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

Update: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