【发布时间】: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 只是作为一个例子。很抱歉造成混淆:)