【问题标题】:asp.net handler for root folder根文件夹的 asp.net 处理程序
【发布时间】:2025-11-25 03:20:03
【问题描述】:

我正在使用 VS 2010、.NET 4.0、ASP.NET Web 应用程序项目。

我有用于处理 *.aspx 的自定义 HttpHandler。 在根文件夹中,我有 Default.aspx 页面,该页面仅用于捕获根文件夹访问并将请求重定向到其他 .aspx 页面,并且该请求由我的自定义处理程序进一步处理。

如果请求被定向到根文件夹,则会处理 Default.aspx。如果请求被发送到 *.aspx(除 Default.aspx 之外的任何其他),我的自定义处理程序将处理它。

我想从项目中删除 Default.aspx 页面,并且仍然能够捕获对我的根应用程序文件夹的请求,并将请求重定向到我的自定义处理程序。

我已尝试在 Global.asax 中注册路线:

private void RegisterRoutes(RouteCollection routes)
    {
        routes.MapPageRoute("Default",
            "",
            "~/Default.aspx");
    }

那没用。

另外,我已经尝试在 web.config 处理程序中注册:

<add name="DefaultHandler" path="*" verb="*" type="App.DefaultHandler, App" />

但这也没有用。

更新:

实际上,web.config path="*" 中定义的处理程序确实有效,但它会捕获对服务器的所有请求,我认为这不是好的做法。

我创建了 DefaultModule,在 BeginRequest 事件中,我检查了 Request 中的 Path 属性,并假设这是对默认页面的请求。到目前为止,一切都很好,但我不确定它是否适用于所有情况,这里是代码:

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpRequest request = HttpContext.Current.Request;
        if (request.Path == "/")
        {
            HttpContext.Current.RewritePath("custom.aspx");
        }
    }

如果有人有更好的想法,我将不胜感激,谢谢。

更新:

我已尝试使用此解决方案: https://*.com/a/1913073/84852 我认为 Web 服务器会请求 Default.aspx,然后我可以使用所描述的处理程序捕获该请求,但应用程序只是通过“找不到文件”异常。

无论如何,我喜欢 HttpModule 的解决方案,如果没有其他解决方案,我会选择它。我只是担心状况if (request.Path == "/"),所以我将其更改为

if (context.Request.CurrentExecutionFilePath == context.Request.ApplicationPath)

以防万一。

仍然欢迎新的想法。谢谢。

更新:

使用 HttpModule 的解决方案不适用于 IIS,而仅适用于 VS 开发服务器。问题是当请求到达我的自定义 HttpHandler(顺便说一句实现 IRequiresSessionState)时,会话没有启动。

【问题讨论】:

  • " Default.aspx 页面仅用于捕获根文件夹访问并将请求重定向到其他 .aspx 页面" 对于此位,您可以更改 IIS(或 Web .config)从 Default.aspx 到(在你的情况下为 custom.aspx)你想在这里看到的任何页面:iis.net/configreference/system.webserver/defaultdocument
  • 默认页面根据数据库中的设置而变化,它来自应用程序逻辑,因此不能只是硬编码。
  • 我写 custom.aspx 只是作为一个例子。很抱歉造成混淆:)

标签: c# asp.net iis


【解决方案1】:

如果我正确理解您的问题,我相信您的路径应该是这样的:

<add name="DefaultHandler" path="*.aspx" verb="*" type="App.DefaultHandler, App" />

path=* 将使其捕获所有请求,而 *.aspx 将限制它以 .aspx 扩展名请求。

【讨论】:

  • 是的,但是如果您请求http://localhost/,它不会触发映射到 *.aspx 的处理程序
  • 在这种情况下,IIS 不会将您路由到默认文档(可能是 .aspx)吗?不过重读之后,我可能会有些困惑。听起来您基本上是在尝试使用 HttpHandler 代替默认文档?还是让 HttpHandler 处理默认文档而不是让 IIS 来处理?
  • 我认为制作默认的 http 处理程序,即只处理 root 中的 default.aspx 的处理程序,并让 IIS 默认路由到默认处理程序就可以了。但它没有。 IIS 没有请求 default.aspx,并且从未请求过默认处理程序。我已经从路由中删除了所有其他可能最终成为默认页面的默认文件。由于英语不是我的语言,我可能没有得到正确的解释,我会在稍后的问题中尝试做得更好。我已经有了可以接受的 HttpModule 解决方案,我也会发布。