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