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

写在前面

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

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

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

代码实现

cs 复制代码
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);
    }
    catch (TaskCanceledException)
    {
        return Results.Content("Timeout!", "text/plain");
    }

    return Results.Content("No timeout!", "text/plain");
}).WithRequestTimeout(TimeSpan.FromSeconds(2));
// Returns "Timeout!"

// 属性将终结点配置为超时
app.MapGet("/attribute",
    [RequestTimeout(milliseconds: 2000)] async (HttpContext context) => {
        try
        {
            await Task.Delay(TimeSpan.FromSeconds(10), context.RequestAborted);
        }
        catch (TaskCanceledException)
        {
            return Results.Content("Timeout!", "text/plain");
        }

        return Results.Content("No timeout!", "text/plain");
    });

app.Run();

调用示例

使用调试模式运行:

不会触发超时

非调试模式下运行

与预期一致触发了超时

相关推荐
新知图书19 分钟前
ASP.NET MVC添加视图示例
后端·asp.net·mvc
菠萝0125 分钟前
分布式不同数据的一致性模型
数据库·c++·分布式·后端
Code哈哈笑29 分钟前
【基于SpringBoot的图书购买系统】操作Jedis对图书图书的增-删-改:从设计到实战的全栈开发指南
java·spring boot·后端·spring·交互·jedis
晴天_QingTian1 小时前
.NET8入门:14.ASP.NET Core MVC进阶——Model
asp.net·mvc·.net
hamish-wu1 小时前
spring boot 拦截器HandlerInterceptor 不生效的原因排查
java·spring boot·后端
薯条不要番茄酱2 小时前
【SpringBoot】零基础全面解析SpringBoot配置文件
java·spring boot·后端
lanbing7 小时前
非常适合初学者的Golang教程
开发语言·后端·golang
stormsha8 小时前
GO语言进阶:掌握进程OS操作与高效编码数据转换
开发语言·数据库·后端·golang·go语言·源代码管理
B1nna8 小时前
SpringBoot项目快速打包与部署,War包⽅式打包部署与Jar包⽅式打包部署两种方式
spring boot·后端·jar
声声codeGrandMaster11 小时前
Django实现文件上传
数据库·后端·python·django