ASP.Net 核心 MVC 中间件 - 从辅助文件请求中获取目标 URL

ASP.Net Core MVC Middleware - Get Target URL From Secondary File Requests

我正在尝试使用自定义中间件来拦截和修改对某个控制器 (FooController) 的请求,同时让其他请求照常通过。我正在尝试使用 context.Request.Path 来识别这些,如图所示:

public async Task Invoke(HttpContext context)
{
    if (context.Request.Path.Value.StartsWith("/Foo", StringComparison.OrdinalIgnoreCase))
    {
        // do stuff
    }

    ...
}

问题是导航到 https://localhost/Foo/Index 会创建多个实际请求:

/Foo/Index
/js/foo-script.js
/images/my-image.png

我希望能够拦截和修改所有这些相关请求,而我目前的方法只捕获第一个请求。我能找到的最接近的问题是这个 但提供的扩展方法仍然没有显示用户输入的 URL 或他们点击的 link ......只有当前正在检索的文件。 HttpContext 中是否有任何 属性 会向我显示索引视图引用的脚本、图像、样式表和其他资产的 "parent request"?

编辑:我可以设置一个断点并查看正在调用的中间件,我可以看到 /Foo/Index 匹配 if 语句而 /js/foo-script.js 不匹配,所以该部分似乎没事的。中间件在 startup.cs 中注册如下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseMyMiddleware();

    ...
}

使用以下扩展方法作为助手(这部分都按预期工作):

public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
{
    return builder.Use(next => new FooMiddleware(next).Invoke);
}

Is there any property in the HttpContext that will show me the "parent request" for the scripts, images, stylesheets, and other assets referenced by the Index view?

尝试 "Referer" 请求 header:

public async Task Invoke(HttpContext context) 
{
    var path = context.Request.Path;
    var referer = context.Request.Headers["Referer"];

    Console.WriteLine($"Referer: {referer} Path: {path}");

    await _next(context);
}

例如,如果我从 /Bar 页面导航到 /Foo 页面,那么我会看到以下输出:

Referer: https://localhost:5001/Bar Path: /Foo
Referer: https://localhost:5001/Foo Path: /css/site.css                    

第二行表示 /Foo/css/site.css 文件的 "parent request"。