Когда механизм просмотра Razor преобразует IActionResult в HTML?

Мы знаем, что механизм просмотра Razor преобразует ViewResult(IActionResult) в HTML-ответ, который можно отправить пользователям. Ниже приведено изображение конвейера фильтра:

Мой вопрос заключается в том, на каком этапе включится механизм просмотра Razor и выполнит преобразование IActionResult в HTML, сразу после завершения выполнения конечной точки или сразу после завершения выполнения фильтров ресурсов?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
239
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что мы точно знаем, так это то, что метод ExecuteResult класса ViewResult вызывает механизм просмотра.

public void ExecuteResult(ControllerContext context)
{
  if (string.IsNullOrEmpty(this.ViewName))
     ViewName = context.RouteData.GetRequiredString("action");
  var viewEngineResult = (ViewEngineResult) null;
  if (View == null)
  {
      viewEngineResult = this.FindView(context);
      View = viewEngineResult.View;
  }
  var output = context.HttpContext.Response.Output;
  View.Render(new ViewContext(context, this.View, this.ViewData, this.TempData, output), output);
  if (viewEngineResult == null)
     return;
  viewEngineResult.ViewEngine.ReleaseView(context, this.View);
}

Итак, из приведенного выше кода я предполагаю, что часть рендеринга HTML происходит внутри этого метода. Также мы знаем, что у IResourceFilter есть два метода (асинхронная версия IAsyncResultFilter):

void OnResourceExecuting(ResourceExecutingContext context)
void OnResourceExecuted(ResourceExecutedContext context)

Первый метод OnResourceExecuting выполняется прямо перед вызовом нашей конечной точки API.

[SimpleResourceFilter]
        public IActionResult Index()
        {
            return View();
        }

И мы можем утверждать, что ExecuteResult будет вызываться после OnResourceExecuting. Чтобы проверить, какой метод будет вызываться первым, OnResourceExecuted() или ExecuteResult(), вы можете поместить точки останова отладки в них обоих. Порядок вызова этих двух методов должен дать вам ответ.

Большое спасибо за ваш ответ. Я не могу поставить точку останова отладки в ExecuteResult(), так как это внешняя сборка, доступны только метаданные. Не могли бы вы дать мне больше советов, извините, я новичок в программировании на C#

user9623401 10.12.2020 14:59

Да потому что это внешняя .dll я знаю два подхода к этому. Прежде всего, если у вас установлен resharper, вы можете узнать, как отлаживать внешний исходный код с помощью resharper. Второй подход не требует установки каких-либо дополнительных инструментов. Вы можете извлечь исходный код mvc .net core mvc из github, собрать его в режиме отладки и изменить .dll, который вы сейчас используете в своем проекте, на .dll, который вы создали. Вот пример ссылка

Omelian Levkovych 10.12.2020 15:56

Поскольку stackoverflow имеет ограничение на длину комментариев, я настоятельно рекомендую вам поискать в Интернете что-то вроде - как отлаживать исходный код ядра asp.net. Надеюсь, это немного поможет.

Omelian Levkovych 10.12.2020 15:57

И в случае, если вы выберете второе решение для отладки, не забудьте сделать резервную копию используемых в настоящее время dll!

Omelian Levkovych 10.12.2020 16:00

Другие вопросы по теме