我有一个ASP.NET核心应用程序和一个简单的OWIN中间件来检查一些数据。但我想只在请求页面时运行中间件。现在它在请求资产时运行,如图像,CSS等。
如何让owin中间件代码仅在页面请求上执行?
注册:
app.UseSiteThemer();
网站Themer扩展类:
public static class SiteThemerExtensions
{
public static IApplicationBuilder UseSiteThemer(this IApplicationBuilder builder)
{
return builder.UseMiddleware<SiteThemerMiddleware>();
}
}
OWIN中间件:
public class SiteThemerMiddleware
{
private readonly RequestDelegate _next;
private readonly ISiteService _siteService;
public SiteThemerMiddleware(RequestDelegate next, ISiteService siteService)
{
_siteService = siteService;
_next = next;
//_logger = loggerFactory.CreateLogger<SiteThemerMiddleware>();
}
public async Task Invoke(HttpContext context)
{
await Task.Run(() =>
{
Console.Write("OWIN Hit");
});
//_logger.LogInformation("Handling request: " + context.Request.Path);
await _next.Invoke(context);
//_logger.LogInformation("Finished handling request.");
}
}
答案 0 :(得分:2)
您可以在此处使用ASP.NET Core管道的两个方面:排序和分支。
关于排序的规则非常简单 - 添加中间件的顺序是它们将被执行的顺序。这意味着如果像你这样的中间件放在一些可以结束管道的中间件之后(例如静态文件),如果它发生就不会被调用。
为了分支管道,您可以使用Map
或MapWhen
方法。第一个基于路径分支管道,而另一个基于谓词。添加了Map
或MapWhen
的中间件只有在满足分支条件时才会被调用。
您可以阅读有关管道here
的更多详细信息