webentwicklung-frage-antwort-db.com.de

HttpClient PostAsync wird nicht zurückgegeben

Ich habe eine Menge Fragen dazu gesehen und alle weisen darauf hin, dass ich ConfigureAwait (false) verwende (false), aber selbst danach hat es immer noch keine Antwort gegeben. Wenn ich den Debugger ausführen, wird der Code bei PostAsync angehalten und der Code wird nicht fortgesetzt. Mache ich hier etwas falsch? Hat es etwas mit dem Aufruf einer API über HTTPS zu tun?

Hier ist der 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);
}

BEARBEITEN:

In Antwort auf die folgenden Kommentare ist der Code aus einer Methode enthalten, die AddAsync (Card Card) durch Klicken mit einem Handler mit einem Handler aufgerufen wird:

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

EDIT 2: Ich habe versucht, die API mit einem Ping-Befehl anzufordern, es wird jedoch eine Zeitüberschreitung für die Anforderung zurückgegeben. Wenn ich es jedoch mit Postman versucht habe, ist alles in Ordnung (die API ist nur eine Sandbox, die für alle offen ist. diese ): enter image description here

enter image description here

EDIT 3:

Ich denke, das Problem liegt darin, dass ich kein SSL-Zertifikat für den Zugriff auf die API habe. Ich habe einen PHP -Server, der eine Verbindung mit derselben API herstellt, und ich muss SSL_VERIFYPEER auf "false" setzen, damit ich darauf zugreifen kann (keine Sorge, ich habe jetzt ein cacert hinzugefügt, daher ist es wieder "true"). Kann das gleiche Problem hier passieren? Wenn ja, wie kann ich ein gültiges Zertifikat für meine Xamarin Forms-App erstellen?

10
Lala

Sie können dies verwenden

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

Am wahrscheinlichsten geschieht hier, dass Ihre OnExecute-Methode anstelle von void den Rückgabetyp Task hat, der verhindert, dass der UI-Thread darauf warten kann. Ändern Sie den Rückgabetyp entweder in Task oder erstellen Sie einen neuen UI-Thread, um diese Arbeit auszuführen. Ich würde mir keine Sorgen um das Ping-Timing machen, solange Postman arbeitet. Viele öffentliche Webserver deaktivieren ihre Ping-Antwort.

1
S.C.

Ich denke, das Problem ist jetzt behoben, da ich Inhalte von der Anfrage empfangen kann. Was ich getan habe, war einfach den Anweisungen hier zu folgen: https://docs.Microsoft.com/en-us/xamarin/cross- Plattform/App-Grundlagen/Transport-Layer-Sicherheit? Tabs = Windows

Anscheinend sind meine Einstellungen auf Plattformebene veraltet.

Aktualisieren Sie die HttpClient-Implementierung und die SSL/TLS-Implementierung Optionen zum Aktivieren der TLS 1.2-Sicherheit.

Aktualisieren Sie die HttpClient-Implementierungsoption, um TSL 1.2 .__ zu aktivieren. Sicherheit. (NSUrlSession (iOS 7.0+))

0
Lala

Hat es etwas mit dem Aufruf einer API über HTTPS zu tun?

Da Sie sich im selben Netzwerk befinden und dieselbe API von POSTMAN und .NET HTTP Client aufrufen und nur mit POSTMAN Erfolg haben, wird dieses Problem abgebrochen . Weiter 

es wurde versucht, die API mit einem Ping-Befehl zu starten, es wird jedoch eine Zeitüberschreitung für die Anforderung zurückgegeben

Dies wird oben auf mich beantwortet.

Können Sie bitte versuchen, die Timeout-Option für HTTPClient während der Initialisierung festzulegen.

client.Timeout = TimeSpan.FromSeconds(10);

falls das Problem weiterhin besteht, richten Sie bitte Fiddler ein und vergleichen Sie die von POstman und .NET-Client gesendete Anforderung 

0
Debashish Saha