使用长时间运行的ASP.NET MVC核心控制器HTTPPost方法超时

时间:2016-05-27 03:19:57

标签: timeout asp.net-core asp.net-core-mvc

我在ASP.NET Core MVC查看页面

中使用了ajax调用

MyView.cshtml

          $.ajax({
                processData: false,
                contentType: false,
                data: new FormData(this),
                type: $(this).attr('method'),
                url: $(this).attr('action'),
                cache: false,
                success: function (data) {
                        $('#mydiv).html(data);
                        $('#bootstrapModal).modal('show');

Controller Post方法“

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> MyLongRunningMethod(MyViewModel viewModel)
    {
        await MyProcess.Longprocess1();
        await MyProcess.Longprocess2();
        await MyProcess.Longprocess3();
        await MyProcess.Longprocess4();
        return PartialView("_MyPartialPage");
    }

这有效但只对长时间运行的进程有问题。调试模式期间,当进程花费的时间超过大约2分钟时,我收到以下错误

enter image description here

我理解这与过期超时有关

在以前版本的ASP.NET MVC中,您显然可以增加asp.net控制器操作的超时时间。

HttpContext.Current.Server.ScriptTimeout = 90000;

ASP.NET Core

中不存在此问题

我想增加特定asp.net控制器的调试和部署超时。

对于生产,我可以通过将requestTimeout添加到现有的httpPlatform标记,在web.config中全局设置它。 例如10分钟

<httpPlatform requestTimeout="00:10:00" ....

虽然提出了类似的问题,但answer使用CancellationToken给出但是阅读它,它似乎不能帮助我超时。

  1. 如何在部署Visual Studio 2015调试模式时设置超时?就像我在部署它时可以做的那样?
  2. 是否有ASP.NET 4中的每个控制器超时设置?

6 个答案:

答案 0 :(得分:44)

RequestTimeout="00:20:00"代码上设置aspNetCore并部署该网站会导致它不会超时。

现在只在从Visual Studio调试模式运行但不在发布模式下运行时才会出现问题。

请注意:在ASP.NET RTM中,httpPlatform

中的aspNetCore标记已替换为web.config ASP.NET Core的示例
<?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>

答案 1 :(得分:25)

但在.Net Core 2.0中,项目中没有web.config个文件。它会自动生成。

我通过将.UseKestrel(...)添加到BuildWebHost文件中的Program.cs函数来解决了这个问题,如下所示:

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

答案 2 :(得分:14)

在我的情况下,即使在更新requestTimeout参数后,我们仍然在2分钟时遇到502超时错误。事实证明,红隼有一个2分钟的保持活动超时需要被覆盖:

var host = new WebHostBuilder()
               .UseKestrel(o =>
                    {
                        o.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(30);
                    }
                )

答案 3 :(得分:3)

Program.cs

在NET Core 3.1中,使用以下实现来增加KeepAliveItemout:

    func fetchUser() {
    Database.database().reference().child("users").observe(.childAdded, with: { (snapshot) in
        
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let user = User()
            
            //will crash if your class properties don't exactly match up with firebase dictionary keys
            user.setValuesForKeys(dictionary)
            self.users.append(user)
            
            
            //this will crash because of background thread, so use dispatch async to fix
            dispatch_async(dispatch_get_main_queue)
            self.tableView.reloadData()
            print(user.name!, user.email!)

Web.Config

根据web.config的要求增加requestTimeout:

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
                webBuilder.ConfigureKestrel(options =>
                {
                    options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(15);
                });
            });

答案 4 :(得分:0)

在Visual Studio中,“解决方案资源管理器”中没有出现文件web.config。我修复了在解决方案中添加文件的问题,并更改了属性“复制到输出目录”。

答案 5 :(得分:-1)

对我来说这可行:

public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel(o => { o.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(10); });