ASP.NET Core如何设置请求超时时间

本文详细介绍了在ASP.NETCore环境下,如何通过修改web.config文件、调整IISExpress配置及编程方式设置请求超时时间,包括在IIS部署、IISExpress调试及代码层面的具体操作。

如果一个请求在ASP.NET Core中运行太久,会导致请求超时,目前ASP.NET Core对请求超时的设置比较麻烦,本文列出目前收集到的一些方法,供大家参考。

 

 

部署ASP.NET Core到IIS的设置方法


 

如果你的ASP.NET Core项目是部署在IIS上的,那么可以在ASP.NET Core项目发布后生成的web.config文件中,进行如下设置:

<?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>

通过添加aspNetCore节点和设置requestTimeout属性,可以将请求的超时时间设置为你想要的值,上面就设置为了20分钟。

虽然不知道requestTimeout的最大值可以设置到多少,但是试了下设置到100小时30分钟是没有问题的

requestTimeout="100:30:00"

如果一个Http请求100小时都还没执行完那也是可以了。。。但是也不要把requestTimeout设置得非常大(例如1000小时),那样IIS会报错。

 

 

在Visual Studio中使用IIS Express调试时的设置方法


 

一般在使用Visual Studio调试ASP.NET Core时,我们都会选择IIS Express作为Web服务器,下面就介绍下如何在IIS Express中设置web.config文件的超时时间。

在Windows任务栏上选中IIS Express:

右击IIS Express图标,选择Show all applications:

在弹出的窗口列表中,选中你要更改超时时间的application,然后点击底部的Config链接,这样会打开站点的applicationhost.config文件。

然后在aspNetCore节点上应用requestTimeout属性即可:

requestTimeout="00:20:00"

例如:

<system.webServer>
   <handlers>
     <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
   </handlers>
   <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" requestTimeout="00:20:00" stdoutLogEnabled="false" />
   <httpCompression>
     <dynamicCompression>
       <add mimeType="text/event-stream" enabled="false" />
     </dynamicCompression>
   </httpCompression>
</system.webServer>

最后保存applicationhost.config文件即可。

 

 

在代码层面设置超时时间


 

我们还可以在ASP.NET Core的代码层面,通过在项目Program.cs文件中添加.UseKestrel(...)BuildWebHost方法中,来设置KeepAliveTimeout属性的值,从而设置请求的超时时间,可以结合上面介绍的web.config中的requestTimeout属性来一起做设置。

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .UseKestrel(option =>
    {
        option.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(20);
        option.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(20);
    })
    .Build();

 

转载于:https://www.cnblogs.com/OpenCoder/p/10307882.html

.NET 8.0 中,ASP.NET Core 默认不会对请求施加超时限制,除非开发者在代码中主动实现超时逻辑。为了防止长时间运行的请求占用服务器资源,可以使用请求超时中间件来配置全局或每个终结点的超时时间。 ### 配置请求超时中间件 ASP.NET Core 提供了请求超时中间件,允许开发者在请求处理过程中设置最大执行时间。可以在 `Startup.cs` 文件的 `Configure` 方法中使用 `UseRequestTimeouts` 来启用该中间件,并通过 `context.Request.Timeout` 设置超时时间[^1]。例如,将请求超时时间设置为 60 分钟: ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRequestTimeouts(); app.Use(async (context, next) => { context.Request.Timeout = TimeSpan.FromMinutes(60); // 设置请求超时时间为60分钟 await next(); }); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } ``` 该方式适用于整个应用程序的所有请求,也可以在特定的控制器或方法中单独设置。 ### 在控制器或方法中设置超时 除了全局设置外,也可以在特定的控制器或方法中通过 `HttpContext.Request.Timeout` 来单独设置请求超时时间。这种方式适用于某些特定的长时间运行的任务,例如文件生成、数据导出等: ```csharp [ApiController] [Route("[controller]")] public class LongRunningTaskController : ControllerBase { [HttpGet] public async Task<IActionResult> LongRunningOperation() { HttpContext.Request.Timeout = TimeSpan.FromMinutes(30); // 设置当前请求超时时间为30分钟 // 模拟长时间任务 await Task.Delay(TimeSpan.FromMinutes(10)); return Ok("任务完成"); } } ``` 该方式仅影响当前请求,不会影响其他请求超时设置。 ### 处理异步请求中的超时 在异步请求中,可以通过 `HttpContext.RequestAborted` 属性来监听请求是否被取消。在长时间运行的任务中,应主动检查该令牌,以确保任务在超时后能及时中止,避免资源浪费: ```csharp [ApiController] [Route("[controller]")] public class AsyncTaskController : ControllerBase { [HttpGet] public async Task<IActionResult> LongRunningTask(CancellationToken cancellationToken) { HttpContext.Request.Timeout = TimeSpan.FromMinutes(10); // 设置请求超时时间为10分钟 try { await LongProcessAsync(cancellationToken); return Ok("任务完成"); } catch (OperationCanceledException) { return StatusCode(StatusCodes.Status503ServiceUnavailable, "请求超时"); } } private async Task LongProcessAsync(CancellationToken cancellationToken) { for (int i = 0; i < 100; i++) { await Task.Delay(1000, cancellationToken); // 模拟长时间任务 } } } ``` 该方式确保在请求超时后能主动中断任务,避免服务器资源被长时间占用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值