我试图使用自定义中间件来拦截和修改对某个控制器(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);
}
答案 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
文件的“父请求”。