运行 重定向到静态文件之前的一些代码
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。
在显示图像之前,我需要我的代码 运行 下面的代码,我应该添加什么。
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
作为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) =>
时,只有第一个中间件仍然会被执行。
await context.Response.WriteAsync
只能用于管道中的最终中间件,因为这会启动响应,因此下一个中间件可能会失败并出现下一个异常:
System.InvalidOperationException: "Headers are read-only, response has already started."
我正在开发一个 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。 在显示图像之前,我需要我的代码 运行 下面的代码,我应该添加什么。
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
作为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) =>
时,只有第一个中间件仍然会被执行。
await context.Response.WriteAsync
只能用于管道中的最终中间件,因为这会启动响应,因此下一个中间件可能会失败并出现下一个异常:System.InvalidOperationException: "Headers are read-only, response has already started."