2017-04-21 31 views
0

唯一的控制器請求我有簡單的ASP核心中間件處理中間件

using System.Diagnostics; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Http; 

namespace Web.Identity 
{ 
    public class UserContextHttpMiddleware 
    { 
     private readonly RequestDelegate _next; 

     public UserContextHttpMiddleware(RequestDelegate next) 
     { 
      _next = next; 
     } 

     public Task Invoke(HttpContext context) 
     { 
      Trace.WriteLine(context.Request.Path); 

      return _next(context); 
     } 
    } 
} 

刷新頁面後,我有這樣的輸出

/ 
/assets/images/avatar-2.jpg 
/assets/images/avatar-3.jpg 
/assets/images/avatar-6.jpg 
/assets/images/avatar-5.jpg 
/assets/images/avatar-7.jpg 
/assets/images/avatar-8.jpg 
/assets/images/avatar-4.jpg 
/assets/images/avatar-1.jpg 
/images/user-background.png 
/assets/images/avatar-10.jpg 
/assets/images/avatar-9.jpg 

第一行是請求CONTROLER。其他行是對靜態內容的請求。 那麼,我如何過濾僅由控制器處理的請求,並忽略對靜態內容的請求?如何知道當前的請求是對控制器的請求?

+0

將其註冊到靜態文件中間件之後。它們按照它們註冊的順序執行,請參閱圖形https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware;) – Tseng

回答

2

中間件按其註冊順序執行(app.UseXxx調用,請參閱docs)。

所以如果你在MVC中間件之前註冊你的中間件,它應該只記錄它們。請注意,它也會記錄不存在的路線。

app.UseMiddleware<UserContextHttpMiddleware>(); 
app.UseMvc(); 

或者您可以註冊中間件的行動,這是更復雜一點(見Using middleware in the filter pipeline文檔)。

public class UserContextHttpPipeline 
{ 
    public Configure(IApplicationBuilder app) 
    { 
     app.UseMiddleware<UserContextHttpMiddleware>(); 
    } 
} 

然後將其註冊爲一個全球性的過濾器

services.AddMvc(options => 
{ 
    options.Filters.Add(new MiddlewareFilter(typeof(UserContextHttpMiddleware2))); 
}); 

這將註冊中間件的每個動作和MVC中間件之後將被調用。這也應該確保只有有效的行動將被記錄,無效的路由不會。