HttpClient PostAsync не возвращает - PullRequest
       39

HttpClient PostAsync не возвращает

0 голосов
/ 28 апреля 2018

Я видел много вопросов по этому поводу, и все указывает на то, что я использую ConfigureAwait (false), но даже после этого он по-прежнему не возвращает никакого ответа. Когда я запускаю отладчик, код останавливается на PostAsync и не продолжается с моим кодом. Я что-то здесь не так делаю? Это связано со мной, вызывая API через HTTPS?

Вот код:

public async static Task<PaymentModel> AddAsync(Card card)
{
    HttpClient client = new HttpClient();

    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:", "hidden"))));

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

    var cardJson = JsonConvert.SerializeObject(card);
    var postRequest = new StringContent(cardJson, Encoding.UTF8, "application/json");
    var request = await client.PostAsync(new Uri("https://sample-3rd-party-api/api/endpoint/here"), postRequest).ConfigureAwait(false);
    var content = await request.Content.ReadAsStringAsync().ConfigureAwait(false);
}

EDIT:

В ответ на комментарии ниже, код содержится в методе AddAsync (Card card), вызываемом из нажатия кнопки с помощью обработчика:

public async void OnExecute(object sender, EventArgs args)
{
    //some code here
    payment = await PaymentModel.AddAsync(card).ConfigureAwait(false);
}

РЕДАКТИРОВАТЬ 2: Я попытался пропинговать API, но он возвращает запрос, истекший по тайм-ауту, но когда я попробовал его с помощью Postman, все нормально (API - это просто песочница, которая открыта для всех, так что можно поделиться этим ): enter image description here

enter image description here

РЕДАКТИРОВАТЬ 3:

Мне кажется, проблема в том, что у меня нет SSL-сертификата для доступа к API. У меня есть сервер PHP, который подключается к тому же API, и я должен установить для SSL_VERIFYPEER значение false, чтобы я мог получить к нему доступ (не волнуйтесь, я добавил cacert, чтобы снова включить true). Может ли та же самая проблема происходить здесь? Если да, что я могу сделать, чтобы создать действующий сертификат для моего приложения xamarin forms

Ответы [ 4 ]

0 голосов
/ 16 ноября 2018

Так что я думаю, что проблема теперь решена, так как я могу получать контент из запроса, я просто следовал приведенным здесь документам: https://docs.microsoft.com/en-us/xamarin/cross-platform/app-fundamentals/transport-layer-security?tabs=windows

Похоже, мои настройки устарели на уровне платформы.

Обновление реализации HttpClient и реализации SSL / TLS. опции для включения безопасности TLS 1.2.

Обновите опцию реализации HttpClient, чтобы включить TSL 1.2. безопасность. (NSUrlSession (iOS 7.0 +)

0 голосов
/ 20 мая 2018

Это связано со мной, вызывая API через HTTPS?

Поскольку вы остаетесь в той же сети и вызываете один и тот же API из POSTMAN и .NET HTTP Client и добиваетесь успеха только с POSTMAN. Так что эта проблема отменяется. Далее

попытался проверить связь с API, но он вернул время ожидания запроса

Ответ дан поверх моего.

Не могли бы вы попробовать установить опцию тайм-аута для HTTPClient при инициализации.

client.Timeout = TimeSpan.FromSeconds(10);

и, если проблема не устранена, пожалуйста, настройте Fiddler и сравните запрос, отправленный клиентом POstman и .NET

0 голосов
/ 21 мая 2018

Вы можете использовать это

var json = JsonConvert.SerializeObject(card);
using (var client = new HttpClient())
{
    var t = await client.PostAsJsonAsync("https://sample-3rd-party-api/api/endpoint/here", json);

    Response R =JsonConvert.DeserializeObject<Response>((JsonConvert.DeserializeObject(t.Content.ReadAsStringAsync().Result.ToString())).ToString());
}
0 голосов
/ 17 мая 2018

Скорее всего, здесь происходит то, что ваш метод OnExecute имеет тип возврата void вместо Task, что не позволяет потоку пользовательского интерфейса ожидать его. Попробуйте изменить тип возвращаемого значения на Task или создать новый поток пользовательского интерфейса для выполнения этой работы. Я бы не стал беспокоиться о времени пинга, пока работает Почтальон. Многие общедоступные веб-серверы отключают свой пинг-ответ.

...