Ich bin der Vermittler bei einem Integrationsprojekt zwischen einer Woocommerce-Website und einem Einzelhandels-POS-System. Das POS versucht, Produkte mit dem Woocommerce-Shop zu synchronisieren. Die Website verfügt über ein SLL-Zertifikat, sodass die gesamte Kommunikation über SSL erfolgt. Der POS-Anbieter sagt mir, dass sie TLS1.2 verwenden. Wir haben eine URL, die einen Kundenschlüssel und geheime enthält, so kann ich nicht die vollständige URL hier einfügen, aber das Problem ist wie folgt ...HttpClient und WebClient geben 401 Fehler, aber direkter Link im Browser funktioniert
Die gleiche URL direkt in den Browser eingefügt funktioniert einwandfrei, die erwartete Rückkehr JSON-Nutzlast Die gleiche URL, die mit einem .NET WebClient oder HttpClient verwendet wird, gibt einen Fehler 401 Nicht autorisiert zurück. Hier sehen Sie ein Beispiel für einen Integrationstest mit dem WebClient.
[Test]
public void DownloadString_UsingWebClient_ReturnsNonEmptyResponse()
{
using (var client = new WebClient())
{
var response = client.DownloadString("https://demostore.mycompany.com.au/wp-json/wc/v2/settings/tax/woocommerce_prices_include_tax?consumer_key=ck_xxxskeyxxx&consumer_secret=cs_xxxsecretxxx");
Assert.IsNotEmpty(response);
}
}
Und hier ist ein ähnlicher Test mit HttpClient;
[Test]
public async Task DownloadString_UsingHttpClient_ReturnsNonEmptyResponse()
{
using (var client = new HttpClient())
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var response = await client.GetStringAsync("https://demostore.mycompany.com.au/wp-json/wc/v2/settings/tax/woocommerce_prices_include_tax?consumer_key=ck_xxxskeyxxx&consumer_secret=cs_xxxsecretxxx"");
Assert.IsNotEmpty(response);
}
}
Beide Tests kommen nie zur Assert. Ich wiederhole: Wenn ich die gleiche URL verwende und in meinen Browser einfüge, funktioniert alles wie erwartet. Ich habe ein paar verschiedene Dinge ausprobiert, einschließlich der Durchsetzung des Sicherheitsprotokolltyps (wie im letzten Beispiel), aber es ist alles nur ein Fehler im Dunkeln, wirklich.
Die Website verwendet die neueste Version von Wordpress und befindet sich in einer gemeinsam genutzten Linux-Hosting-Umgebung.
Ist etwas fehlt mir mit WebClient und HttpClient? Gehe ich zurück zum Webhosting-Unternehmen und finde heraus, ob es etwas in der Konfiguration gibt, das verhindern würde, dass ein .NET-Client dasselbe wie ein Browser ausführt (ich habe ein Support-Ticket zu diesem Zweck angemeldet, aber ich bekomme es nicht irgendwelche Fortschritte)?
401 bedeutet, dass Sie eine Autorisierung benötigen, d. H. Sie müssen möglicherweise Authentifizierungscookies zu Ihrer Anfrage hinzufügen. – Shcherban
Versuchen Sie, den Header "User-Agent" hinzuzufügen. – zaitsman
Wow - ich musste googeln, was Sie beide meinten, aber das Hinzufügen des User-Agent Headers hat den Trick gemacht! Nun, wie markiere ich eine Antwort, wenn es in den Kommentaren @zaitsman ist? – Damo