Модуль, зарегистрированный в IIS7, не работает - PullRequest
8 голосов
/ 09 февраля 2012

Я создал небольшую библиотеку классов с модулем HttpModule, который использует фильтр для добавления html на каждую запрашиваемую страницу, обслуживаемую IIS7.

Сначала я протестировал ее, зарегистрировав модуль в web.config.на тестовом веб-сайте, и он работает как следует, но только в этом приложении.

Я сгенерировал dll и создал сборку со строгим именем.

Мне нужно как-то добавить этосборка как модуль в IIS на уровне сервера, чтобы он работал для всех запросов, для всех приложений, а также для содержимого, не относящегося к ASP.NET.

До сих пор я пытался добавить .dllкак родной модуль.Это не работаетЭто в списке нативных модулей, но это не работает.

Я установил .dll в GAC.

Читая дальше, кажется, мне нужно добавить сборку в качестве управляемого модуля, а затем выбрать его в раскрывающемся списке в разделе «Добавить управляемый».модуль "в IIS.

Для этого я попытался использовать инструмент командной строки appcmd, написав:" добавить модуль / имя: строка / тип: строка / предварительное условие: строка "

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

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

Смысл в том, чтобы не регистрировать модуль в каждом файле web.config приложений.

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 20 февраля 2012

Поработав немного, мне удалось заставить его работать.

Установка сборки в .net 4.0 GAC не сделает ее доступной в раскрывающемся списке типов в диспетчере IIS в разделе «Добавить управляемый модуль».

Что мне нужно было сделать:

Создайте библиотеку классов .net 4.0 и скомпилируйте ее как сборку со строгим именем

Установите его в .NET 4.0 GAC с помощью gacutil, расположенного в папке Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin \ NETFX 4.0 Tools

(или сделать компиляцию Visual Studio, подписать и установить сборку автоматически)

Добавьте эту строку под <modules> в applicationHost.config: (это должно быть сделано вручную, это не может быть сделано в менеджере)

<add name="MyName" type="NameSpace.ClassName" preCondition="managedHandler,runtimeVersionv4.0" />

Это заставляет модуль работать по запросам к сайтам, разработанным в .net 4.

Однако представляется, что запросы к сайтам, разработанным в версиях до .net 4, не могут использовать модуль, созданный в .net 4.0. Поэтому, если вы делаете запросы на страницы на сайте, созданном в .net 3.5, модуль не будет работать.

Еще одно наблюдение:

После добавления модуля в IIS через файл applicationHost.config, если вы откроете диспетчер IIS, выделите имя сервера в соединениях и щелкните модули. В списке вы увидите модуль .net 4.

Дважды щелкните по нему, и вы увидите настройки для него. Вы увидите, что установлен флажок «Вызывать только запросы к приложениям ASP.NET или управляемым обработчикам». Если вы снимите флажок и нажмете «ОК», вы получите сообщение о том, что сборка не была установлена ​​в GAC.

Но разве я не просто успешно установил его в .net 4 GAC? И разве я не видел, как модуль запускается в запросе?

Если вы все равно продолжите и сохраните настройки, вы получите ошибку времени выполнения, и если вы загляните в applicationHost.config, вы увидите, что ранее добавленные вами настройки модуля изменились.

Но что, если я хочу «вызывать только запросы к приложениям ASP.NET или управляемым обработчикам?»

5 голосов
/ 15 февраля 2012

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

  1. Напишите код, который вы хотите запускать для каждого запроса, в виде библиотеки классов .net 3.5.
  2. Скомпилируйте его как сильныйсборка с именем.
  3. Установите сборку в GAC.
  4. В диспетчере IIS7 выберите имя сервера в соединениях, нажмите «Модули», нажмите «Добавить управляемый модуль» в действиях.
  5. введите имя модуля и выберите только что установленную сборку в раскрывающемся списке типов.
  6. Убедитесь, что на сайте используется пул приложений, работающий в интегрированном режиме.

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

Однако остается один вопрос!

В настоящее время существует два GAC: Microsoft.NET для .net 4.0 и Windows GAC для pre .net 4.0.Поскольку я создал свою сборку в .net 3.5, она была установлена ​​в Windows GAC, и поэтому она была доступна в раскрывающемся списке типов в диспетчере IIS.

Когда я создавал свою сборку в .net 4.0, она была установлена ​​вMicrosoft.NET GAC, и, как следствие, он НЕ был доступен в раскрывающемся списке типов в диспетчере IIS.

Вопрос: как добавить сборку .net 4.0 в качестве управляемого модуля в IIS7, ион работает как мой управляемый модуль 3.5?

Это должно быть возможно, верно?

2 голосов
/ 10 февраля 2012

Вы должны добавить модуль на уровне сервера. Вы можете сделать это из командной строки:

appcmd add module /name:string /type:string /preCondition:string

Чтобы получить справку командной строки, выполните: appcmd add module /?
Короче, это должно выглядеть так:

appcmd add module /name:AnyNameOfYourChoice /type:YourClassNameSpace.YourClassName

/preContition параметр является необязательным.

Подробнее здесь .

OR

Сделайте это из IIS Manager, перейдя на узел сервера -> Модули -> Добавить управляемый модуль
Подробнее здесь . (внизу страницы)

...