如何检查当前请求资源是C#ASP.NET中的一个页面?

我有一个IHttpModule实现,其中一个委托方法挂钩到PostAcquireRequestState ,对于每个HTTP请求,我想知道如何检查当前请求的资源是否是一个页面(aspx)区分所有其他资源,如*.css*.ico*.png等。

其实我可以做到以下几点:

 private static void OnPostAcquireRequestState(object sender, EventArgs e) { bool isPage = HttpContext.Current.Request.Path.EndsWith(".aspx"); } 

但我想知道是否有不同的事情比用“.aspx”进行硬性检查。

您可以做的一件事是获取已注册的HTTP处理程序列表,并检查它们是否由系统类处理。 假设您没有在命名空间System.*命名自己的类,这非常简单:

 using System.Configuration; using System.Web.Configuration; Configuration config = WebConfigurationManager.OpenWebConfiguration("/"); HttpHandlersSection handlers = (HttpHandlersSection) config .GetSection("system.web/httpHandlers"); List forbiddenList = new List(); // next part untested: foreach(HttpHandlerAction handler in handlers.Handlers) { if(handler.Type.StartsWith("System.")) { forbiddenList.Add(handler.Path); } } 

或者,您可以还原查找并列出除您自己(或当前)域中的那些之外的所有现有处理程序,可能提供一些例外(即,如果要覆盖现有的图像处理程序)。 但无论您选择什么,这都可以让您完全访问已经注册的内容。


注意:反向通常更容易。 您现在似乎想要将几个路径列入黑名单,但相反,如果您可以进行白名单(即,列出您想要处理的那些扩展名),您可以自己轻松实现。