我有一个ASP.NET核心应用程序和一个简单的OWIN中间件来检查一些数据。但我只想在页面被请求时运行中间件。现在它正在运行时,资产也被请求,如图像,css等。
如何才能使owin中间件代码仅在页面请求上执行?
注册:
app.UseSiteThemer();
Site 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.");
}
}
发布于 2017-03-08 23:38:45
在这里,您可以使用ASP.NET核心管道的两个方面实现您的目标:排序和分支。
关于排序的规则非常简单-添加中间件的顺序就是它们将被执行的顺序。这意味着,如果像您这样的中间件被放在某个可能结束管道(例如静态文件)的中间件之后,它将不会在发生这种情况时被调用。
为了分支管道,您可以使用Map
或MapWhen
方法。第一个分支基于路径,而另一个分支基于谓词。只有在满足分支条件时,才会调用使用Map
或MapWhen
添加的中间件。
您可以阅读有关管道here的更多详细信息
https://stackoverflow.com/questions/42673469
复制相似问题