Ich verwende Angular 4 HttpClient
, um Anfragen an einen externen Dienst zu senden. Es ist ein sehr Standard-Setup:
this.httpClient.get(url).subscribe(response => {
//do something with response
}, err => {
console.log(err.message);
}, () => {
console.log('completed');
}
Das Problem ist, wenn die Anforderung fehlschlägt Http failure response for (unknown url): 0 Unknown Error
, wird in der Konsole eine allgemeine
Nachricht angezeigt. Wenn ich die fehlgeschlagene Anforderung in Chrome überprüfe, sehe ich, dass der Antwortstatus 422 lautet, und auf der Registerkarte "Vorschau" wird die tatsächliche Fehlerursache für die Beschreibung der Nachricht angezeigt.
Wie greife ich auf die tatsächliche Antwortnachricht zu, die in den Chrome Dev Tools angezeigt wird?
angular
typescript
grdl
quelle
quelle
err
Objekt zu protokollieren - nicht nur dasmessage
Antworten:
Das Problem hing mit CORS zusammen . Ich habe festgestellt, dass in der Chrome-Konsole ein weiterer Fehler aufgetreten ist:
Dies bedeutet, dass der Antwort vom Backend-Server der
Access-Control-Allow-Origin
Header fehlte , obwohl Backend-Nginx so konfiguriert wurde, dass diese Header zu den Antworten mitadd_header
Direktive hinzugefügt werden .Diese Anweisung fügt jedoch nur Header hinzu, wenn der Antwortcode 20X oder 30X ist. Bei Fehlerantworten fehlten die Header. Ich musste
always
Parameter verwenden, um sicherzustellen, dass der Header unabhängig vom Antwortcode hinzugefügt wird:add_header 'Access-Control-Allow-Origin' 'http://localhost:4200' always;
Sobald das Backend korrekt konfiguriert war, konnte ich auf die tatsächliche Fehlermeldung im Angular-Code zugreifen.
quelle
Für den Fall, dass jemand anderes so verloren geht wie ich ... Meine Probleme waren NICHT auf CORS zurückzuführen (ich habe die volle Kontrolle über die Server und CORS wurde korrekt konfiguriert!).
Mein Problem war, dass ich die Android-Plattformstufe 28 verwende, die standardmäßig die Klartext-Netzwerkkommunikation deaktiviert, und ich habe versucht, die App zu entwickeln, die auf die IP meines Laptops verweist (auf der der API-Server ausgeführt wird). Die API-Basis-URL lautet ungefähr http: // [LAPTOP_IP]: 8081 . Da es sich nicht um https handelt , blockiert Android Webview das Netzwerk zwischen dem Telefon / Emulator und dem Server auf meinem Laptop vollständig. Um dies zu beheben:
Fügen Sie eine Netzwerksicherheitskonfiguration hinzu
Neue Datei im Projekt: resources / android / xml / network_security_config.xml
HINWEIS: Dies sollte sorgfältig verwendet werden, da dadurch der gesamte Klartext Ihrer App zugelassen wird (nichts, was zur Verwendung von https gezwungen wird). Sie können es weiter einschränken, wenn Sie möchten.
Verweisen Sie auf die Konfiguration in der Datei main config.xml
Das ist es! Von dort aus habe ich die APK neu erstellt und die App konnte nun sowohl vom Emulator als auch vom Telefon aus kommunizieren.
Weitere Informationen zu Netzwerksek: https://developer.android.com/training/articles/security-config.html#CleartextTrafficPermitted
quelle
http
.. es wäre kein Problem, wenn ich verwendehttps
.... aber im Fall , dass ich immer noch verwendenhttp
, ich direkt hinzufügenandroid:usesCleartextTraffic="true"
in -application
Tag inAndroidManifest.xml
. ..und es funktioniert .... danke für die Erwähnung übercleartext
...Wenn ich nach dem Deaktivieren der Anzeigenblockerweiterung in Chrome für mich arbeite, tritt dieser Fehler manchmal auf, weil etwas http im Browser blockiert
quelle
Wenn Sie eine .NET Core-Anwendung verwenden, kann diese Lösung hilfreich sein!
Darüber hinaus ist dies möglicherweise kein Angular- oder anderer Anforderungsfehler in Ihrer Front-End-Anwendung
Zunächst müssen Sie das Microsoft CORS Nuget-Paket hinzufügen:
Anschließend müssen Sie die CORS-Dienste in Ihrer startup.cs hinzufügen. In Ihrer ConfigureServices-Methode sollten Sie Folgendes haben:
Fügen Sie als Nächstes die CORS-Middleware zu Ihrer App hinzu. In Ihrer startup.cs sollten Sie eine Configure-Methode haben. Sie müssen es ähnlich haben:
Die Option Lambda ist eine fließende API, mit der Sie zusätzliche Optionen hinzufügen / entfernen können, die Sie benötigen. Sie können die Option "AllowAnyOrigin" tatsächlich verwenden, um eine Domain zu akzeptieren. Ich empfehle jedoch dringend, dies nicht zu tun, da dadurch Cross-Origin-Anrufe von jedermann geöffnet werden. Sie können auch Ursprungsübergreifende Aufrufe auf ihre HTTP-Methode (GET / PUT / POST usw.) beschränken, sodass Sie nur domänenübergreifende GET-Aufrufe usw. verfügbar machen können.
quelle
Dieser Fehler trat bei der lokalen Entwicklung in Firefox, aber nicht in Chrome auf, und es stellte sich heraus, dass Firefox dem SSL-Zertifikat meiner lokalen API nicht vertraute (was nicht gültig ist, aber ich hatte es meinem lokalen Zertifikatspeicher hinzugefügt, der dies zuließ Chrom vertraue es aber nicht ff). Durch direktes Navigieren zur API und Hinzufügen einer Ausnahme in Firefox wurde das Problem behoben.
quelle
Für mich wurde es durch eine serverseitige JsonSerializerException verursacht.
Der Kunde sagte:
Die Vereinfachung des Antworttyps durch Eliminieren der Schleifen löste das Problem.
quelle
Wenn Sie Laravel als Backend verwenden, bearbeiten Sie Ihre .htaccess-Datei, indem Sie nur diesen Code einfügen, um das Problem CROS in Ihrem Angular- oder IONIC-Projekt zu lösen
quelle
Ein ähnlicher Fehler kann auftreten, wenn Sie kein gültiges Client-Zertifikat und Token angegeben haben, das Ihr Server versteht:
Error:
Beispielcode:
Beachten Sie, dass beide
MyClientCert
&MyToken
leere Zeichenfolgen sind, daher der Fehler.MyClientCert
&MyToken
kann ein beliebiger Name sein, den Ihr Server versteht.quelle
Ich verwende ASP.NET SPA-Erweiterungen, die mir einen Proxy für die Ports 5000 und 5001 erstellen, die während der Entwicklung an Angulars Port 4200 weitergeleitet werden.
Ich hatte CORS korrekt für https Port 5001 eingerichtet und alles war in Ordnung, aber ich ging versehentlich zu einem alten Lesezeichen, das für Port 5000 war. Dann tauchte plötzlich diese Meldung auf. Wie andere in der Konsole gesagt haben, gab es eine "Preflight" -Fehlermeldung.
Wenn Sie CORS verwenden, stellen Sie unabhängig von Ihrer Umgebung sicher, dass alle Ports angegeben sind - da sowohl Host als auch Port von Bedeutung sind.
quelle
Ich erhielt genau diese Nachricht, wenn meine Anfragen länger als 2 Minuten dauerten. Der Browser trennte sich von der Anforderung, aber die Anforderung im Backend wurde fortgesetzt, bis sie abgeschlossen war. Der Server (in meinem Fall die ASP.NET-Web-API) würde die Trennung nicht erkennen.
Nach einem ganzen Tag Suche habe ich endlich diese Antwort gefunden und erklärt, dass bei Verwendung der Proxy-Konfiguration das Standardzeitlimit 120 Sekunden (oder 2 Minuten) beträgt.
So können Sie Ihre Proxy-Konfiguration bearbeiten und auf die gewünschten Einstellungen einstellen:
Jetzt habe ich agentkeepalive verwendet, damit es mit der NTLM-Authentifizierung funktioniert , und wusste nicht, dass das Zeitlimit des Agenten nichts mit dem Zeitlimit des Proxys zu tun hat. Daher müssen beide festgelegt werden. Es hat eine Weile gedauert, bis mir das klar wurde. Hier ist ein Beispiel:
quelle
Für mich war es ein Browserproblem, da meine Anfragen in Postman gut funktionierten.
Es stellte sich heraus, dass Firefox und Chrome aus irgendeinem Grund Anfragen an den Port blockierten. Nachdem
6000
ich den ASP.NET-API-Port auf4000
geändert hatte, änderte sich der Fehler in einen bekannten CORS-Fehler, den ich beheben konnte.Chrome hat mir zumindest gezeigt,
ERR_UNSAFE_PORT
was mir einen Hinweis darauf gab, was falsch sein könnte.quelle
Wenn Sie einen richtigen Cors-Header haben. Ihr Unternehmensnetzwerk entfernt möglicherweise den Cors-Header. Wenn auf die Website von außen zugegriffen werden kann, versuchen Sie, von außerhalb Ihres Netzwerks darauf zuzugreifen, um zu überprüfen, ob das Netzwerk das Problem verursacht - eine gute Idee, unabhängig von der Ursache.
quelle
Wenn in asp.net core auf Ihrem API-Controller keine Annotation aufgerufen wird
[AllowAnonymous]
, fügen Sie diese über Ihrem Controllernamen wie hinzuquelle
Ist nicht so alt wie andere Fragen, aber ich habe gerade in einer Ionic-Laravel-App damit zu kämpfen, und von hier aus (und anderen Posts) funktioniert nichts mehr. Deshalb habe ich https://github.com/barryvdh/laravel-cors komplement in installiert Laravel und angefangen und es funktioniert ziemlich gut.
quelle
Meins wurde durch eine ungültige Beziehung in den Modellen verursacht, die ich abfragen wollte. Dies wurde durch Debuggen der Antwort herausgefunden, die bei der Beziehung abgestürzt ist.
quelle
Für mich war es kein Winkelproblem. War ein Feld vom Typ DateTime in der Datenbank mit dem Wert (0000-00-00) und mein Modell kann diese Eigenschaft nicht korrekt binden, sodass ich auf einen gültigen Wert wie (2019-08-12) geändert habe.
Ich verwende .net Core, OData v4 und MySql (EF Pomelo Connector)
quelle
quelle
Wenn dies ein Knotendienst ist, führen Sie die hier beschriebenen Schritte aus
Grundsätzlich handelt es sich um einen CORS-Fehler (Cross-Origin Resource Sharing). Weitere Informationen zu solchen Fehlern finden Sie hier .
Nachdem ich meinen Knotendienst mit den folgenden Zeilen aktualisiert hatte, funktionierte er:
quelle
Mein Fehler war, dass die Datei zu groß war (der Dotnet-Kern scheint ein Limit von ~ 25 MB zu haben). Rahmen
löste das Problem für mich.
quelle