Если вы включили ведение журнала уровня отладки и внимательно следите за журналом во время обновления браузера, вы можете увидеть, где происходит пауза при использовании testMode=propInfo
:
dbug: Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder[26]
Attempting to validate the bound parameter 'model' of type 'Q53063808.Controllers.TheModel' ...
dbug: Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder[27]
Done attempting to validate the bound parameter 'model' of type 'Q53063808.Controllers.TheModel'.
Это проверка модели связующего параметра . Проверка модели отвечает за проверку таких вещей, как атрибут проверки модели [Required]
.
Чтобы валидация поддерживала произвольные структуры модели, она по существу рекурсивно сканирует тип модели и пытается проверить каждое свойство. Поскольку PropertyInfo
- довольно большой тип, проверка всех свойств занимает некоторое время, даже если проверять нечего.
Однако проверка всегда основана на объявленном типе модели 1016 *, поэтому свойство object
не сканируется. И проверка также относится только к свойствам. Вот почему свойство PropertyInfo
является единственным случаем, когда проверка действительно требует времени. Вы также можете подтвердить это, добавив другой тип для MemberInfo
, который немного меньше, чем PropertyInfo
. Проверка будет проходить немного быстрее, чем в случае PropertyInfo
.
Вы не можете действительно выборочно отключить проверку модели (например, используя какой-либо атрибут SkipValidation
). Однако вы можете указать из связывателя модели, что проверка не должна выполняться для модели. Это делается путем установки состояния проверки для подавления проверки:
bindingContext.ValidationState.Add(model, new ValidationStateEntry { SuppressValidation = true });
bindingContext.Result = ModelBindingResult.Success(model);
Это полностью пропустит проверку модели, поэтому время также должно упасть до нуля.
Кроме того, вы также можете настроить MVC для подавления проверки для дочерних элементов, когда он обнаруживает элемент PropertyInfo
в типе вашей модели. Для этого вам нужно добавить следующую конфигурацию в ConfigureServices
вашего стартапа:
services.AddMvc(options =>
{
// suppress child validation for `PropertyInfo` members
options.ModelMetadataDetailsProviders.Add(
new SuppressChildValidationMetadataProvider(typeof(PropertyInfo)));
});