我得到“ Http 故障响应(未知网址) : 0未知错误”,而不是实际的错误消息角度

我使用 Angular 4 HttpClient向外部服务发送请求。这是一个非常标准的设置:

this.httpClient.get(url).subscribe(response => {
//do something with response
}, err => {
console.log(err.message);
}, () => {
console.log('completed');
}

问题是,当请求失败时,我会看到一个泛型 控制台中的 Http failure response for (unknown url): 0 Unknown Error消息。同时,当我在 chrome 中检查失败的请求时,我可以看到响应状态是422,而在“预览”选项卡中,我可以看到描述失败原因的实际消息。

如何访问在 chrome 开发工具中可以看到的实际响应消息?

下面的截图展示了这个问题: enter image description here

388189 次浏览

这个问题与 CORS有关。我注意到 Chrome 控制台中还有一个错误:

请求的资源上没有“访问控制-允许-起源”标头。因此,不允许访问起源“ http://localhost:4200”。反应 HTTP状态码为422。`

这意味着来自后端服务器的响应缺少 Access-Control-Allow-Origin头,即使后端 nginx 配置为使用 add_header指令将这些头添加到响应中。

但是,此指令仅在响应代码为20X 或30X 时才添加标头。在错误响应中,标题丢失了。我需要使用 always参数来确保添加头部,而不管响应代码是什么:

add_header 'Access-Control-Allow-Origin' 'http://localhost:4200' always;

一旦后端配置正确,我可以访问角度代码的实际错误消息。

如果您使用 Laravel 作为后端,那么编辑您的。Htaccess 文件粘贴此代码,以解决问题的 CROS 在您的角度或 IONIC 项目

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

对我来说,它是由服务器端 JsonSerializerException 引起的。

执行请求时发生未处理的异常 异常: 自引用循环 检测到类型..。

这位客户表示:

POST http://localhost:61495/api/Action net::ERR_INCOMPLETE_CHUNKED_ENCODING
ERROR HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: null, ok: false, …}

通过消除循环,使响应类型更简单,从而解决了这个问题。

这个错误发生在我的火狐浏览器中,而不是 Chrome 浏览器本地开发时,结果是火狐不信任我的本地 API 的 Ssl 证书(这是无效的,但我已经将它添加到我的本地证书商店,让 Chrome 信任它,但不是 ff)。直接导航到 API 并在 Firefox 中添加一个异常就解决了这个问题。

没有其他问题那么古老,但是我只是在 ionic-Laravel 应用程序中努力解决这个问题,在这里(和其他帖子)没有任何效果,所以我在 Laravel 安装了 https://github.com/barryvdh/laravel-cors补充程序并开始运行,它运行得非常好。

为我工作后,关闭广告阻塞扩展铬,这个错误有时会出现,因为有些东西阻塞浏览器中的 http

enter image description here

我的问题是由我试图查询的模型中的无效关系引起的。通过调试它在关系中崩溃的响应得出结论。

如果你有一个适当的 Cors 头在适当的地方。您的公司网络可能正在剥离 Cors 头。如果该网站是外部可访问的,请尝试从网络外部访问它,以验证网络是否导致了问题——无论原因如何,这都是一个好主意。

如果您没有提供服务器能够理解的有效客户端证书和令牌,也可能发生类似的错误:

错误:

(未知 URL)的 Http 失败响应: 0未知错误

示例代码:

import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';


class MyCls1 {


constructor(private http: HttpClient) {
}


public myFunc(): void {


let http: HttpClient;


http.get(
'https://www.example.com/mypage',
{
headers:
new HttpHeaders(
{
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
'MyClientCert': '',        // This is empty
'MyToken': ''              // This is empty
}
)
}
).pipe( map(res => res), catchError(err => throwError(err)) );
}


}

请注意,MyClientCertMyToken都是空字符串,因此出现了错误。
MyClientCertMyToken可以是您的服务器理解的任何名称。

我正在使用 ASP.NET SPA 扩展,它在端口5000和5001上创建一个代理,在开发过程中传递到 Angular 的端口4200。

