运行 重定向到静态文件之前的一些代码

Running some code before redirecting to a static file

我正在开发一个 asp.net 核心应用程序,其中包含 wwwroot 目录下的 Images 文件夹。我的代码看起来像这样

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseStaticFiles();

        app.Map("/Images", images =>
        {
            images.Map("/test.png", test =>
            {
                printHello(app);
            });
        });
    }

private void printHello(IApplicationBuilder app)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!!");
        });
    }

所以我的问题是每当我 运行 应用程序并调用此 URL (http://localhost:5000/Images/test.png) 它显示图像时甚至没有在配置方法中映射 URL。 在显示图像之前,我需要我的代码 运行 下面的代码,我应该添加什么。

  1. StaticFiles 中间件停止进一步的管道执行。

    您可以尝试使用 OnPrepareResponse 处理程序在将响应发送回客户端之前做一些事情:

    var staticFileOptions = new StaticFileOptions()
        {
            OnPrepareResponse = ctx =>
            {
                // request is available via ctx.Context.Request
                // response is available via ctx.Context.Response
            }
    
        };
    
    app.UseStaticFiles(staticFileOptions);
    

  1. 中间件按照它们注册的顺序被调用。在 StaticFiles 中间件之前注册一些中间件并且不停止其中的管道执行(不要使用 .Run

    看,如果只是替换命令(注意需要把printHello作为delegate传递,不要执行,否则会在app启动的时候执行),像这样:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
       app.Map("/Images", images =>
       {
           images.Map("/test.png", printHello);
       });
    
       app.UseStaticFiles();
    } 
    

    当您在 printHello 中使用 app.Run(async (context) => 时,只有第一个中间件仍然会被执行。


  1. await context.Response.WriteAsync 只能用于管道中的最终中间件,因为这会启动响应,因此下一个中间件可能会失败并出现下一个异常:

    System.InvalidOperationException: "Headers are read-only, response has already started."