it-swarm.com.ru

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

Я видел много вопросов по этому поводу, и все указывает на то, что я использую 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);
}

Правка:

В ответ на комментарии ниже код содержится в методе 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

10
Lala

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

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

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

1
S.C.

Поэтому я думаю, что проблема решена сейчас, так как я могу получать контент из запроса, я просто следовал здесь документам: https://docs.Microsoft.com/en-us/xamarin/cross- платформа/основы приложения/безопасность транспортного уровня? tabs = windows

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

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

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

0
Lala

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

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

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

Это ответ на вершине моей.

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

client.Timeout = TimeSpan.FromSeconds(10);

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

0
Debashish Saha