我正在开发一个包含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。 我需要我的代码在显示图像之前运行下面的代码,我应该添加什么。
答案 0 :(得分:2)
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);
按照注册的顺序调用中间件。在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
时,仍然会执行第一个中间件。
await context.Response.WriteAsync
只能在管道中的最终中间件中使用,因为这会启动响应,因此下一个中间件可能会因下一个异常而失败:
System.InvalidOperationException:“标头是只读的,响应已经开始。”