c# - ASP.NET HttpModules 和 Server.Transfer/Server.TransferRequest/RewritePath 问题

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

我会尽量具体。我继承了一个非常陈旧的 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 https://somedomain.com/JS/jQuery/jquery.js 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?");
    }
}

关于c# - ASP.NET HttpModules 和 Server.Transfer/Server.TransferRequest/RewritePath 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2254849/

相关文章:

Iphone Youtube 全屏 Web 应用程序(独立)无音频(BUG ?)

linux - 在 Linux 中运行 Web 服务器的个人实例

c# - 如何在 SQL Server 或 ASP.NET C# 中强制执行一定数量或范围的受影响行

c# - 使用 Microsoft.Web.Administration.dll IIS 8.5 中的 WorkerProcess.GetRequests 方法时出错

c# - ASP.NET 中的 Crystal Report 问题 - ExportToHttpResponse

javascript - 使用 ASP MVC 将跨度的数据绑定(bind)到数据库,使用 Model Binder

java - 在 web.xml 文件中映射 WebSocketEndpoints

c# - MVVM:处理非常大的 View 模型

c# - 将 JSON 数据对象存储到 ASP.NET MVC( Entity Framework )中的数据库

c# - response.redirect 不起作用