2017-11-21 3 views
0

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)?

+0

401 bedeutet, dass Sie eine Autorisierung benötigen, d. H. Sie müssen möglicherweise Authentifizierungscookies zu Ihrer Anfrage hinzufügen. – Shcherban

+0

Versuchen Sie, den Header "User-Agent" hinzuzufügen. – zaitsman

+0

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

Antwort

0

Ich fand, dass in der Regel, wenn etwas im Browser, aber nicht außerhalb davon funktioniert, schlägt vor, dass die API auf User-Agent Header in der Anfrage vorhanden ist.

Einer der Gründe dafür könnte ein Reverse-Proxy/Firewall vor dieser API sein.

0

Wenn Sie sich in einem Unternehmensnetzwerk befinden und der Browser funktioniert und Ihr Code nicht funktioniert, fehlen wahrscheinlich die Proxy-Einstellungen für die WebClient oder HttpClient Instanz.

Ich übergebe typischerweise eine HttpClientHandler Instanz mit Preauthenticate = true und UseDefaultCredentials = true an die HttpClient.

+0

Nicht in einem Firmennetzwerk, aber ich werde dieses Gerät für zukünftige Verwendung sicher wegbringen, danke. – Damo

Verwandte Themen