我有一个IHttpModule实现与一个委托方法挂钩到PostAcquireRequestState,对于每个HTTP请求,我想知道如何检查当前请求的资源是否是一个Page(aspx)区分所有其他资源,如* .css,* .ico,* .png等等.
其实我可以做以下事情:
private static void OnPostAcquireRequestState(object sender,EventArgs e) { bool isPage = HttpContext.Current.Request.Path.EndsWith(".aspx"); }
但是,我想知道与“.aspx”的检查有什么不同.
解决方法
您可以做的一件事是获取注册的
HTTP Handlers的列表,并检查它们是否由系统类处理.假设你不在命名空间System *中命名自己的类,这是非常愚蠢的:
using System.Configuration; using System.Web.Configuration; Configuration config = WebConfigurationManager.OpenWebConfiguration("/"); HttpHandleRSSection handlers = (HttpHandleRSSection) config .GetSection("system.web/httpHandlers"); List<string> forbiddenList = new List<string>(); // next part untested: foreach(HttpHandlerAction handler in handlers.Handlers) { if(handler.Type.StartsWith("System.")) { forbiddenList.Add(handler.Path); } }
或者,您可以还原查找并列出除自己(或当前)域中的所有现有处理程序,可能会提供一些例外(即,如果要覆盖现有的图像处理程序).但是,无论你选择什么,都可以让您充分访问已经注册的内容.
注意:反之亦然.你现在似乎想要列出几个路径,而是如果你可以进行白名单(即列出你想要处理的那些扩展名),那么你可以使自己变得容易一些.