Таймауты с длительным запуском ASP.NET MVC Core Controller Метод HTTPPost

Я использую вызов ajax на страницах просмотра ASP.NET Core MVC

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');

Метод столбца контроллера

    [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 минут

введите описание изображения здесь

Я понимаю, что это связано с истечением времени ожидания

в предыдущих версиях ASP.NET MVC вы, очевидно, можете увеличить тайм-аут в своем действии контроллера asp.net.

HttpContext.Current.Server.ScriptTimeout = 90000;

Однако этого не существует в ASP.NET Core

Я хочу увеличить тайм-аут для отладки и развертывания для конкретного контроллера asp.net.

Для производства я могу установить его глобально в web.config, добавив requestTimeout в существующий тег httpPlatform. например в течение 10 минут

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

Был задан аналогичный вопрос, но ответ , используя CancellationToken, но, читая его, похоже, он не может помочь мне с таймаутами.

  • Как установить таймауты в режиме отладки Visual Studio 2015, как я могу это сделать, когда я его развертываю?
  • Есть ли настройка тайм-аута контроллера, как в ASP.NET 4?

Ответ 1

Установка значения RequestTimeout="00:20:00" в теге aspNetCore и развертывание сайта приведут к тому, что он не истечет.

Проблема теперь возникает только при запуске из режима отладки Visual Studio, но не в режиме выпуска.

Обратите внимание: в ASP.NET RTM тег httpPlatform был заменен на aspNetCore в 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>

Ответ 2

Но в .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();
}

Ответ 3

В моем случае мы все еще имели 502 тайм-аут ошибки в 2 минуты, даже после обновления параметра requestTimeout. Оказалось, что пустельга имеет 2-минутный тайм-аут, который необходимо переопределить:

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

Ответ 4

По какой-то причине я по-прежнему получаю сообщение об ошибке Bad Gateway даже после выполнения приведенных выше рекомендаций. Любая помощь будет оценена.

Получение 502, ошибка BadGateway, часть основного веб-API Service Fabric ASP.Net.

Один из методов Put, у меня есть часть контроллера, выполняется более 10 минут, но я получаю ответ 502/BadGateway через 2 минуты. Я сделал следующие биты.

Часть тайм-аута KestrelCommunicationListener возвращает новый WebHostBuilder().UseKestrel(o => {o.Limits.KeepAliveTimeout = TimeSpan.FromHours(1);}).ConfigureServices(services => services.AddSingleton(serviceContext)).Use. GetCurrentDirectory()).UseStartup()
.UseServiceFabricIntegration (слушатель, ServiceFabricIntegrationOptions.None).UseUrls(url).Build();

Также установите время ожидания в web.config.

Также установите часть времени ожидания клиента при инициализации HttpClient.

Пожалуйста, дайте мне знать, как я могу решить эту проблему

Ответ 5

В Visual Studio не отображается файл web.config в обозревателе решений. Я исправил добавление файла в Solution и изменил свойство "Copy to output Directory".

Ответ 6

для меня это сработало:

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); });