c# – ASP.NET HttpModules&Server.Transfer / Server.TransferRequest / RewritePath问题

我将尝试尽可能具体.我继承了一个非常陈旧的C ISAPI过滤器,它保护了一个经典的ASP网站,并负责创建一个HTTPModule来直接替换它.

首先,我挂钩了OnPreRequestHandlerExecute事件.然后,我成功地重新创建了对原始ISAPI过滤器所创建的存储过程的调用.这些调用返回一个statusCode,我将其放入CASE语句中,根据状态代码,设置一个“重定向”字符串变量(sUrl).例如,statusCode 15将sUrl设置为“/Session/Login.asp”.一切顺利.

下一步是页面的实际“重定向”.在C中,模块正在执行以下操作:

Headers.push_back(HeadersList::value_type("url", "/Session/Errors/SecurIDRequired.asp"));

我试图通过使用以下内容重新创建此功能:

HttpContext.Current.RewritePath(sUrl);

这适用于所有经典asp页面100%.当用户尝试访问“http://somedomain.com/Blah.jpg时,问题就出现了.模块成功运行,设置正确的statusCode为15,并调用RewritePath方法,但不会将URL重写到登录页面.对于任何非经典的ASP页面.

所以我开始查看其他选项而不是RewritePath并查看了TransferRequest.这看起来很有希望,所以我将代码更改为:

HttpContext.Current.Server.TransferRequest(sUrl, true);

现在,这会将所有请求的文件类型路由到登录页面,但会发生奇怪的事情.首先,我在FireBug中遇到以下客户端错误:

syntax error 07001 Line 2

…一些围绕jQuery的其他javascript错误.我看一下Net面板,它成功加载了jQuery库,所以我对此感到茫然(RewritePath方法不会发生这种情况).

最后,我尝试使用旧的Server.Transfer并得到此服务器端错误:

No http handler was found for request type ‘GET’

唷!我希望我的解释足够:)

我想我真正的问题是,实现我想要完成的目标的最佳方法是什么.我觉得RewritePath方法是最好的,任何提示都会非常感激.

干杯!

编辑:

web.config中包含的处理程序如下:

<httpHandlers>
    <remove verb="*" path="*.asmx" />
    <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpHandlers>

最佳答案 我不知道这是否是最好的方法,但是作为测试做了类似下面的工作?

在你的HttpModule中:

private void Application_BeginRequest(Object source, EventArgs e)
{
    HttpContext context = ((HttpApplication)source).Context;
    HttpRequest request = context.Request;
    if(request.Url.ToString().Contains("blah.jpg"))
    {
        context.RewritePath("~/login.aspx?");
    }
}
点赞