ASP.NET 路由 - 自定义路由是否完全跳过 Global.asax 中的所有内容?
题
我有一个简单的 ASP.NET 3.5 SP1 Web 窗体应用程序...我添加了 System.Web.Routing DLL,并且创建了一个简单的路由,该路由返回标准 ASP.NET 页面作为“IHttpHandler”。
一切都很好...除了 HttpContext.Current.User 是 无效的 ???
因此,我做了更多的挖掘(我在 Global.asax 文件中的所有事件中放置了断点)。通常,这些断点会被命中(当我导航到标准“.aspx”页面时):
- 应用程序_开始请求
- 应用程序_AuthenticateRequest
- 应用程序_结束请求
但是,当使用 ASP.NET 路由时...这些事件都没有触发。我错过了什么吗?
解决方案
假设您使用的是 IIS6,另一种方法是定义“通配符”扩展处理程序。将这个简单的“catch all”映射添加到 IIS6 将使其能够处理您的无扩展请求。默认情况下,.NET 安装程序将“.aspx”映射到 aspnet_isapi.dll - 这就是 .aspx 扩展起作用的原因。要将没有扩展名的请求映射到 APS.NET 引擎,您必须告诉 IIS 查看 每个请求.
这是一篇解释该过程的快速文章:
http://haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx
希望这有助于并减少您的网址的“蹩脚”因素。:)
-托德
其他提示
找到了奇怪和奇怪(而且愚蠢)的答案:)
如果您不将“.aspx”添加到路线末尾,则 Global.asax 中不会触发任何内容,这意味着您不会收到任何 BeginRequest、AuthenticateRequest、EndRequest 等...另外,你不会得到 SessionState 或任何东西。
所以,“修复”是我改变我的路线:
RouteTable.Routes.Add("Blah", new Route("Blah/{reportName}", new MyHandler());
对此:
RouteTable.Routes.Add("Blah", new Route("Blah/{reportName}.aspx", new MyHandler());
多么蹩脚:) ...但这仍然是一个修复!
当你说
“如果您不将“.aspx”添加到路线末尾,则 Global.asax 中不会触发任何内容,这意味着您不会收到任何 BeginRequest、AuthenticateRequest、EndRequest 等...另外,你不会得到 SessionState 或任何东西。”
IIS 会将此类请求记录在日志文件中还是只是匿名的?应用程序变量和 ViewState 怎么样?
抱歉,我还没有测试过,但只是问你是否已经知道了?
我已经检查了应用程序变量和视图状态,这两个显然正在工作。不确定服务器日志:S