Подтвердить что ты не робот

Компиляция на месте с использованием ClientBuildManager.CompileFile

Я работаю над веб-сайтом, который я бы хотел использовать для компиляции на месте, чтобы сделать первый клик быстрее. Я хотел бы использовать метод ClientBuildManager. CompileFile, чтобы сделать компиляцию на месте так что я могу контролировать процесс компиляции. По целому ряду причин это идеальный способ скомпилировать этот сайт.

Почему IIS создается в другом подкаталоге в разделе "Временные файлы ASP.NET" ?

Когда я скомпилирую файл сайта с помощью ClientBuildManager. CompileFile в exe для этой цели, выход переходит в подкаталог в разделе "Временные файлы ASP.NET" . Однако, когда сайт попадает позже, IIS перестраивает элементы управления под другим подкаталогом в разделе "Временные файлы ASP.NET" , что делает предыдущую компиляцию на месте бесполезной.

Примечание. Сборки, созданные во время компиляции на месте в разделе "Временные файлы ASP.NET" , остаются в силе (все еще существуют).

Примечание. Как папка сборок сборки на месте, так и папка сгенерированных сборок IIS находятся под одним и тем же файлом "Временные файлы ASP.NET" .

Пример:

  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Временные файлы ASP.NET\root\2ba591b9\[ имя папки компиляции на месте]
  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Временные файлы ASP.NET\root\2ba591b9\[ Созданные IIS сборки для веб-сайта]\

ClientBuildManager. CompileFile Конфигурация

var buildParameter = new ClientBuildManagerParameter
   {
      PrecompilationFlags = PrecompilationFlags.Default,
   };
var clientBuildManager = new ClientBuildManager(
   RootVirtualPath, RootPhysicalPath, null, buildParameter);
...
clientBuildManager.CompileFile(relativeVirtualPath, callback);

Где RootVirtualPath просто "для веб-сайта по умолчанию. RootPhysicalPath указывает на местоположение на диске веб-сайта. relativeVirtualPath имеет вид" ~/myFile.aspx". Обратный вызов используется для отслеживания прогресса.

4b9b3361

Ответ 1

Я думаю, что то, что вы видите, фактически не связано с использованием CompileFile vs PrecompileApplication. т.е. если вы должны сделать то же самое, но вызвать PrecompileApplication(), вы все равно получите несоответствие папки.

Обратите внимание, что технически вы не создаете объект CBM правильно. Правильный способ его вызова - полагаться на информацию IIS для поиска файлов. Для этого:

  • Передайте что-то вроде /LM/W3SVC/7/ROOT/ для appVirtualDir
  • Передайте null для appPhysicalSourceDir

Обратите внимание, что "7" - всего лишь пример. Чтобы получить правильный номер:

  • Запустить inetmgr
  • Перейдите к дополнительным настройкам для сайта
  • Найдите идентификатор сайта. То, что вы хотите в /LM/W3SVC/ID/ROOT/

Я объясняю это для записи, потому что, к сожалению, мне не удалось заставить папки соответствовать даже таким образом. Возможно, этот сценарий просто разбит в ASP.NET(он работает!).

Альтернативная возможность - сделать это на стороне сервера. например.

  • укажите страницу на своем сайте, которую вы будете использовать для запуска выборочной предварительной компиляции.
  • В этом случае вызовите BuildManager.GetCompiledType("~/myfile.aspx") и аналогичные вызовы для каждой страницы (или пользовательского элемента управления и т.д.), которые вы хотите прекомпилировать.
  • Если вы хотите запустить свою предварительную компиляцию, просто спросите, что страница

Конечно, есть и низкотехнологичная альтернатива просто запрашивать страницы, которые вы хотите скомпилировать заранее, чтобы разогреть ваш сайт.

Ответ 2

Сэм, ответ - это ответ между Дэвидом Эббо и вашим исходным кодом.

var buildParameter = new ClientBuildManagerParameter
   {
      PrecompilationFlags = PrecompilationFlags.Default,
   };
var clientBuildManager = new ClientBuildManager(
   RootVirtualPath, RootPhysicalPath, null, buildParameter);
...
clientBuildManager.CompileFile(relativeVirtualPath, callback);

Если вы сделаете то, что сказал Дэвид Эббо, и используйте это для RootVirtualPath при построении ClientBuildManager:

/LM/W3SVC/7/ROOT/

вам необходимо передать значение null для RootPhysicalPath.

Это должно избавиться от остальных проблем, и оно должно быть создано в том же каталоге, который ищет IIS.