我将尝试尽可能具体.我继承了一个非常陈旧的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?");
}
}