仅为特定文件/文件夹注册http处理程序或以编程方式注册http处理程序

时间:2011-08-01 18:18:41

标签: c# asp.net web-config httphandler

好的,所以我正在使用旧的公司网站。我们在这里谈论经典的ASP。我有它在开发服务器上工作,但第二个它进入生产服务器服务器上的其他东西,如Web服务开始破坏。

所以基本上我添加了一个使用报表查看器控件的aspx页面。当我在Web配置文件中添加http处理程序时出现问题。因为站点的架构很复杂,我必须修改根Web配置文件,这会导致问题,因为子目录继承自根Web配置文件。

以下是我收到的错误enter image description here

以下是我尝试过的,我认为可行的。

首先,我认为在Web配置文件中添加一个location元素是可行的,但是没有(当然),它没有注册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文件移动到一个子目录中并给它自己的web配置文件注册那里的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 个答案:

答案 0 :(得分:1)

您运行的解决方案将导致为Web根目录中或下面的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的任何请求调用处理程序。

修改
在IIS6下,如果只希望Reserved.ReportViewerWebControl.axd只能从根目录中获取,只需添加对处理程序的引用,如下所示。你应该只需要在路径元素的开头添加一个。

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

如果采用这种方法并且出现Could not load type 'Microsoft.Reporting.WebForms.HttpHandler'错误,请尝试将以下内容添加到web.config中的编译\程序集中(您可能还需要将该程序集添加到GAC中):< / p>

<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>

答案 1 :(得分:0)

请注意:我只在我们的生产环境中获得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中的那一行,但效果很好。谢谢!