HttpClient 的请求超时

Request timeout for HttpClient

我正在使用 ASP.NET Core Web API 的 TypeScript 工作。

场景:

我正在后端处理大数据响应服务。加载数据需要两分多钟。据我所知,HttpClient 的默认超时时间是 localhost 的两分钟 (Chrome hold for request time out),但是当我将我的代码发布到 IIS 站点时,两分钟后它给出 500 Internal Server Error.

API这边:

我已将时间设置为 1000 秒。

 services.AddDbContext<BusinessContext>(options =>
     options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"], opts => opts.CommandTimeout(1000).EnableRetryOnFailure()));

网页端:

尝试 1:

这是一个简单的服务调用

async getData(lookUp: Lookup): Promise<PacketSearchItem[]> {
    return await this.http.post(environment.apiBaseUrl + "Packet/ManualSearch", lookUp)
      .toPromise() as PacketSearchItem[];
}

尝试:2

async getData(lookUp: Lookup): Promise<PacketSearchItem[]> {
    return await this.http.post(environment.apiBaseUrl + "Packet/ManualSearch", lookUp).pipe(timeout(10000000))
      .toPromise() as PacketSearchItem[];
}

尝试:3

async getData(lookUp: Lookup): Promise<PacketSearchItem[]> {
    return await this.http.post(environment.apiBaseUrl + "Packet/ManualSearch", lookUp, { headers: new HttpHeaders({ timeout: `${10000000}` })}).pipe(timeout(10000000))
      .toPromise() as PacketSearchItem[];
}

关于Google的研究:

我使用上面的 link 代码,但它给了我同样的错误,因为 2 分钟后请求超时发生在 Google Chrome.

错误截图:

1) 控制台错误:

2.) 网络错误:

我想等待 Chrome 得到 API 的回复。

我已经添加了 CORS 策略:

 services.AddCors(options => {
     options.AddPolicy("CorsPolicy",
         builder => builder.AllowAnyOrigin()
         .AllowAnyMethod()
         .AllowAnyHeader()
         .AllowCredentials());
});

app.UseExceptionHandler(
    builder => {
        builder.Run(
            async context => {
                context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                context.Response.Headers.Add("Access-Control-Allow-Origin", "*");

                var error = context.Features.Get<IExceptionHandlerFeature>();
                if (error != null) {
                    context.Response.Headers.Add("Application-Error", error.Error.Message);
                    // CORS
                    context.Response.Headers.Add("access-control-expose-headers", "Application-Error");

                    await context.Response.WriteAsync(error.Error.Message).ConfigureAwait(false);
                }
            });
    });

根据您的屏幕截图,这不是超时问题,而是 cross-origin resource sharing (CORS) 问题。

您可能应该花一些时间了解 CORS and how to enable CORS in ASP.NET Core

经过大量研究,我找到了答案。这是 ASP.NET 核心配置文件中的问题:

web.config

 <aspNetCore requestTimeout="00:20:00">

我们必须增加这里的超时时间。

帮助link:

Reference