Некоторые сообщения , а также сообщения в блоге указывают на наличие проблем с предварительной компиляцией в проектах Razor lib. Но я вспомнил из документации .NET Core , что MvcRazorCompileOnPublish
устарела и удалена в 3.0. Это отключает новый Razor SDK. Это кажется не надежным решением для меня.
Итак, я создал пустой проект Razor и сравнил файл csproj с моим проектом lib. Он показывает, что он ссылается на Microsoft.NET.Sdk.Razor
вместо Microsoft.NET.Sdk
из моего проекта (созданного как ядро .NET базовая библиотека классов ядра .NET). После изменения SDK моя папка Debug
также содержит файл Assets.Views.dll
, который указывает на предварительную компиляцию.
Он также добавлен NuGet, что можно легко проверить, открыв файл .nupkg с помощью 7zip. Папка lib/netcoreapp2.1
теперь также содержит .Views.dll
.
Это решение увеличивает время обработки первого запроса с ~ 3 секунд до 1,1 секунды. Намного быстрее, но все же намного медленнее по сравнению с 300 мс без внешней DLL. Я рассматриваю это как часть решения, но, похоже, существуют дополнительные узкие места, которые замедляют первый запрос. Я открыт для дополнительных идей, как улучшить эту последнюю задержку.
В настоящее время я включаю только четыре частичных представления из Razor DLL. Один из них имеет 108 строк HTML-кода с небольшим количеством динамической логики и два встроенных сервиса. Другие намного меньше и еще не содержат много динамической логики. Я также старался не включать в себя более частичное представление, без заметной разницы.
Не могу поверить, что включение четырех относительно небольших частичных представлений из внешней библиотеки Razor задерживает первый запрос на 800 мс. Это не тот случай, когда представление находится локально в одном проекте.
Предварительная загрузка не является проблемой
Найдена запись в блоге Рика Штрола с фрагментом, в котором перечислены все загруженные сборки:
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in assemblies) {
Console.WriteLine(assembly.GetName());
}
Я запустил это в ConfigureService
моего приложения, которое использует Razor DLL. Он показывает обе сборки из моего DLL-файла Razor (Assets и Assets.Views). Я думаю, что это так, потому что я извлекаю информацию о сборке, чтобы передать ее как EmbeddedFileProvider
в RazorViewEngineOptions
. Однако это объясняет, почему мои попытки предварительной загрузки никак не влияют на время генерации страницы.