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

时间:2017-11-09 07:16:38

标签: asp.net-core static-files asp.net-core-middleware

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

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)时,它显示的是Image,甚至没有在Configuration方法中映射URL。 我需要我的代码在显示图像之前运行下面的代码,我应该添加什么。

1 个答案:

答案 0 :(得分:2)

  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作为委托传递,而不是执行它,否则它将在应用程序启动期间执行),如下所示:

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

      app.Run(async (context) =>内使用printHello时,仍然会执行第一个中间件。

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

          

        System.InvalidOperationException:“标头是只读的,响应已经开始。”