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:
我正在使用 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: