2017-03-08 172 views
2

我有一个ASP.NET核心应用程序和一个简单的OWIN中间件来检查一些数据。但是我想只在请求页面时运行中间件。现在它的运行时还需要资产,如图像,CSS等。ASP.NET核心OWIN中间件

如何让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

添加它后面的管道比静态文件处理中间件更多的细节? –

+0

向我们展示如何注册您的中间件。密钥可能会从注册切换到。使用注册.Map,但没有只是猜测的代码。 – tpeczek

+0

@tpeczek我继续前进并更新了我的代码,谢谢! – TheWebGuy

回答

2

有ASP.NET核心管线的两个方面,你可以使用你目标在这里:订购和分支。

有关订购的规则非常简单 - 中间件的添加顺序是它们将要执行的顺序。这意味着如果像你这样的中间件放在一些可以结束流水线的中间件之后(例如静态文件),它将不会被调用。

为了分支管道,您可以使用MapMapWhen方法。第一个基于路径分支管道,而另一个基于谓词分支。仅在满足分支条件时才会调用添加了MapMapWhen的中间件。

您可以阅读有关管道here