.Net Core api длительный запрос

У меня есть веб-приложение, вызывающее .Net Core API для создания PDF-документов. Я делаю кучу преобразования HTML в pdf, поэтому для завершения документа на 200 страниц требуется время. У меня он работает в моем локальном, но не в моем AppService. Сначала я получал: «В указанном приложении CGI возникла ошибка, и сервер прервал процесс». если бы я просмотрел более 100 страниц (небольшие наборы страниц работают).

Код, вызывающий мой api:

var httpClient = new HttpClient();
HttpContent content = new StringContent(JsonConvert.SerializeObject(pdfRecipeDto), Encoding.UTF8, "application/json");
httpClient.Timeout = System.TimeSpan.FromMinutes(30);
var pdfFileUrl = httpClient.PostAsync("http://yada-yada.azurewebsites.net/api/pdf/Generate", content)
                 .GetAwaiter()
                 .GetResult()
                 .Content.ReadAsStringAsync().Result; // yes i know this is gross

Я нашел этот пост и другие, которые сказали simular. попробовал первый ответ, но после ручного изменения моего web.config в Kudu (bc, я не знаю, как установить его в моем проекте)

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

requestTimeout = "00:20:00" является важной частью.

Но я получаю «500 - время запроса истекло. Веб-сервер не ответил в течение указанного времени».

я также пробовал добавить .UseKestrel(...) к моему program.cs

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

Но это, похоже, ничего не дало.


person Mexicoder    schedule 24.07.2018    source источник
comment
Почему вы не используете async / await?   -  person maccettura    schedule 24.07.2018
comment
Потому что оригинальные разработчики все равно не использовали его в этом веб-приложении (поверьте, я не фанат). Мой план состоит в том, чтобы представить его после того, как я получу это доказательство концепции.   -  person Mexicoder    schedule 24.07.2018
comment
Вы используете комбинацию с IIS в качестве обратного прокси? Если да, проверьте здесь, чтобы настроить время ожидания запроса IIS.   -  person pfx    schedule 24.07.2018
comment
Я так не думаю, но не уверен. как мне проверить?   -  person Mexicoder    schedule 24.07.2018


Ответы (2)


Да, в Azure Load Balancer по умолчанию установлен тайм-аут простоя, равный примерно четырем минутам. Это задокументировано в разделе часто задаваемых вопросов: https://docs.microsoft.com/en-us/azure/app-service/app-service.-web-availability-performance-application-issues-faq#why-does-my-request-time-out-after-230-seconds

В: Почему время ожидания моего запроса истекает через 230 секунд?

Балансировщик нагрузки Azure имеет значение тайм-аута простоя по умолчанию, равное четырем минутам. Обычно это разумный предел времени ответа на веб-запрос. Если вашему веб-приложению требуется фоновая обработка, мы рекомендуем использовать веб-задания Azure. Веб-приложение Azure может вызывать веб-задания и получать уведомления о завершении фоновой обработки. Вы можете выбрать один из нескольких методов использования веб-заданий, включая очереди и триггеры. WebJobs предназначен для фоновой обработки. В веб-задании вы можете выполнять столько фоновой обработки, сколько хотите. Вы можете использовать веб-задание для своей задачи и посмотреть, как это пойдет.

Кроме того, все веб-приложения Azure (а также мобильные приложения / службы, веб-задания и функции) работают в безопасной среде, называемой песочницей. Каждое приложение запускается в собственной песочнице, изолируя его выполнение от других экземпляров на том же компьютере, а также обеспечивая дополнительную степень безопасности и конфиденциальности, которые в противном случае были бы недоступны. Оформить заказ на странице GitHub https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#unsupported-frameworks, в котором перечислены поддерживаемые и неподдерживаемые генераторы PDF в Службе приложений Azure.

person AjayKumar-MSFT    schedule 28.07.2018

Итак, у службы приложений Azure есть жестко запрограммированное правило 230 секунд для запросов. даже если вы вносите изменения в web.config и / или startup.cs.

Я нашел ответ здесь: https://stackoverflow.com/a/38676086/5919289 И https://social.msdn.microsoft.com/Forums/en-US/17305ddc-07b2-436c-881b-286d1744c98f/503-errors-with-large-pdf-file?forum=windowsazurewebsitespreview

person Mexicoder    schedule 27.07.2018