.NET Core 3.1传入请求超时不工作

8ftvxx2r  于 2023-05-19  发布在  .NET
关注(0)|答案(1)|浏览(147)

我有一个.NET Core 3.1 Web API,我想控制它将等待多长时间,直到返回504超时错误。
我在Program.cs中添加了以下代码:

public static void Main(string[] args) => CreateHostBuilder(args).Build().Run();

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            webBuilder.UseKestrel(opt => { opt.Limits.KeepAliveTimeout = TimeSpan.FromSeconds(10); });
        });

有了这个,我希望任何需要超过10秒处理的请求都会返回504错误。
为了测试,我在一个控制器中添加了一个Thread.Sleep(100000)作为第一行。
当我通过Postman调用端点时,它会等待整整100秒,然后返回一个200。
为什么10秒后不抛出错误?

3phpmpom

3phpmpom1#

根据您的要求,我创建了一个自定义的中间件。

TimeoutMiddleware.cs

using Microsoft.AspNetCore.Http;
using System;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading;

namespace Middlewares
{
    public class TimeoutMiddleware
    {
        private readonly RequestDelegate _next;

        public TimeoutMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            var startTime = DateTime.UtcNow;

            await _next(context);

            var elapsedTime = DateTime.UtcNow - startTime;

            if (elapsedTime > TimeSpan.FromSeconds(10))
            {
                context.Response.StatusCode = (int)HttpStatusCode.GatewayTimeout;
            }
        }
    }
}

注册中间件。

订单非常重要,您可以按以下方式注册。

我的测试代码。

public IActionResult timeouttest()
{
    Thread.Sleep(11000);
    return Ok();
}

我的检测结果

相关问题