Ionic V3 请求在 Chrome 浏览器和模拟器中随机失败
Ionic V3 Request randomly fail in Chrome Browser and Emulator
我有一个奇怪的问题,Http-Requests 使用来自 Angular (7.1.1) 的 Http-Client 的 Ionic(V3) 应用程序随机失败。
后端是一个 ASP.NET 核心 Web API,CORS 配置为允许任何 Headers、方法和起源。
为了找出问题,我从模拟器切换到浏览器。在解决了一些 CORS 问题后,我注意到请求失败的问题只存在于 Chrome 中(FF 和 Edge 工作正常)。
HTTP 请求失败:"ERR_INVALID_HTTP_RESPONSE",来回单击网络选项卡后如下所示:
我无法解释为什么有些请求没有 Preflight 请求,但这些请求似乎总是成功(它们也有 den header "Accept: application/json, text/plain, /" 应该总是触发 Options-Preflight,如果我是对的?)
而且每个请求,即使是失败的请求,都会到达后端并在后端成功解析。
客户端控制台报错:
{
"headers": {
"normalizedNames": {},
"lazyUpdate": null,
"headers": {}
},
"status": 0,
"statusText": "Unknown Error",
"url": null,
"ok": false,
"name": "HttpErrorResponse",
"message": "Http failure response for (unknown url): 0 Unknown Error",
"error": {
"isTrusted": true
}
}
阅读 Ionic 论坛这会导致 CORS 问题。也许我忽略了什么,所以这是我来自后端的 CORS-Configuration:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseCors(builder =>
{
builder.WithOrigins("*")
.WithMethods("*")
.WithHeaders("*");
});
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseMvc();
}
非常感谢任何提示。
如果您的 Web API 项目是在 aspnet core 2.2 上,那么它可能与这个问题有关:
Response that returns 204 fails with HTTP_1_1_REQUIRED/INVALID_HTTP_RESPONSE in ANCM In-process
共有三个选项:
- 降级到 aspnetcore 2.1
- 升级到 2.2.1 / 3.0.0 预览版
- 使用问题中提到的解决方法:
将以下内容添加为 StartUp.cs 配置方法的第一行。
app.Use(async (ctx, next) =>
{
await next();
if (ctx.Response.StatusCode == 204)
{
ctx.Response.ContentLength = 0;
}
});
关于预检并非每次都触发,浏览器缓存包含预检 OPTIONS 调用的结果,因此不必在每个请求上触发预检,它仅在缓存过期后触发。
最后:使用任何来源的接受配置 CORS 可能是不安全的,请参阅:CORS security: reflecting any origin header value when configured to * is dangerous
我有一个奇怪的问题,Http-Requests 使用来自 Angular (7.1.1) 的 Http-Client 的 Ionic(V3) 应用程序随机失败。 后端是一个 ASP.NET 核心 Web API,CORS 配置为允许任何 Headers、方法和起源。
为了找出问题,我从模拟器切换到浏览器。在解决了一些 CORS 问题后,我注意到请求失败的问题只存在于 Chrome 中(FF 和 Edge 工作正常)。 HTTP 请求失败:"ERR_INVALID_HTTP_RESPONSE",来回单击网络选项卡后如下所示:
我无法解释为什么有些请求没有 Preflight 请求,但这些请求似乎总是成功(它们也有 den header "Accept: application/json, text/plain, /" 应该总是触发 Options-Preflight,如果我是对的?)
而且每个请求,即使是失败的请求,都会到达后端并在后端成功解析。
客户端控制台报错:
{
"headers": {
"normalizedNames": {},
"lazyUpdate": null,
"headers": {}
},
"status": 0,
"statusText": "Unknown Error",
"url": null,
"ok": false,
"name": "HttpErrorResponse",
"message": "Http failure response for (unknown url): 0 Unknown Error",
"error": {
"isTrusted": true
}
}
阅读 Ionic 论坛这会导致 CORS 问题。也许我忽略了什么,所以这是我来自后端的 CORS-Configuration:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseCors(builder =>
{
builder.WithOrigins("*")
.WithMethods("*")
.WithHeaders("*");
});
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseMvc();
}
非常感谢任何提示。
如果您的 Web API 项目是在 aspnet core 2.2 上,那么它可能与这个问题有关: Response that returns 204 fails with HTTP_1_1_REQUIRED/INVALID_HTTP_RESPONSE in ANCM In-process
共有三个选项:
- 降级到 aspnetcore 2.1
- 升级到 2.2.1 / 3.0.0 预览版
- 使用问题中提到的解决方法:
将以下内容添加为 StartUp.cs 配置方法的第一行。
app.Use(async (ctx, next) =>
{
await next();
if (ctx.Response.StatusCode == 204)
{
ctx.Response.ContentLength = 0;
}
});
关于预检并非每次都触发,浏览器缓存包含预检 OPTIONS 调用的结果,因此不必在每个请求上触发预检,它仅在缓存过期后触发。
最后:使用任何来源的接受配置 CORS 可能是不安全的,请参阅:CORS security: reflecting any origin header value when configured to * is dangerous