【问题标题】:ASP.NET HttpModules & Server.Transfer / Server.TransferRequest / RewritePath problemsASP.NET HttpModules & Server.Transfer / Server.TransferRequest / RewritePath 问题
【发布时间】:2010-02-12 20:18:56
【问题描述】:

我会尽量做到具体。我继承了一个非常陈旧的 C++ ISAPI 过滤器,它保护了一个经典的 ASP 网站,并负责创建一个 HTTPModule 来直接替换它。

首先,我加入了 OnPreRequestHandlerExecute 事件。然后,我成功地重新创建了对原始 ISAPI 过滤器所做的存储过程的调用。这些调用返回一个状态代码,我将其放入 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 中收到以下客户端错误:

语法错误https://somedomain.com/JS/jQuery/jquery.js第2行

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

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

未找到请求类型“GET”的 http 处理程序

呸!我希望我的解释是足够的:)

我想我真正的问题是,完成我想要完成的事情的最佳方式是什么。我觉得 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>

【问题讨论】:

  • 如果我可以改写您的问题,您问的是保护静态/非静态资源的最佳方法是什么,以便用户在尝试访问资源时始终需要登录?
  • BTB 你能说说你使用的是什么版本的 IIS 吗?

标签: c# asp.net web-applications httpmodule server-side


【解决方案1】:

我不知道这是否是最好的方法,但作为测试,是否会执行以下工作?

在您的 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?");
    }
}

【讨论】:

  • 这将重写为经典的 ASP 页面而不是 ASPX 资源。此外,如果我使用 BeginRequest 事件,我会得到与使用 Server.Transfer 方法时相同的客户端错误。
【解决方案2】:

听起来 IIS 没有将图像请求交给 ASP.Net,这是默认设置(IIS 通常只提供图像而不将其交给页面或任何东西)。

您是否尝试过在 IIS 中或使用 web.config 文件将图像扩展映射到您的自定义处理程序?

【讨论】:

  • 不确定,但 nokturnal 提到“任何非经典 ASP 页面”,所以我认为这意味着 .aspx 请求也无法正常工作。
  • 同样的情况。这对我来说有点处理程序问题。如果他正在升级经典的 asp 站点,那么 .aspx 的处理程序设置也可能没有到位。
  • 站点文件已移至新的 IIS7 站点(显然是使用集成管道模式)。
  • 那么您检查处理程序映射了吗?
  • 现在就在回家途中。当我到达那里时,我会尝试检查一下。谢谢一群人,这真的让我很烦:)
【解决方案3】:

老兄,很抱歉浪费了大家的时间。

事实证明,底层数据结构存在一些问题(权限设置不正确)。由于实施的安全模型的复杂性,我必须一遍又一遍地错过它,直到最终我意识到问题所在。我一定是看了 100 遍都没意识到!

感谢大家的回复,再次抱歉。

【讨论】:

  • 因为我无法删除这个问题,所以我选择了这个作为答案,这样用户就不必阅读所有回复和所有 cmets 就知道我是个白痴。
猜你喜欢
  • 2010-11-16
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2015-09-18
  • 1970-01-01
  • 2012-05-22
  • 2011-06-19
相关资源
最近更新 更多