C# HttpResponseMessage - IsSuccessStatusCode проверяется перед тем, как API возвращает значение - PullRequest
0 голосов
/ 19 февраля 2020

RequestPin возвращает Task , поэтому pinRequest является экземпляром HttpMessageResponse.

IsSuccessStatusCode в следующем коде проверяется перед тем, как RequestPin завершает свое выполнение. InSuccessStatusCode никогда не имеет значения true - pinRequest всегда возвращает ошибку 400.

Что я делаю не так?

var pinRequest = await ApiManager.RequestPin(new PinRequest 
{ 
    Identifier = PhoneNumber 
});

if (pinRequest.IsSuccessStatusCode)
{ }

Я полагаю, есть элементарная ошибка.

Редактировать: API - это мое NET Основной проект открыт в отдельном VS, и у меня есть возможность его отладить. Метод:

[HttpPost(ApiMethods.RequestPin)]
public IActionResult RequestPin([FromBody] dynamic data)
{
    using (var db = new AppContext())
    {
        try
        {
            PinRequest request = JsonConvert.DeserializeObject<PinRequest>(data.ToString());
...

Я отладил его внутри, он доходит до конца и возвращает Ok ()

Редактировать 2: Дополнительный код:

[LoginViewModel.cs]

async Task PostData()
{
    var pinRequest = await ApiManager.RequestPin(new PinRequest 
    { 
        Identifier = PhoneNumber 
    });

    if (pinRequest.IsSuccessStatusCode)
    {
        var response = await pinRequest.Content.ReadAsStringAsync();
        await Task.Run(() => JsonConvert.DeserializeObject(response));
    }
    else
        await PageDialog.AlertAsync("Connection error", "Error", "Ok"); // <-- always hit that even RequestPin returns Ok() at api project
}

[APIManager.cs]

public async Task<HttpResponseMessage> RequestPin(PinRequest request)
{
    var cts = new CancellationTokenSource();
    var task = RemoteRequestAsync(mobileApi.GetApi(Priority.UserInitiated).RequestPin(request));
    runningTasks.Add(task.Id, cts);

    return await task;
}

protected async Task<TData> RemoteRequestAsync<TData>(Task<TData> task)
    where TData : HttpResponseMessage,
    new()
{
    TData data = new TData();

    if (!IsConnected)
    {
        var strngResponse = "No internet connection";
        data.StatusCode = HttpStatusCode.BadRequest;
        data.Content = new StringContent(strngResponse);

        _userDialogs.Toast(strngResponse, TimeSpan.FromSeconds(1));
        return data;
    }

    IsReachable = await _connectivity.IsRemoteReachable(Config.ApiHostName);

    if (!IsReachable)
    {
        var strngResponse = "No internet connection";
        data.StatusCode = HttpStatusCode.BadRequest;
        data.Content = new StringContent(strngResponse);

        _userDialogs.Toast(strngResponse, TimeSpan.FromSeconds(1));
        return data;
    }

    data = await Policy
        .Handle<WebException>()
        .Or<ApiException>()
        .Or<TaskCanceledException>()
        .WaitAndRetryAsync
        (
            retryCount: 1,
            sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))
        )
        .ExecuteAsync(async () =>
        {
            var result = await task;

            if (result.StatusCode == HttpStatusCode.Unauthorized)
            {
                //Logout the user 
            }
            runningTasks.Remove(task.Id);

            return result;
        });

    return data;
}

[Контроллер API в другом проекте]

[HttpPost(ApiMethods.RequestPin)]
public IActionResult RequestPin([FromBody] dynamic data)
{
    using (var db = new AppContext())
    {
        try
        {
            PinRequest request = JsonConvert.DeserializeObject<PinRequest>(data.ToString());

            var user = db.Users.FirstOrDefault(u => u.Active && u.PhoneNumber == request.Identifier);

            if (null == user) return NotFound();

            user.PinCode = short.Parse(CryptoHelper.CreatePassword(_config.PinLength, _config.PinDigitsOnly));
            user.AttempsToEnterWrongPincode = 0;
            db.SaveChanges();

            //new PinService.PinService(user, _config).Send();

            return Ok();
        }
        catch (Exception ex)
        {
            Logger.LogError(string.Empty, ex);
            return BadRequest();
        }
    }
}
...