Мы знаем, что механизм просмотра Razor преобразует ViewResult
(IActionResult
) в HTML-ответ, который можно отправить пользователям. Ниже приведено изображение конвейера фильтра:
Мой вопрос заключается в том, на каком этапе включится механизм просмотра Razor и выполнит преобразование IActionResult
в HTML, сразу после завершения выполнения конечной точки или сразу после завершения выполнения фильтров ресурсов?
Что мы точно знаем, так это то, что метод 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(), вы можете поместить точки останова отладки в них обоих. Порядок вызова этих двух методов должен дать вам ответ.
Да потому что это внешняя .dll я знаю два подхода к этому. Прежде всего, если у вас установлен resharper, вы можете узнать, как отлаживать внешний исходный код с помощью resharper. Второй подход не требует установки каких-либо дополнительных инструментов. Вы можете извлечь исходный код mvc .net core mvc из github, собрать его в режиме отладки и изменить .dll, который вы сейчас используете в своем проекте, на .dll, который вы создали. Вот пример ссылка
Поскольку stackoverflow имеет ограничение на длину комментариев, я настоятельно рекомендую вам поискать в Интернете что-то вроде - как отлаживать исходный код ядра asp.net. Надеюсь, это немного поможет.
И в случае, если вы выберете второе решение для отладки, не забудьте сделать резервную копию используемых в настоящее время dll!
Большое спасибо за ваш ответ. Я не могу поставить точку останова отладки в
ExecuteResult()
, так как это внешняя сборка, доступны только метаданные. Не могли бы вы дать мне больше советов, извините, я новичок в программировании на C#