如何在 ASP.NET Core 配置请求超时中间件

写在前面

本文参考官方文档,使用Asp.net core 8.0 的最小API 模板项目,配置超时中间件。

超时中间件可用于所有类型的ASP.NET Core应用:最小 API、带控制器的 Web API、MVC 和 Razor Pages。请求超时的属性位于命名空间 Microsoft.AspNetCore.Http.Timeouts 中。

需要注意的是,当应用在调试模式下运行时,超时中间件不会触发。要测试超时,请运行未附加调试器的应用。

代码实现

using Microsoft.AspNetCore.Http.Timeouts;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddRequestTimeouts();

var app = builder.Build();
app.UseRequestTimeouts();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.MapGet("/", async (HttpContext context) => {
    try
    {
        await Task.Delay(TimeSpan.FromSeconds(10), context.RequestAborted);
    }
    catc
ASP.NET 应用中,默认的请求超时时间为 90 秒,这意味着如果一个请求的处理时间超过了这个限制,服务器将自动中断该请求,导致前端 POST 请求中断等问题[^3]。为了解决这类问题,可以通过修改配置或代码来延长请求超时时间。 ### 修改 Web.config 文件 在传统的 ASP.NET(非 Core)项目中,可以在 `Web.config` 文件中通过 `httpRuntime` 的 `executionTimeout` 属性来设置请求的最长执行时间。例如,将超时时间设置为 3600 秒(即 1 小时): ```xml <system.web> <httpRuntime executionTimeout="3600" /> </system.web> ``` 该设置会作用于整个应用程序,适用于所有请求。需要注意的是,该配置项仅适用于 ASP.NET 应用,而不适用于 ASP.NET Core 应用。 ### 在 ASP.NET Core配置请求超时ASP.NET Core 中,请求超时机制更为灵活,开发者可以通过中间件来对请求设置超时限制。默认情况下,ASP.NET Core 并不会主动对请求施加超时限制,开发者可以根据业务需求选择性地为某些请求设置超时时间[^2]。 在 `Startup.cs` 文件中,可以使用 `UseRequestTimeouts` 中间件来全局设置请求超时时间: ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRequestTimeouts(); app.Use(async (context, next) => { context.Request.Timeout = TimeSpan.FromMinutes(60); // 设置请求超时时间为60分钟 await next(); }); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } ``` 此外,也可以在特定的控制器或方法中使用 `RequestAborted` 属性来处理长时间运行的任务,并结合异步编程模型来避免阻塞主线程。 ### 代码中动态设置超时时间 除了全局配置外,也可以在代码中动态设置请求超时时间。例如,在控制器方法中通过 `HttpContext.Server.ScriptTimeout` 来延长当前请求超时时间: ```csharp protected void Page_Load(object sender, EventArgs e) { Server.ScriptTimeout = 3600; // 设置为3600秒 } ``` 该方式的优先级高于 `Web.config` 中的配置,适用于需要临时延长超时时间的场景[^3]。 ### 注意事项 尽管可以通过上述方式延长请求超时时间,但需注意以下几点: - **资源占用问题**:长时间运行的请求会占用服务器资源,可能导致性能下降或资源耗尽。 - **前端用户体验**:即使后端处理完成,前端也可能因为浏览器限制或网络中断而无法正常接收响应。 - **建议异步处理**:对于耗时较长的操作(如生成大量数据的 Excel 文件),建议采用异步任务处理,并通过通知或轮询方式告知前端处理完成。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值