Отслеживание динамической перекомпиляции проекта веб-сайта ASP.NET

Для оценки производительности в качестве показателя производительности я хотел бы вести статистику того, как часто проект веб-сайта asp.net компилируется в код MSIL. Как описано в этом сообщении, Когда проект веб-сайта ASP.NET перекомпилируется?, есть несколько вещей, которые могут вызвать повторную компиляцию.

Меня не интересуют перезапуски пула приложений, кроме случаев, когда они вызывают повторную компиляцию.

Одна из возможностей - отслеживать временную папку для компиляций. Если я удалю содержимое% FrameworkInstallLocation% \ Temporary ASP.NET Files, я могу увидеть, что новые файлы с отметками времени создаются из компиляции во время выполнения, когда я обращаюсь к веб-сайту. Однако я не понимаю структуру подкаталогов.

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


person pierce.jason    schedule 30.03.2015    source источник
comment
Не могли бы вы описать, чем вы хотите заниматься? Кто должен это обнаружить? сам сайт? или внешнее приложение?   -  person Cyril Durand    schedule 31.03.2015
comment
В любом случае было бы хорошо. Если есть метод или процесс, которые можно использовать на веб-сайте, я могу записать в файл журнала. Или, если бы внешнее приложение могло обнаружить или зарегистрировать перекомпиляцию, это тоже было бы приемлемо.   -  person pierce.jason    schedule 31.03.2015
comment
Еще один вопрос. Вы хотите знать, когда приложение перезагружается или только когда приложение было перекомпилировано? Что вы имеете в виду под перекомпиляцией? Один из возможных способов сделать что-то - прослушать событие AppDomain.ProcessExit, а затем посмотреть HostingEnvironment.ShutdownReason   -  person Cyril Durand    schedule 31.03.2015


Ответы (1)


Вы можете создать собственный IAssemblyPostProcessor и зарегистрируйте его с помощью _ 2_ в разделе компиляция вашего файла web.config.

Пример :

public class LoggingPostProcessor : IAssemblyPostProcessor
{
    public void PostProcessAssembly(String path)
    {
        Trace.Write(String.Format("Processing assembly : {0}", path));
    }

    public void Dispose()
    { }
}

И зарегистрируйте его в своем web.config вот так:

<system.web>
    <!-- ... -->
    <compilation debug="true" targetFramework="4.5" 
                 assemblyPostProcessorType="ns.LoggingPostProcessor, assemblyName" />
</system.web>

Но ASP.net не будет компилировать приложение в единую сборку, IAssemblyPostProcessor будет вызываться каждый раз, когда сборка компилируется ASP.net.

Если вы хотите перехватить только компиляцию какого-либо ресурса, вы можете создать собственный _ 6_, но для этого может потребоваться дополнительная работа.

person Cyril Durand    schedule 31.03.2015
comment
Поскольку для этого требуется указать имя сборки, правильно ли, что это будет работать только в веб-приложении, а не в проектах веб-сайтов? Я не могу найти никакой информации о том, как заполнить assemblyName для проектов веб-сайтов, поскольку каждая отдельная страница в проекте будет получать новое имя сборки при каждой компиляции страницы. - person pierce.jason; 02.04.2015
comment
Кроме того, можем ли мы получить имя исходного файла в PostProcessAssembly или только имя выходного файла? Это поможет лучше определить, что компилируется. - person pierce.jason; 02.04.2015
comment
Вы можете использовать проект библиотеки классов для размещения своего постпроцессора, а затем ссылаться на этот проект на своем веб-сайте или зарегистрировать эту сборку в GAC. В этом случае веб-сайт не обязательно должен ссылаться на ваш проект. - person Cyril Durand; 03.04.2015
comment
Компиляция ASP.net довольно сложна, в одну сборку будет скомпилировано более 1 файла. Используя это решение, невозможно получить исходный файл сборки. Если вам нужна эта информация, вы можете использовать Mono.Cecil для анализа сборки или использовать настраиваемый BuildProvider, использование BuildProvider потребует дополнительных работ. - person Cyril Durand; 03.04.2015
comment
Это был бы хороший ответ для веб-приложения ASP.NET. Однако это не работает для веб-сайта ASP.NET, потому что нет способа узнать имя сборки, чтобы поместить в assemblyPostProcessorType = ns.LoggingPostProcessor, assemblyName. В проекте веб-приложения ASP.NET вы можете выбрать проект в обозревателе решений и нажать Alt + Enter, чтобы открыть страницы свойств, и имя сборки будет показано в разделе «Приложение». То же самое и в проекте веб-сайта ASP.NET, здесь нет раздела «Приложение», а в других разделах ничего не говорится о сборке. - person pierce.jason; 13.04.2015
comment
Если тип указан на веб-сайте, ASP.net может попытаться разрешить assemblyName самостоятельно. Вы пробовали не указывать assemblyName? Кстати, сборка, содержащая LoggingPostProcessor, может быть внешней по отношению к вашему веб-сайту и находиться в автономной сборке. Если вы не можете добавить ссылки на свой веб-сайт ASP.net (или скопировать файл .dll в папку bin), вы можете зарегистрировать его в GAC. - person Cyril Durand; 13.04.2015