我已经为 https 端口5001正确设置了 CORS,一切都很好,但是我无意中转到了一个旧的书签,这是端口5000。然后突然传来了这个消息。正如其他人在控制台中所说的,有一个“飞行前”错误消息。

因此,不管您的环境如何,如果使用 CORS,请确保指定了所有端口——因为主机和端口都很重要。

如果您正在使用.NETCore 应用程序,此解决方案可能会有所帮助!

此外,这可能不是前端应用程序中的 有角度的还是其他的请求错误

首先,你必须添加 Microsoft CORS Nuget 软件包:

Install-Package Microsoft.AspNetCore.Cors

然后需要在 startup.cs 中添加 CORS 服务。在 ConfigureServices 方法中,应该具有与下面类似的内容:

public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
}

接下来,将 CORS 中间件添加到应用程序中。在 startup.cs 中应该有一个 Configure 方法。你需要这样做:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
app.UseCors( options =>
options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
app.UseMvc();
}

选项 lambda 是一个流畅的 API,因此您可以添加/删除任何额外的选项。您实际上可以使用选项“ AllowAnyOrigin”来接受任何域,但我强烈建议您不要这样做,因为它会打开来自任何人的跨源调用。您还可以限制对它们的 HTTP 方法(GET/PUT/POST 等)的跨原点调用,因此您只能公开 GET 调用跨域等。

如果其他任何人最终像我一样迷失了... 我的问题不是由于 CORS (我已经完全控制服务器和 CORS 配置正确!).

我的问题是因为我使用的是安卓平台级别28,默认情况下禁用明文网络通信和我试图开发的应用程序,它指向我的笔记本电脑的 IP (这是运行 API 服务器)。API 基 URL 类似于 Http://[ LAPTOP _ IP ] : 8081。由于它不是 Https,android webview 完全阻塞了我笔记本电脑上的手机/模拟器和服务器之间的网络 xfer。为了解决这个问题:

添加网络安全配置

Project 中的新文件: resources/android/xml/network _ security _ config. xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- Set application-wide security config -->
<base-config cleartextTrafficPermitted="true"/>
</network-security-config>

注意: 应该谨慎使用,因为它将允许所有明文从您的应用程序(没有强制使用 https)。如果你愿意,你可以进一步限制它。

在 main config.xml 中引用配置

<platform name="android">
...
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
<application android:networkSecurityConfig="@xml/network_security_config" />
</edit-config>
<resource-file src="resources/android/xml/network_security_config.xml" target="app/src/main/res/xml/network_security_config.xml" />
....
</platform>

就是这样!从那里我重建 APK 和应用程序现在能够通信从模拟器和手机。

更多关于网络秒的信息: https://developer.android.com/training/articles/security-config.html#CleartextTrafficPermitted

我的错误是文件太大(dotnet core 似乎有一个限制@~ 25Mb)

  • 在 web.config 中,maxAllowedContentLlength 到4294967295(uint 的最大值)
  • 用[ DisableRequestSizelimit ]装饰控制器操作
  • 在 Startup.cs 中配置(options = > { options. MultipartBodyLengthlimit = 4294967295; }) ;

帮我解决了问题。

每当我的请求需要超过2分钟才能完成时,我就会收到同样的信息。浏览器将断开与请求的连接,但后端上的请求将继续下去,直到请求完成。服务器(在我的例子中是 ASP.NET Web API)不会检测到断开。

经过一整天的搜索,我终于找到了 这个答案,解释说如果使用 代理配置代理配置,它的默认超时时间为120秒(或2分钟)。

因此,您可以编辑您的代理配置,并将其设置为您需要的任何内容:

{
"/api": {
"target": "http://localhost:3000",
"secure": false,
"timeout": 6000000
}
}

现在,我正在使用代理 Keepalive 到 使其与 NTLM 身份验证一起工作,并且不知道代理的超时与代理的超时没有任何关系,所以两者都必须被设置。我花了一段时间才意识到这一点,这里有一个例子:

const Agent = require('agentkeepalive');


