asp.net - 在 Application_BeginRequest 期间检查静态文件?

标签 asp.net asp.net-mvc global-asax static-files

我有一个 Global.asx 文件,需要进行自定义身份验证、审计和分析。这是必需的,因为它支持基于 SAML 的 SSO 系统并且需要覆盖正常的 .Net 身份验证(不支持 SAML 或混合身份验证)

我不想为静态文件触发它,例如 .js , .css , .png , 等等

在 Cassini/WebDev 和 IIS7 中确实如此。

我想要的是一些简单的检查,比如 this.Request.IsStaticFile (不幸的是,它不存在)来识别静态文件。

我意识到这写起来相当简单,但感觉就像必须已经存在的东西 - IIS 已经为静态文件等应用了缓存策略。

我需要一个代码解决方案,而不是一个 IIS 配置更改。

更新

这是我目前的解决方法:

/// <summary>Hold all the extensions we treat as static</summary>
static HashSet<string> allowedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    ".js", ".css", ".png", ...
};

/// <summary>Is this a request for a static file?</summary>
/// <param name="request">The HTTP request instance to extend.</param>
/// <returns>True if the request is for a static file on disk, false otherwise.</returns>
public static bool IsStaticFile(this HttpRequest request)
{
    string fileOnDisk = request.PhysicalPath;
    if (string.IsNullOrEmpty(fileOnDisk))
    {
        return false;
    }

    string extension = Path.GetExtension(fileOnDisk);

    return allowedExtensions.Contains(extension);
}

这有效并且足够快,但感觉非常笨重。特别是,如果我们添加了没有想到的新静态文件,那么依赖扩展将很容易出错。

有没有更好的方法而不改变 IIS 配置?

最佳答案

您也许能够检查哪个处理程序正在处理请求。

在 IIS6 中,只有 .net 文件,例如 aspx 被映射到一个处理程序。

在带有集成管道的 IIS7 中,一切都通过 .net 路由,这通常是一件好事。不同的处理程序仍然处理不同的文件类型。特别是我相信 staticfilehandler 是您需要检查的那个。 httpcontext.handler属性(property)应该让你弄清楚。

您可以创建一个扩展方法来添加 IsStatic 方法...

西蒙

关于asp.net - 在 Application_BeginRequest 期间检查静态文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6677214/

相关文章:

c# - 自定义授权过滤器在 ASP.NET Core 3 中不起作用

asp.net-mvc - 允许使用 MVC 3 加号登录 URL

c# - ViewBag 抛出 NullReferenceException(对象未发送到实例)

c# - Visual Studio 中有没有办法从空 ASP.NET Web 应用程序开始配置 Web 部署的默认起始页?

c# - 我的项目和 ASP 页面中的用户控件?

c# - 如何将 ASP Net Membership Provider UserId 保存到另一个 sql 表中?

asp.net - Application_AuthenticateRequest 命中所有请求,包括图片和js文件

asp.net-mvc - Session.SessionTimeout 在 ASP.NET Identity 中是否已弃用

asp.net - <machineKey解密 key ="AutoGenerate"...被IIS忽略。不会使之前 session 的 cookie 失效

c# - GridView 编辑/更新事件在 1 次单击后未触发