首页 > 编程语言 >ASP.NET Core 中的超时中间件

ASP.NET Core 中的超时中间件

时间:2025-01-23 11:10:43浏览次数:1  
标签:Core TimeSpan app 中间件 context NET 超时 options

ASP.NET Core 中的超时中间件

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

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

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

using Microsoft.AspNetCore.Http.Timeouts;

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

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

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

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秒

也可以使用属性的方式:

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添加策略:

builder.Services.AddRequestTimeouts(options => {
    options.DefaultPolicy = 
        new RequestTimeoutPolicy { Timeout = TimeSpan.FromMilliseconds(1500) };
    options.AddPolicy("MyPolicy", TimeSpan.FromSeconds(2));
});

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

app.MapGet("/namedpolicy", async (HttpContext context) => {
     //设置10s任务
    return Results.Content("No timeout!", "text/plain");
}).WithRequestTimeout("MyPolicy"); // 使用命名策略

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

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

builder.Services.AddRequestTimeouts(options => {
    options.DefaultPolicy = 
        new RequestTimeoutPolicy { Timeout = TimeSpan.FromMilliseconds(1500) };
});

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

5. 在策略中指定状态码

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

builder.Services.AddRequestTimeouts(options => {
    options.DefaultPolicy = new RequestTimeoutPolicy
    {
        Timeout = TimeSpan.FromMilliseconds(1500),
        TimeoutStatusCode = (int)HttpStatusCode.InternalServerError
    };
});

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

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

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

app.MapGet("/GetCharacter",
    [DisableRequestTimeout] async (HttpContext context, ICharacterService characterService) => {
        return await characterService.GetCharacterAsync(context.RequestAborted);
    });

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

[HttpGet("GetCharacter")]
[DisableRequestTimeout]
public async Task<Character> GetCharacterAsync()
    => await _characterService.GetCharacterAsync(HttpContext.RequestAborted);

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

标签:Core,TimeSpan,app,中间件,context,NET,超时,options
From: https://www.cnblogs.com/netcore5/p/18687368

相关文章

  • ASP.NET Core 快速轻量级的浏览器检测和设备检测库
    在.NETFramework4.7中那样,通过HttpContext.Request的Browser属性轻松获取发起HTTP请求的浏览器信息,ASP.NETCore并未直接提供这一功能,现在有了BrowserDetector这个强大的NuGet包,你可以在ASP.NETCore应用中轻松实现浏览器、设备类型以及操作系统的检测。Browser......
  • .NET开源强大的高级日期和时间库
    NodaTime是一个为.NET设计的开源高级日期和时间库,提供了比.NET框架自带的DateTime和DateTimeOffset更加丰富和可靠的日期时间操作功能。1.安装NodaTime首先,通过NuGet安装NodaTime包:Install-PackageNodaTime2.基本概念NodaTime提供了多种日期和时间类型,主......
  • .Net类型 引用类型
    预定义类型引用类型C#支持两种预定义的引用类型:object和string名称.NET类型说明objectSystem.Object根类型,其他类型都是从它派生而来的(包括值类型)stringSystem.StringUnicode字符串 1.object类型许多编程语言和层次结构都提供了根类型,层次结构中......
  • dotnet 使用 ColorCode 做代码着色器
    本文记录我使用ColorCode开源库简单做一个代码着色器开源库地址:https://github.com/CommunityToolkit/ColorCode-Universal我用的是ColorCode.Core版本,这个版本是无具体UI框架依赖的,于是我就在此基础上,同时做了WPF和Avalonia框架的版本。这两个框架在对ColorCode的......
  • AI回答:一个简洁的php中间件类
    <?phpclassMiddlewareStack{private$middlewares=[];private$request;private$response;/***添加中间件到堆栈**@paramcallable$middleware中间件函数,接受请求、响应和下一个中间件作为参数*/publicfunctiona......
  • 回调函数 事件处理 dotnet .net 有界队列 背压机制(Backpressure)有界队列
    回调函数事件处理dotnet.net有界队列背压机制(Backpressure)有界队列通过有界队列来实现背压,确保生产者不会以超过消费者处理能力的速度发送数据。usingSystem.Threading.Channels;publicclassProgram{staticasyncTaskMain(string[]args){//创......
  • 回调函数 事件处理 dotnet .net 消费处理系统 生产者-消费者类型
    回调函数dotnet.net消费处理系统生产者-消费者类型一个简单的消息处理系统,它使用了.NET的System.Threading.Channels命名空间来创建一个无界的通道(channel),用于在不同的任务之间传递MessageWrapper对象。无界限的消息队列(UnboundedChannel)是.NET中System.Threading.Channel......
  • .NET9 中替换Swagger使用Scalar
    .NET9没有Swagger怎么办?前言在.NET9中,在创建WebAPI项目时,Swagger的使用与.NET8略有不同。.NET9不再内置Swagger,而是生成OpenApi标准的Json文件。如果想在.NET9中使用Swagger,需要手动安装,并配置Swagger。在.NET9中使用Swagger安装包首先安装Nuget包Install-PackageSwashbu......
  • 华为eNSP-telnet配置
            Telnet是一个用于远程登录的协议,它允许用户通过网络连接到远程主机,并在本地计算机上执行远程主机上的命令。telnet基于传输层之上的应用层协议。现在用两台路由器进行telnet配置,我们在R2上开启telnet服务,用R1远程登陆R2。R1配置[R1]intg0/0/0[R1-Gigabi......
  • TensorFlow迁移学习DenseNet121预测10-monkey-species
     In [1]:fromtensorflowimportkerasimporttensorflowastfimportnumpyasnpimportpandasaspdfromscipyimportndimageimportmatplotlib.pyplotasplt In [14]:densenet121=keras.applications.DenseNet121(include_top=Fal......