我在 IIS 中使用我自己的自定义身份验证,并且我希望服务器在每次加载页面时(无论是什么类型的文件)都首先检查 Application 变量,以查看用户是否经过身份验证并有权查看该站点。在 global.asax 中,这可能是:
void Application_Start(Object Sender, EventArgs e)
{
if(Application["username"] == null)
{
Response.redirect("login.aspx");
}
}
问题是这个站点有多个子根。也就是说,http://example.com/site1是一个与 http://example.com/site2 完全不同的网站.因此,我希望说 Application_Start 函数在 site1 上工作但不影响 site2。
如果 global.asax 可以在目录级别进行自定义,那么这将不是问题。但由于每台服务器只有一个 global.asax,我无法实现此解决方案。
global.asax 有哪些替代方案?或者每个目录的 global.asax 会有所不同吗?
最佳答案
HttpModules 是 global.asax 的替代品
(另见 https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm
http://codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx )
HttpModules 在 web.config 中注册;方便地,它可以在目录级别进行自定义。所以每个目录都可以有自己独特的一组模块(在较低的目录中继承)。所有模块都具有与 global.asax 中相同的功能。
基本上,每个页面请求在到达实际页面代码本身之前都会通过每个注册模块。无论它是哪种请求,都会发生这种情况:
“page.aspx” “page.html”
| |
( | 模块 1 | )
( | 模块 2 | )
( | 模块 3 | )
五五
(处理程序 1) (处理程序 2)
((更好的图片和描述可以在 https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm 找到))
那么你需要做的就是将你的代码定义为一个模块而不是 global.asax 。如果用户未通过身份验证,则:response.redirect("login.aspx")
将阻止控制到达处理程序并解析/返回/运行请求的页面。
它比这要复杂一些,因此可以在 codeguru 网站上找到更好的描述/教程。
关于iis - 使用 global.asax 有哪些替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/307821/