Странные проблемы с производительностью (блокировка?) С ASP. NET Базовым веб-приложением - PullRequest
1 голос
/ 15 января 2020

Мы готовимся к развертыванию одного из наших первых ASP. NET базовых приложений и видим некоторые очень странные проблемы с производительностью на нашем промежуточном веб-сервере. На машинах разработки все выглядит нормально, либо на IIS Express, либо на тестовом сайте, настроенном на обычном IIS, который близко отражает конфигурацию на веб-сервере.

Код, похоже, ничего не делает необычно, но при работе на веб-сервере, кажется, время от времени просто входит в состояние фуги / блокируется. Журналы не указывают на какие-либо проблемы как таковые , но временные метки имеют очень длинные и неожиданные пробелы при работе на этом компьютере.

Приложение. NET Core 2.2, работает в процессе на IIS. Локальные машины Windows 10, сервер Windows Server 2012r2. Веб-сервер является общим компьютером, на котором настроены другие сайты, но это приложение является отдельным сайтом и отдельным пулом приложений от любого другого.

Вот фрагмент кода контроллера API, который вызывает метод в компоненте службы для аутентификации пользователя во внешней системе:

AuthenticationResult result;
try {
  _logger.LogTrace("Will attempt user authentication for source {1} {2}", source.Id, source.Name);
  result = await system.AttemptUserAuthenticationAsync(model);
  if( null == result?.ExternalKey ) {
    return UserInformationResult.Empty;
  }
}
catch( ValidationException ex ) {
  _logger.LogTrace(ex, "Validation failed for authentication submission for source {1} {2}", source.Id, source.Name);
  return ValidationProblem(ex.ModelState);
}

Вот код проверки в одной из AttemptUserAuthenticationAsync() реализаций:

var validationResults = new List<ValidationResult>();
if( String.IsNullOrWhiteSpace(credentials.Username) ) {
  validationResults.Add(new ValidationResult(_localizer["Please provide a username"], new[] { nameof(credentials.Username) }));
}
if( String.IsNullOrEmpty(credentials.Password) ) {
  validationResults.Add(new ValidationResult(_localizer["Please provide a password"], new[] { nameof(credentials.Password) }));
}
if( validationResults.Any() ) {
  _logger.LogTrace("Authentication credentials invalid; will throw ValidationException");
  throw new Models.ValidationException(validationResults);
}

Вот что log выглядит так, когда этот код выполняется на проблемном веб-сервере, с интервалом три минуты между тем, где должно быть сгенерировано исключение, и тем, где оно перехватывается в вызывающем коде. Эта конкретная проблема кажется довольно последовательной. На рабочих станциях команды разрыв в журнале здесь составляет несколько миллисекунд.

2020-01-15 10:38:26.969 -05:00 [VRB] Authentication credentials invalid; will throw ValidationException
2020-01-15 10:41:29.859 -05:00 [VRB] Validation failed for authentication submission for source "b8c28eac-09e4-4a0c-82a1-b1b788c04467" Test Source

Я с некоторой растерянностью, где go с этой проблемой. Есть ли настройки, которые мы должны посмотреть? Другие журналы? Что может быть причиной того, что это приложение блокируется таким образом?

1 Ответ

0 голосов
/ 15 января 2020

Обдумайте обработку длительных запросов с помощью фоновых служб или вне процесса с помощью функции Azure. Завершение работы вне процесса особенно полезно для задач с интенсивным использованием процессора. Используйте параметры связи в реальном времени, такие как SignalR, для асинхронной связи с клиентами.

...