Регистрация обработчика http только для определенного файла / папки ИЛИ программная регистрация обработчика http - PullRequest
1 голос
/ 01 августа 2011

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

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

Вот ошибка, которую я получаю enter image description here

Вот вещи, которые я пробовал, которые, я думал, сработают.

Сначала я подумал, что добавление элемента местоположения в файл веб-конфигурации будет работать, но не стоит (конечно), он не регистрирует обработчик http. И это выдает ошибку.

    <location path="activityreport.aspx">
    <system.web>
        <httpHandlers>
            <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
        </httpHandlers>
    </system.web>
</location>

Затем я подумал, что я бы переместил файл aspx в подкаталог и предоставил ему свой собственный файл веб-конфигурации, в котором регистрируется http-обработчик, но это не помогло

    <system.web>
        <httpHandlers>
            <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
        </httpHandlers>
    </system.web>

Есть одна вещь, которую я попробовал, которая работает, но я не уверен, что это не заставит все подпапки наследовать свойство.

Установка пути к местоположению "."

        <location path=".">
    <system.web>
        <httpHandlers>
            <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
        </httpHandlers>
    </system.web>
</location>

Мой вопрос ... Есть ли способ зарегистрировать этот обработчик http программно. Или, возможно, вы заметили что-то не так с моими настройками веб-конфигурации.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Ваше решение, которое работает, приведет к тому, что обработчик будет вызываться для всех запросов к Reserved.ReportViewerWebControl.axd, которые существуют в или ниже веб-корня.Если вы хотите изолировать ваш обработчик, чтобы он был доступен только из корня, добавьте запись в web.config с / в начале пути:

<system.web>
    <httpHandlers>
        <add path="/Reserved.ReportViewerWebControl.axd" 
             verb="*" 
             type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
             validate="false"/>
    </httpHandlers>
</system.web>

Если вы хотите изолировать все водиночный подкаталог, добавьте запись в web.config следующим образом:

<system.web>
    <httpHandlers>
        <add path="/mysubdir/Reserved.ReportViewerWebControl.axd" 
             verb="*" 
             type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
             validate="false"/>
    </httpHandlers>
</system.web>

Регистрация обработчика по пути, указанному как:

path="Reserved.ReportViewerWebControl.axd"

, приведет к тому, что обработчик будет вызываться для любогозапрос к Reserved.ReportViewerWebControl.axd независимо от используемых подкаталогов.

EDIT В IIS6, если вы хотите, чтобы Reserved.ReportViewerWebControl.axd был доступен только из корня, просто добавьте ссылку на обработчик, как показано ниже.Вам просто нужно добавить / в начале элемента path.

<system.web>
    <httpHandlers>
        <add verb="*" 
              path="/Reserved.ReportViewerWebControl.axd" 
              type="..." validate="false" />
     </httpHandlers>
</system.web>

Если вы выберете этот подход и получите ошибку Could not load type 'Microsoft.Reporting.WebForms.HttpHandler', попробуйте добавить следующее в compilation \ сборки вweb.config (вам также может понадобиться добавить эту сборку в GAC):

<system.web>
    <compilation debug="true">
       <assemblies>
           <add assembly="Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
       </assemblies>
    </compilation>
    ...
    <httpHandlers>
    ...
    </httpHandlers>
</system.web>
0 голосов
/ 10 августа 2011

Только примечание: я получал Could not load type 'Microsoft.Reporting.WebForms.HttpHandler' только в нашей производственной среде. Я добавил сборку в раздел assemblies под <system.web>, и она все еще не работала. Затем, основываясь на этом ответе, я проверил глобальный кэш сборок (GAC) на компьютере. Оказывается, версия для Microsoft.ReportViewer.WebForms на этом компьютере была 9.0.0.0, а не 8.0.0.0. Я обновил эту строку в web.config, и она отлично работает. Спасибо!

...