【发布时间】:2017-04-14 06:10:56
【问题描述】:
有没有办法在请求得到服务之前拦截请求,以便我可以按需编辑图片或创建动态 pdf?我尝试使用 MapArea 并将请求重定向到控制器,但是当我使用 staticfiles 中间件时,它会捕获请求,并且我的控制器不会处理该请求。
【问题讨论】:
标签: asp.net-core asp.net-core-mvc middleware
有没有办法在请求得到服务之前拦截请求,以便我可以按需编辑图片或创建动态 pdf?我尝试使用 MapArea 并将请求重定向到控制器,但是当我使用 staticfiles 中间件时,它会捕获请求,并且我的控制器不会处理该请求。
【问题讨论】:
标签: asp.net-core asp.net-core-mvc middleware
如果您的静态文件不存在并且您想即时生成它们 - 最好创建自己的 middelware 并在 UseStaticFiles 之前注册。
如果文件存在,但您希望“稍微”修改响应(例如针对不同的用户) - 您可以在静态文件选项中使用 OnPrepareResponse 处理程序:
var staticFileOptions = new StaticFileOptions
{
OnPrepareResponse = (context) =>
{
var fn = context.File.Name.ToLowerInvariant();
if (fn.EndsWith(".pdf"))
{
SomeService.LogPdfDownload(context.Context.Response);
}
else
{
context.Context.Response.Headers.Add("Cache-Control", "public, max-age=15552000"); // 180 days
}
}
};
app.UseStaticFiles(staticFileOptions);
From docs:OnPrepareResponse 在设置状态码和标头之后调用,但在写入正文之前
【讨论】:
有没有办法在请求被服务之前拦截它
是的。在调用 UseStaticFiles 之前,您可以编写自己的中间件并将其添加到 IApplicationBuilder。见https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware#ordering
另见https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing。你也可以通过编写路由而不是中间件来解决这个问题。
【讨论】: