能否通过代码在Kestrel中设置"aspNetCore requestTimeout"值?

4

在Kestrel中,是否可以通过“代码”设置“aspNetCore requestTimeout”值(参见下面的xml)?

我在KestrelServerLimits对象中找不到相关内容。

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.server.kestrel.core.kestrelserverlimits?view=aspnetcore-3.1

以下是xml代码........但希望通过代码而不是(发布的)xml来完成这个操作。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore requestTimeout="00:20:00"  processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
  </system.webServer>
</configuration>

我尝试了以下代码(" serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromSeconds(5); ")......但这并不能控制我的Postman测试中的服务器超时。
namespace MyStuff
{
    using System;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Hosting;

    public class Program
    {
        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.ConfigureKestrel(serverOptions =>
                    {
                        serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromSeconds(5);
                    });

                });
    }
}

我一直在阅读微软的这篇文章:

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1#kestrel-options

Kestrel选项 Kestrel Web服务器具有约束配置选项,特别适用于面向互联网的部署。

在KestrelServerOptions类的Limits属性上设置约束。 Limits属性包含KestrelServerLimits类的实例。

1个回答

8
No. 这个GitHub问题说:

没有强制终止.NET任务的方法。这就是为什么我们不能自己停止运行过程中的CPU进程。

web.config中的requestTimeout是一个超时设置,用于在IIS等待来自您的Web应用程序的响应超时后向客户端返回500错误,但您的Web服务器(Kestrel)将继续处理请求。而且没有人能够中断它(只有重新启动Kestrel进程才会有帮助),这就是为什么Kestrel中没有这样的配置设置。

1
现在我想知道为什么有人会使用Kestrel作为ASP.NET Core的终端主机。没有超时设置会在生产环境中移除一个非常重要的安全阀,因为有时可能会出现意外行为。这种设计就像使用connection.CommandTimeout = 0一样聪明。 - user2864740
2
@SylvainGantois 核心问题在于没有选择加入无超时功能。这些预计需要花费过长时间的“真实应用程序”应该能够单独请求更多时间。否则,执行时间过长的代码只是有缺陷的。我花了多年时间解决与“理智超时”缺失相关的问题。 - user2864740
1
由于代码可能因其他原因而失败或无法恢复,因此编写良好的代码需要能够保持有效性,无论是否被粗鲁地中断。其他通常无法恢复的错误情况包括:网络丢失、OOM/SO、电源故障等。 - user2864740
我的意思是有些应用程序需要立即检测到某人已经断开连接,而不是试图保持连接,如果无法恢复。实时游戏是一个很好的例子。您可能不想等待30秒才知道对方的网络连接不好。 - Sylvain Gantois
你可以使用中间件或Polly来实现它,或者等待.NET 7,在那里它是内置的。 - Ian Kemp
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接