Как подключить веб-страницы динамически в ASP .NET (и обновить плагин)? - PullRequest
6 голосов
/ 26 сентября 2011

Для обычных сборок можно использовать MEF для динамической загрузки сборок.Если для этих сборок требуется оперативное обновление, рекомендуется использовать домены приложений для размещения динамических сборок (потенциально можно использовать Managed Add-in Framework (MAF)).Когда требуется обновление, домен приложения останавливается, сборки обновляются, а домен приложения перезагружается.

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

MEF не поддерживает изоляцию AppDomain, поэтому, к сожалению, даже во время перекомпоновки те ранее загруженные сборки все еще загружаются в основное веб-приложение AppDomain.Есть две вещи, с которыми вам нужно бороться в ASP.NET:

  1. Любые изменения в физических файлах (например, .aspx, .cshtml и т. Д.) Или любые изменения в файлах конфигурации (.config) или любые изменения в каталоге \ bin приведут к перезапуску приложения.Это связано с двумя вещами: мониторингом файлов на страницах / конфигах и мониторингом файлов в каталоге \ bin (потому что по умолчанию ASP.NET использует теневое копирование файлов - это рекомендуется).

  2. Чтобы использовать MEF в другом домене приложений, потребовалось бы ужасное количество междоменных связей, либо через сериализацию, либо MarshalByRef, что я просто не думаю, что когда-либо будет чистой реализацией.Не уверен, как бы вы вызвали BuildProvider экземпляров, используемых для динамической компиляции ваших страниц в другом домене приложений.

Мне интересно, думаете ли вы об этом слишком много.Поскольку IIS6, HTTP.SYS управлял маршрутизацией входящих запросов на соответствующий веб-сайт, это обрабатывается на уровне ядра.Даже если основное приложение действительно перезапустится (что может быть по разным причинам), никакие запросы не будут отброшены, оно просто поставит в очередь ожидание нового рабочего процесса перед передачей запроса.Конечно, с точки зрения пользователя, они могут заметить некоторое время простоя, ожидающее перезапуска нового приложения, но реально, как часто вы собираетесь вносить эти изменения?

Многие дизайны приложений страдают отнад-инжиниринг.Возможно, вы захотите разработать для каждого сценария, но реально проще поддерживать систему, которая является простой, но расширяемой.По моему мнению, желание сделать то, что вы указали, было бы классифицировано как чрезмерное проектирование.Сохраняйте это простым.

0 голосов
/ 04 октября 2011

Использование сеанса «StateServer» сохранит вашу аутентификацию между циклами пула приложений (вызванными обновлениями файлов).

Для вашего актуального вопроса:

  • Создайте папку вне вашего сайта, к которой у вашего пула приложений есть доступ.
  • Поместите туда свои новые сборки
  • Иметь задачу / поток / веб-службу, которая считывает папку и загружает сборки в текущий домен приложения
    • Более новая версия сборки должна иметь приоритет при создании экземпляра

Я полагаю, ваш вопрос говорит, что этот метод не работает? Какую ошибку вы получаете ...

...