#c# #http #asp.net-web-api #https #xamarin.forms
#c# #http #asp.net-web-api #https #xamarin.forms
Вопрос:
У меня есть мой веб-Api на рабочем сервере в режиме онлайн, и он хорошо работает в postman и в формах Xamarin до тех пор, пока мне не понадобилось выполнить Get-запрос, и не возвращает никаких данных. Фактически он останавливается на GetAsStringAsync
строке и не продолжается. Вместо этого он выскакивает из метода, а затем ничего больше.
Кто-нибудь знает, в чем может быть проблема? Я проверил и убедился, что мой Интернет работает и Uri тоже.
Здесь я выполняю свой Get в формах Xamarin:
public async Task<List<OfferModel>> AllOffers()
{
var httpclient = new HttpClient();
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", Settings.AccessToken);
//it does not continue after this line, it jumps out of the method instead
var response = await httpclient.GetStringAsync(UrlConstants.offerurl);
var data =JsonConvert.DeserializeObject<List<OfferModel(response);
return data;
}
Комментарии:
1. есть ли какие-либо исключения или другие сообщения об ошибках? Я не вижу закрытия > в ваших данных var = …. строка. это просто опечатка или они отсутствуют?
2. вы уверены, что URL работает с устройства / эмулятора? Тестирование с вашего рабочего стола не означает, что оно доступно из вашего мобильного приложения.
3. @Jason URL-адрес postman работает хорошо, и он доступен с устройства. Не пробовал это в эмуляторе из-за проблем с Wi-Fi.
4. @Sean закрытие > было опечаткой. Сообщений об ошибках нет, он просто покидает метод, а затем ничего не происходит.
5. Поведение, которое вы описываете, заключается в том, что ожидание никогда не возвращается. Если возможно, установите точку останова на другом конце и посмотрите, достигает ли ваш вызов удаленного сервера.
Ответ №1:
Решение 1
Можете ли вы попробовать получить доступ к задаче через awaiter, это может быть ожидание результата при ответе
public class HttpHelperService
{
public async Task<List<OfferModel>> AllOffers()
{
List<OfferModel> resu<
string responseBody;
using (HttpClient client = new HttpClient())
{
try
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", Settings.AccessToken);
HttpResponseMessage response = client.GetStringAsync(new Uri(UrlConstants.offerurl)).GetAwaiter().GetResult();
result = JsonConvert.DeserializeObject<List<OfferModel>>(response);
}
catch (Exception ex)
{
result = null;
}
return resu<
}
}
}
Решение 2
public class MyPage : ContentPage
{
//Here is your page constructor
public MyPage()
{
GetServices(); //--> call here without awaiter
}
}
//Here is your awaiter method
private async void GetServices()
{
LoadingPopupService.Show();
var result = await HttpService.AllOffers();
LoadingPopupService.Hide();
}
//Here is your service.
public async Task<List<OfferModel>> AllOffers()
{
var httpclient = new HttpClient();
httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", Settings.AccessToken);
var response = await httpclient.GetStringAsync(UrlConstants.offerurl);
var data =JsonConvert.DeserializeObject<List<OfferModel(response);
return data;
}
Комментарии:
1. Спасибо. Я внесу эти изменения в свой код, посмотрю, работает ли это, и оставлю вам отзыв.
2. Мое решение заключалось в этой проблеме: 1. Основной метод получения данных из сервисов. 2. Метод ожидания для асинхронного получения данных путем показа загрузчика пользователю. 3. Конструктор страницы. Вы можете вызвать непосредственно 2. метод в конструкторе без await. Это будет ожидание получения данных.
3. Okay Batuhan. Я вижу их, и я проверю их и попробую
4. Если ваш вопрос был завершен с ответом вверх, вы можете пометить мой ответ как завершенный.