检测来自 .NET 核心中间件的静态文件请求

Detect static file request from .NET core middleware

我正在编写一些中间件来解析给定请求的子域 URL 以确定网站主题。我想忽略静态文件请求以减少不必要的数据库查找,我想知道是否有更简洁的方法来做到这一点。

这是我目前尝试过的方法:

var staticFileExtensions = new List<string> { ".css", ".js", ".png", ".ico" };
if (staticFileExtensions.Any(x => httpContext.Request.Path.Value.EndsWith(x)))
{
    await _next(httpContext);
}
else
{
    var hostParts = httpContext.Request.Host.Host.Split('.').ToList();
    if (httpContext.Request.Path.StartsWithSegments(new PathString("/healthcheck"))
    || (hostParts.Count == 6 && _whitelistedDomains.Contains(hostParts[0])))
    {
        httpContext.Items.Add("account", hostParts[0]);
        await _next(httpContext);
    }
    else
    {
        httpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
    }
}

这是我将它添加到 Startup.cs 的地方:

app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseDomainWhitelisting();

感觉好像应该有一种更简洁的方法来检测要忽略哪些请求,或者我可能遗漏了什么?

您可以根据要求使用条件中间件。 类似于:

app.UseMiddlewareOne();

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
    appBuilder.UseMiddlewareTwo();
});

app.UseMiddlewareThree();

来源: https://www.devtrends.co.uk/blog/conditional-middleware-based-on-request-in-asp.net-core

这是一个很老的问题,但是当我遇到类似问题时我就想到了, 我可以通过检查请求是否以扩展名结束来解决问题并确定静态文件请求。

if(string.IsNullOrEmpty(System.IO.Path.GetExtension(httpContext.Request.Path)))
 //this is normal request
else
 //this can be a file as it ends with some extension (ex*.png)