web-dev-qa-db-fra.com

HttpClient PostAsync ne retourne pas

J'ai vu beaucoup de questions à ce sujet et tout me dit d'utiliser ConfigureAwait (false), mais même après cela, il ne m'a toujours pas renvoyé de réponse. Lorsque j'exécute le débogueur, le code s'arrête sur PostAsync et ne continue pas avec mon code. Est-ce que je fais quelque chose de mal ici? Est-ce que cela a à voir avec moi en appelant une API via HTTPS?

Voici le code:

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

MODIFIER:

En réponse aux commentaires ci-dessous, le code provient d'une méthode AddAsync (Card Card) appelée à partir d'un clic de bouton avec un gestionnaire:

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

EDIT 2: J’ai essayé d’envoyer une requête ping à l’API, mais elle renvoie une requête expirée, mais lorsque je l’essayais avec Postman, tout se passait bien (l’API n’était qu’une Sandbox ouverte à tous, il est donc possible de partager ce ): enter image description here

enter image description here

EDIT 3:

Je pense que le problème réside dans le fait que je n'ai pas de certificat SSL pour accéder à l'API. J'ai un serveur PHP qui se connecte à la même API et je dois définir SSL_VERIFYPEER sur false pour pouvoir y accéder (ne vous inquiétez pas, j'ai ajouté un cacert maintenant, donc il est de nouveau à true). Le même problème peut-il se produire ici? Si tel est le cas, que puis-je faire pour créer un certificat valide pour mon application xamarin forms

10
Lala

Vous pouvez utiliser ceci

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

Ce qui est le plus susceptible de se produire ici, c'est que votre méthode OnExecute a un type de retour de void au lieu de Task, ce qui empêche le thread d'interface utilisateur de l'attendre. Essayez de changer le type de retour en Task ou de créer un nouveau thread d'interface utilisateur pour effectuer ce travail. Je ne m'inquiéterais pas de la fin du ping tant que Postman fonctionne. De nombreux serveurs Web publics désactivent leur réponse ping.

1
S.C.

Donc, je pense que le problème est résolu maintenant puisque je peux recevoir le contenu de la demande, ce que j'ai fait était simplement de suivre la documentation ici: https://docs.Microsoft.com/en-us/xamarin/cross- plate-forme/fondamentaux de l'application/sécurité de la couche de transport? tabs = windows

Il semble que mes paramètres soient obsolètes au niveau de la plate-forme.

Mettez à jour l'implémentation HttpClient et l'implémentation SSL/TLS options pour activer la sécurité TLS 1.2.

Mettez à jour l'option d'implémentation HttpClient pour activer TSL 1.2 Sécurité. (NSUrlSession (iOS 7.0+)

0
Lala

Est-ce que cela a à voir avec le fait que j'appelle une API via HTTPS?

Comme vous restez sur le même réseau et appelez la même API à partir de POSTMAN et du client HTTP .NET et que vous ne réussissez qu'avec POSTMAN.Ce problème est annulé ..__ 

essayé d'envoyer une requête ping à l'API, mais renvoie une requête expirée

Ceci est répondu sur le mien.

Pouvez-vous s'il vous plaît essayer de définir l'option de délai d'attente pour HTTPClient lors de l'initialisation.

client.Timeout = TimeSpan.FromSeconds(10);

et si le problème persiste, veuillez configurer Fiddler et comparer le req envoyé depuis le client POstman et le client .NET 

0
Debashish Saha