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

Избегайте aspnet_compiler, использующего метод PreApplicationStart

Итак, на одном из моих сайтов есть PreApplicationStartMethod, который должен запускаться до запуска приложения:

[assembly: PreApplicationStartMethod(typeof(ServiceStackAppHost), "Start")]

Этот метод выполняет некоторую загрузку и использует определенную конфигурацию.

Теперь я хочу скомпилировать веб-сайт как часть моего процесса автоматической сборки - поэтому я вызываю aspnet_compiler.exe, который терпит неудачу, поскольку он запускает PreApplicationStartMethod:

AfterBuild:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_compiler.exe -v temp -p C:\Projects\error ASPRUNTIME: предварительное приложение начать метод инициализации Начало по типу RedactedNameSpace.ServiceStackAppHost выбрасывает исключение из следующее сообщение об ошибке: Ошибка разрешения зависимостей, type = "..."

Как избежать aspnet_compiler.exe при вызове PreApplicationStartMethod при компиляции веб-сайта?

4b9b3361

Ответ 1

Короткий ответ заключается в том, что вы не можете предотвратить его запуск, и что это по дизайну, но вы можете решить эту проблему.

Почему методы PreApplicationStart запускаются во время aspnet_compiler.exe

Причина в том, что PreApplicationStartMethod (или WebActivator, который строится поверх него) может использоваться для вещей, которые действительно влияют компиляции, так что если вы опустили его, сайт не может компилироваться.

Чтобы дать вам пример, вы можете добавить пространства имен в компиляцию в методе PreAppStart, который затем влияет на компиляцию ваших страниц Razor.

Очевидно, что не каждый PreAppStart метод нуждается в для запуска, когда вы используете aspnet_precompiler, но мы выполняем все их в случае необходимости.

Обнаружение того, работаете ли вы в aspnet_compiler.exe

Если код там разрывается под aspnet_compiler, может потребоваться добавить условную логику в метод PreAppStart для обнаружения ситуации и пропустить запуск кода.

Вы можете посмотреть System.Web.Hosting.HostingEnvironment.InClientBuildManager свойство, чтобы определить, работает ли ваш метод PreAppStart в контексте aspnet_compiler.exe(где он будет true) или во время выполнения (где он будет false), InClientBuildManager также применяется для создания веб-сайта в VS, который использует в основном тот же путь кода, что и aspnet_compiler.exe.

Попробуйте вместо этого использовать методы PostStart

Обратите внимание, что WebActivator также поддерживает PostApplicationStartMethod, и они не будут выполняться в aspnet_compiler. Этот код работает после Application_Start, поэтому он может быть или не соответствовать вашему сценарию. Но это может быть для вас решением.

aspnet_compiler.exe Совет отладки

Непосредственно, но полезно для отладки: вы можете передать -errorstack в aspnet_compiler.exe, чтобы получить более полный стек при возникновении ошибки.

Ответ 2

PreApplicationStartMethod - это атрибут сборки для загрузки кода очень рано в процессе сборки. Компилятор должен загрузить и запустить этот код, чтобы начать процесс компиляции. PreApplicationStartMethod похож на процесс сборки, а не процесс инициализации. Поэтому вы можете попробовать ввести код в метод Application_Start в global.asax!!