代码之家  ›  专栏  ›  技术社区  ›  Dave Smash

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

  •  2
  • Dave Smash  · 技术社区  · 7 年前

    我试图使用自定义中间件拦截和修改对某个控制器(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
    

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

    编辑:我可以设置一个断点并查看正在调用的中间件,我可以看到/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);
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Shaun Luttin    7 年前

    HttpContext中是否有任何属性将向我显示索引视图引用的脚本、图像、样式表和其他资产的“父请求”?

    试试 "Referer"

    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                    
    

    第二行的意思是 /福 /css/site.css 文件。