Как развернуть управляемый HTTP-модуль на всем сайте?

Я разрабатываю управляемый HTTP-модуль, который будет перехватывать запросы и ответы от IIS 7. Перехваченные сообщения будут изменены на основе набора бизнес-правил с помощью специального фильтра. Бизнес-правила будут храниться в файле конфигурации.

Сообщения должны быть перехвачены на всем веб-сайте. Сюда входят любые приложения или виртуальные каталоги, которые существуют как дочерние элементы веб-сайта. Моей первой попыткой было установить сборку HTTP-модуля в каталог bin нужного веб-сайта (например, C:\inetpub\wwwroot\bin для веб-сайта по умолчанию).

После установки я изменяю элемент <compilation> файла web.config веб-сайта, чтобы он ссылался на сборку, например так:

<compilation debug="false">
    <assemblies>
        <add assembly="Company.Product.Module, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx" />
    </assemblies>
</compilation>

Я также изменил элемент <modules> файла web.config веб-сайта.

<system.webServer>
    <modules>
        <add name="MyModule" type="Company.Product.Module.MyModule" />
    </modules>
</system.webServer>

Это хорошо работает для большей части содержимого веб-сайта. Однако, если на веб-сайте настроено приложение (например, /wwwroot/MyApplication), я получаю следующую ошибку при переходе к любому ресурсу в этом веб-приложении:

Не удалось загрузить файл или сборку "Company.Product.Module, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx" или одну из ее зависимостей. Система не может найти указанный файл.

Я знаю два способа обойти это:

Вариант 1:

Скопируйте сборку модуля HTTP и все зависимые сборки в каталог bin каждого приложения. Я считаю, что мне также нужно будет дублировать информацию о конфигурации из родительского каталога. Это может стать кошмаром для управления, поскольку на веб-сайт добавляется все больше и больше приложений.

Вариант 2:

Установите сборку модуля HTTP и все зависимые сборки в GAC. Кажется, это работает довольно хорошо и позволяет избежать больших накладных расходов на управление, однако где находится информация о конфигурации? Если в файле web.config веб-сайта эта информация наследуется во всех дочерних приложениях?

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


person Ryan Taylor    schedule 05.11.2010    source источник


Ответы (3)


Разверните модуль

Create a new directory under C:\Inetpub\Wwwroot named Module.
Create a subdirectory named Bin in the newly created Module directory. The resultant path is C:\Inetpub\Wwwroot\Module\Bin.
Copy MyModule.dll from your project's Bin\Debug directory to the C:\Inetpub\Wwwroot\Module\Bin directory.
Follow these steps to mark the new Module directory as a Web application:
    Open Internet Services Manager.
    Right-click the Module directory, and then click Properties.
    On the Directory tab, click Create.
    Click OK to close the Module Properties dialog box.

вернуться к началу Настройка системы

In the C:\Inetpub\Wwwroot\Module directory, create a new file named Web.config.
Paste the following text into Web.config:


<configuration>
   <system.web>
      <httpModules>
         <add name="MyModule" type="MyModule.SyncModule, MyModule" />
      </httpModules>
   </system.web>
</configuration>

вернуться к началу Проверка модуля

In the C:\Inetpub\Wwwroot\Module directory, create a new .aspx file named Test.aspx.
Paste the following text into Test.aspx:


<%@Page Language="VB"%>
<% Response.Write("Hello from Test.aspx.<br>") %>


In the C:\Inetpub\Wwwroot\Module directory, create a Global.asax file.
Paste the following code in Global.asax:


<%@ Import Namespace="MyModule" %>

<script language="VB" runat=server >
Public Sub MyModule_OnMyEvent(src As Object, e As EventArgs)    
  Context.Response.Write("Hello from MyModule_OnMyEvent called in Global.asax.<br>")
End Sub
</script>


Request the Test.aspx page. You should see the following lines of text:


Hello from OnBeginRequest in custom module.
Hello from MyModule_OnMyEvent called in Global.asax.
Hello from Test.aspx.
person Arvind    schedule 07.04.2016
comment
вы используете перехватчик для изменения http-запроса и ответа. Запрос на изменение заголовка для передачи данных авторизации, таких как токен. и ответ для вас обрабатывает ошибку ответа. - person Arvind; 18.10.2019
comment
внедрить перехватчик blog.angularindepth.com/ - person Arvind; 31.10.2019

Пока вы на правильном пути, можете ли вы поместить свои конфиги в machine.config? чтобы избежать сохранения нескольких конфигов?

person Community    schedule 05.11.2010
comment
На правильном пути вы имеете в виду установку в GAC или установку в нескольких каталогах bin? - person Ryan Taylor; 06.11.2010
comment
Я не уверен, что мне будет разрешено вносить изменения в файл machine.config. Кроме того, я хотел бы иметь возможность поддерживать разные конфигурации для разных веб-сайтов. Поэтому я думаю, что идеальное место для этой информации — web.config. Мне нужно будет выяснить, правильно ли наследуются мои параметры конфигурации во всех приложениях на сайте. - person Ryan Taylor; 08.11.2010

Вы можете использовать GAC для этой dll, но это нарушит вашу историю развертывания x-copy, если она у вас уже есть. Если с вами все в порядке, вы можете позже добавить этот модуль в конфигурацию в applicationHost.config в тегах местоположения: <location path="MySite">, <location path="MySite/MyApp">

person kateroh    schedule 06.11.2010
comment
Я не уверен, что мне будет разрешено вносить изменения в файл applicationHost.config. Кроме того, я хотел бы иметь возможность поддерживать разные конфигурации для разных веб-сайтов. Поэтому я думаю, что идеальное место для этой информации — web.config. Мне нужно будет выяснить, правильно ли наследуются мои параметры конфигурации во всех приложениях на сайте. - person Ryan Taylor; 08.11.2010