Удаленная проверка формы MVC Asp.net не выполняется с помощью асинхронного вызова API - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть поле электронной почты в форме asp.net mvc.Мне нужно проверить электронную почту с помощью удаленной проверки, позвонив на сервер net core api.Удаленная проверка активируется, когда поле электронной почты теряет фокус.Однако вызов api-сервера застопорился при асинхронном вызове метода api.

    public class Model
    {
    [Required]
    [StringLength(50, ErrorMessage = "The {0} exceeds {1} characters")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")] // NOTE:  This attribute REQUIRES .Net 4.5 or higher!
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email", ResourceType = typeof(Resources.Resources))]
    [Remote(action: "VerifyEmail", controller: "Account")]
    public string Email { get; set; }
    }

public class AccountController : Controller
{
    CoreApiHelp _apiHelper = new ApiHelp();
    public AccountController()
    {

    }
    [AllowAnonymous]
    [AcceptVerbs("Get", "Post")]
    public ActionResult VerifyEmail(string email)
    {
        if (!_apiHelper.VerifyEmail(email).Result)
        { 
            return Json($"Email {email} is already in use.");
        }

        return Json(true);
    }
   }
public class ApiHelp
{
    HttpClient _client = new HttpClient();
    SettingHelp _setting = new SettingHelp();
    IdentityServer4Help _serverHelp;
    const string IS_USER_EMAIL_UNIQUE = "User/IsEmailUnique?";
    public CoreApiHelp()
    {
        _serverHelp = new IdentityServer4Help(_setting.IdentityServer4Host, _setting.IdentityServer4ClientId,
            _setting.IdentityServer4ClientSecret, _setting.IdentityServer4ClientScope);
        _client.BaseAddress = new Uri(_setting.ApiHost);
    }
    public async Task<bool> VerifyEmail(string email)
    {
        var token = await _serverHelp.GetToken();
        _client.SetBearerToken(token);
        string uri = $"{IS_USER_EMAIL_UNIQUE}userEmail={email}";
        bool res = false;
        using (var response = await _client.GetAsync(uri))
        {
            await response.EnsureSuccessStatusCodeAsync();
            res = await response.Content.ReadAsAsync<bool>();
        }
        return res;
    }
   }

Код должен возвращать значение true или false после выполнения вызова API VerifyEmail.Однако выполнение остановилось в строке "await _serverHelp.GetToken ();"Если я вызываю «VerifyEmail» после нажатия кнопки «Отправить», вызов API работает нормально.Кажется, есть проблема с вызовом асинхронного метода для удаленной проверки.Методы в примерах для удаленной проверки - это вызовы синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...