前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >ASP.NET Core 中的超时中间件

ASP.NET Core 中的超时中间件

作者头像
郑子铭
发布2025-02-25 09:10:23
发布2025-02-25 09:10:23
7800
代码可运行
举报
运行总次数:0
代码可运行

在ASP.NET Core中,超时中间件允许为HTTP请求设置超时限制,以提高应用程序的健壮性和响应能力。

1. 添加超时中间件到应用

需要在的服务集合中添加请求超时中间件,再将其添加到请求处理管道中。

代码语言:javascript
代码运行次数:0
复制
using Microsoft.AspNetCore.Http.Timeouts;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRequestTimeouts(); // 添加到服务集合
var app = builder.Build();
app.UseRequestTimeouts(); // 添加到请求处理管道

2. 配置单个终结点或页面

对于最小API应用,可以通过调用WithRequestTimeout或者用[RequestTimeout]属性来配置终结点超时。

代码语言:javascript
代码运行次数:0
复制
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)); // 设置超时时间为2秒

也可以使用属性的方式:

代码语言:javascript
代码运行次数:0
复制
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");
    });

3. 配置多个终结点或页面

也可以创建命名策略来指定超时配置,这些配置可以应用于多个终结点。通过调用AddPolicy添加策略:

代码语言:javascript
代码运行次数:0
复制
builder.Services.AddRequestTimeouts(options => {
    options.DefaultPolicy = 
        new RequestTimeoutPolicy { Timeout = TimeSpan.FromMilliseconds(1500) };
    options.AddPolicy("MyPolicy", TimeSpan.FromSeconds(2));
});

可以通过策略名称为终结点指定超时:

代码语言:javascript
代码运行次数:0
复制
app.MapGet("/namedpolicy", async (HttpContext context) => {
     //设置10s任务
    return Results.Content("No timeout!", "text/plain");
}).WithRequestTimeout("MyPolicy"); // 使用命名策略

4. 设置全局默认超时策略

也可以为全局默认超时配置指定一个策略:

代码语言:javascript
代码运行次数:0
复制
builder.Services.AddRequestTimeouts(options => {
    options.DefaultPolicy = 
        new RequestTimeoutPolicy { Timeout = TimeSpan.FromMilliseconds(1500) };
});

默认超时将适用于没有指定超时的终结点。

5. 在策略中指定状态码

RequestTimeoutPolicy类有一个属性,可以在超时触发时自动设置状态码:

代码语言:javascript
代码运行次数:0
复制
builder.Services.AddRequestTimeouts(options => {
    options.DefaultPolicy = new RequestTimeoutPolicy
    {
        Timeout = TimeSpan.FromMilliseconds(1500),
        TimeoutStatusCode = (int)HttpStatusCode.InternalServerError
    };
});

每个超时的请求都将具有状态码500(内部服务器错误)。

6. 禁用特定终结点的请求超时

有时可能想要禁用特定终结点的默认超时策略。对于最小API,可以使用[DisableRequestTimeout]属性

代码语言:javascript
代码运行次数:0
复制
app.MapGet("/GetCharacter",
    [DisableRequestTimeout] async (HttpContext context, ICharacterService characterService) => {   return await characterService.GetCharacterAsync(context.RequestAborted);
    });

对于控制器,可以使用[DisableRequestTimeout]属性来覆盖默认的超时策略:

代码语言:javascript
代码运行次数:0
复制
[HttpGet("GetCharacter")]
[DisableRequestTimeout]
public async Task<Character> GetCharacterAsync()
 => await _characterService.GetCharacterAsync(HttpContext.RequestAborted);

通过合理配置超时策略,可以确保应用程序在处理时间上保持健壮和响应性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 添加超时中间件到应用
  • 2. 配置单个终结点或页面
  • 3. 配置多个终结点或页面
  • 4. 设置全局默认超时策略
  • 5. 在策略中指定状态码
  • 6. 禁用特定终结点的请求超时
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档