Как выполнить метод await в MVC - PullRequest
1 голос
/ 06 ноября 2019

Мы используем Microsoft Graph SDK. Реализован POC в консольном приложении, где код работает нормально, но при добавлении этого кода в MVC он не работает. код застревает при ожидании вызова

Вызов с контроллера как

 [HttpPost]
    public ActionResult InviteUser([Bind(Include = "EmailId")] UserLogin userLogin)
    {
        if (ModelState.IsValid)
        {
            string result = AzureADUtil.InviteUser(userLogin.EmailId);
        }
        return View();
    }

Реализация метода выглядит следующим образом

  public static string InviteUser(string emailAddress)
    {
        string result = string.Empty;

        result = InviteNewUser(emailAddress).Result;

        return result;

    }

    private static async Task<string> InviteNewUser(string emailAddress)
    {
        string result = string.Empty;
        try
        {
            IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantID)
            .WithClientSecret(clientSecret)
            .Build();

            ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

            GraphServiceClient graphClient = new GraphServiceClient(authProvider);

            // Send Invitation to new user
            var invitation = new Invitation
            {
                InvitedUserEmailAddress = emailAddress,
                InviteRedirectUrl = "https://myapp.com",
                SendInvitationMessage = true,
                InvitedUserType = "Member" 

            };

            // It stucks at this line
            await graphClient.Invitations
            .Request()
            .AddAsync(invitation);

        }
        catch (Exception ex)
        {
            result = ex.Message;
        }
        return result;

    }

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Смешивание асинхронного ожидания и блокировки кода, такого как .Result или .Wait(), может привести к взаимоблокировкам, особенно на asp.net-mvc.

Если происходит асинхронизация, то идти до конца.

[HttpPost]
public async Task<ActionResult> InviteUser([Bind(Include = "EmailId")] UserLogin userLogin) {
    if (ModelState.IsValid) {
        string result = await AzureADUtil.InviteUser(userLogin.EmailId);
    }
    return View();
}

С реализацией, рефакторированной также как асинхронная

public static async Task<string> InviteUser(string emailAddress)
{
    string result = string.Empty;

    result = await InviteNewUser(emailAddress);

    return result;
}

InviteUser теперь избыточна, так как она в основном обертывает приватный вызов InviteNewUser.

Ссылка Async / Await - лучшие практики асинхронного программирования

0 голосов
/ 06 ноября 2019

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

[HttpPost]
public async Task<ActionResult> InviteUser([Bind(Include = "EmailId")] UserLogin userLogin)
{
    if (ModelState.IsValid)
    {
        string result = await AzureADUtil.InviteNewUser(userLogin.EmailId).ConfigureAwait(false);
    }
    return View();
}
...