module.exports = {
'/api/': {
target: 'http://localhost:3000',
secure: false,
timeout: 6000000,          // <-- this is needed as well
agent: new Agent({
maxSockets: 100,
keepAlive: true,
maxFreeSockets: 10,
keepAliveMsecs: 100000,
timeout: 6000000,      // <-- this is for the agentkeepalive
freeSocketTimeout: 90000
}),
onProxyRes: proxyRes => {
let key = 'www-authenticate';
proxyRes.headers[key] = proxyRes.headers[key] &&
proxyRes.headers[key].split(',');
}
}
};

对我来说,这不是一个角度的问题。是数据库中 DateTime 类型的字段,其值为(0000-00-00) ,我的模型无法正确绑定该属性,因此我更改为有效值,如(2019-08-12)。

我使用的是.net core、 OData v4和 MySql (EF 柚子连接器)

在连接文件中添加此代码

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT,GET,POST,DELETE");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

如果这是一个节点服务,请尝试列出的 给你步骤

基本上,这是一个跨来源资源共享(CORS)错误。

一旦我用以下代码行更新了我的节点服务,它就可以工作了:

let express = require("express");
let app = express();


app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});

对我来说,这是一个浏览器问题,因为我的请求在邮递员工作良好。

事实证明,由于某种原因,Firefox 和 Chrome 阻止了进入 6000端口的请求,一旦我将 ASP.NET API 端口改为 4000,这个错误就变成了一个已知的 CORS 错误,我可以修复它。

Chrome 至少向我展示了 ERR_UNSAFE_PORT,这给了我一个可能出错的线索。

在 asp.net 核心中,如果您的 api 控制器没有名为 [AllowAnonymous]的注释,那么将它添加到控制器名称的上方,如

[ApiController]
[Route("api/")]
[AllowAnonymous]
public class TestController : ControllerBase

您必须使用—— port when service 服务器 发球——打开——端口4200

    export class DatabaseService {
baseUrl: String = "http://localhost:8080/";
constructor(private http: HttpClient) { }




saveTutorial(response) {
var fullUrl = this.baseUrl + "api/tutorials";
   

return this.http.post(fullUrl,response);
}
}

如果您使用 nodejs 作为后端,请遵循以下步骤

  1. 在后端应用程序中安装 cors

    Npm 安装系统

  2. 添加这个代码

     const cors = require('cors');
    const express = require('express');
    const expressApp = express();
    expressApp.use(cors({
    origin: ['http://localhost:4200'],
    "methods": "GET,PUT,POST",
    "preflightContinue": false,
    "optionsSuccessStatus": 204,
    credentials: true
    }));
    

我也有同样的问题。我使用 grdl 的答案上面,并添加了一个像下面这样的 cors 配置到我的服务器,问题得到了解决。

{
"cors": [
{
"origin": [“*”],
"method": ["GET"],
"responseHeader": ["Content-Type"],
"maxAgeSeconds": 3600
}
]
}

查看服务器的特定 cors 配置帮助,了解如何设置它。

2022-07-13

这是最简单的方法,但不要与 PROD。

Html中,添加或编辑现有的 <meta http-equiv="Content-Security-Policy" content="。例如 CORS 阻止了我对本地 IIS 快车 https://localhost:44387/api/test的访问,解决方案就是拥有这个

<meta http-equiv="Content-Security-Policy" content="
...
connect-src 'self' https://localhost:44387 https://anysite.com ...">

让我们做一些简单的事情:

A)网络断开-零字节响应。

B)当我取消一个 http 呼叫时,我得到了这个(是的,你可以这样做)

C)在启动时,当我移动页面太快,它会取消 http 调用,因为角度没有挂接正确。我锁定了页面来阻止这个发生。

D)我们在中间有一个代理,它在30秒后终止了连接,而不是发送一个 HTTP 超时数据包。如果你看看。后端的 net 日志中,您将看到一个客户端断开连接的消息。(因为用户可能会关闭浏览器,所以这种情况并不少见)

所有这些都发生在我身上,我不知道如何区分出任何特定失败的原因。

在我的案例中,UseCors 位于 UseAuthentication/Authorization 之后: 当从服务器返回401响应时,请求的资源上没有访问控制-允许-起源头