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

时间:2018-08-10 19:56:54

标签: c# asp.net-mvc asp.net-core asp.net-core-middleware

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

答案 0 :(得分:3)

  

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                    

第二行表示/Foo/css/site.css文件的“父请求”。