Как заставить загрузку определенной сборки в каждый домен приложения приложения MVC 2? - PullRequest
0 голосов
/ 12 октября 2011

У меня есть немного слабосвязанный код, который зависит от конкретной сборки, загружаемой в текущий домен приложения:

Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().Where(
    candidateAssembly => candidateAssembly.FullName.StartsWith("Microsoft.WindowsAzure.ServiceRuntime")).SingleOrDefault();

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

Мне нужно заставить IIS (или что-то еще) загрузить этусборка в домен приложения до запуска моего кода.Я пытался написать реализацию IHttpModule и перечислить ее в web.config, но это не помогло.

До сих пор я пытался добавить сборку под <system.web><compilation><assemblies> и похоже, что она работает, ноЯ не уверен, надежно ли это.

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

1 Ответ

0 голосов
/ 18 февраля 2013

Это неправильный путь, и это может привести к серьезным ошибкам по времени.

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

Теперь есть автоматическая перезапуск приложения IIS каждые 29 часов. Когда пул перезапускается, он запускает новый рабочий процесс, и этот процесс начинает размещать полезную нагрузку сайта. Важно то, что представления ASP.NET не меняются во время этого процесса, поэтому их не нужно перекомпилировать, поэтому процесс компиляции не вызывается, и поэтому сборки, перечисленные в <system.web><compilation><assemblies>, не принудительно загружаются.

Таким образом, вещь выглядит работающей, пока не пройдет 29 часов, а затем она просто развалится.

Требуется лучшее решение. Что-то вроде настройки в <appSettings>, указывающей, должна ли быть доступна среда выполнения Azure. Если этот параметр задан, код может выполнить первый вызов кода внутри сборок среды выполнения Azure, и это заставит их загружаться. если настройка не установлена, он не пытается вызвать этот код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...