Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net核心MVC中间件-从辅助文件请求获取目标URL_C#_Asp.net Mvc_Asp.net Core_Asp.net Core Middleware - Fatal编程技术网

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

C# ASP.Net核心MVC中间件-从辅助文件请求获取目标URL,c#,asp.net-mvc,asp.net-core,asp.net-core-middleware,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 s

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

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

    ...
}
问题在于导航到会创建多个实际请求:

/Foo/Index
/js/foo-script.js
/images/my-image.png
我希望能够拦截和修改所有这些相关请求,而我目前的方法只捕获第一个请求。我能找到的最接近的问题是这个,但提供的扩展方法仍然没有显示用户键入的URL或他们单击的链接。。。仅当前正在检索的文件。HttpContext中是否有任何属性可以显示脚本、图像、样式表和索引视图引用的其他资产的“父请求”

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

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

    ...
}
使用以下扩展方法作为辅助工具(此零件按预期工作):

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

请尝试请求标头:

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
文件的“父请求”。

您能说明您的中间件在管道中的何处注册吗?是否有可能处理管道中的另一个中间件正在处理该请求,而没有调用next
RequestDelegate
?您是否有静态文件中间件
app.UseStaticFiles()
@ironstone13-我已经更新了这个问题,但是中间件确实被击中并按预期工作在
/Foo/Index
的情况下,它只是遗漏了由于包含在索引视图的HTML中而请求的脚本和图像等内容。这种方法适用于上述问题,所以我接受了这个答案。经过一些调试和测试,我发现在IIS中使用URL重写比使用中间件处理更有效,但这仍然是很好的信息!谢谢你的帮助。
Referer: https://localhost:5001/Bar Path: /Foo
Referer: https://localhost:5001/Foo Path: /css/site.css