2017-09-29 59 views
2

在Startup.cs我有簡單app.map()不工作MVC核心

app.Map("/Home",x=>x.UseMiddlewareLogic1()); 

我配置的完整代碼看起來如下圖所示

public void Configure(IApplicationBuilder app) 
     { 
      app.Map("/Home",x=>x.UseMiddlewareLogic1()); 
      //app.UseMiddlewareLogic1(); 
      //app.UseMiddlewareLogic2(); 
      app.Run(async context => 
      Logic3(context)); 
     } 

邏輯一個非常簡單的地圖3只如下所示寫回應

public async Task Logic3(HttpContext obj) 
     { 
      await obj.Response.WriteAsync("Logic 3\n"); 

     } 

上面的代碼顯示404找不到。 中間件邏輯類是Visual Studio模板中的標準類。我正在使用VS 2017.

public class MiddlewareLogic1 
    { 
     private readonly RequestDelegate _next; 

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

     public async Task Invoke(HttpContext httpContext) 
     { 
      await httpContext.Response.WriteAsync("This is logic123 \n"); 
      await _next(httpContext); 
     } 
    } 

    // Extension method used to add the middleware to the HTTP request pipeline. 
    public static class MiddlewareLogic1Extensions 
    { 
     public static IApplicationBuilder UseMiddlewareLogic1(this IApplicationBuilder builder) 
     { 
      return builder.UseMiddleware<MiddlewareLogic1>(); 
     } 

    } 
+0

你的'Configure'方法還有什麼嗎?具體來說,_'app_Map(...)'? – BFree

+0

是的,我確實有app.run(更新後的代碼),我正在寫最後的輸出到響應。 –

回答

0

這就是你的問題:app.Map("/Home",x=>x.UseMiddlewareLogic1());

如果您使用的是app.Map,框架將不會在Map分支之外執行中間件(在app.Map之後註冊 - 中間件的順序很重要)。相反,它會自動終止。換句話說,您不需要使用.Map中的.Run來終止管道。

,你會得到404有在Map使用您的MiddlewareLogic1中間件await _next(httpContext);,但在這個Map分公司登記在冊沒有其他管道。 如果刪除await _next(httpContext);,你會響應"This is logic123看到,而不是404


更新:既.Map.MapThen具有相同的終止行爲。作爲解決方案,您可以考慮 - 將.Map更換爲.Use,並在內部進行查詢比較登錄。 - 或在.app.Map註冊一個單獨的中間件鏈。

+0

上面的文章看起來非常基本。它不回答我的問題。 (context)> context.Request.QueryString.Value.StartsWith(「/ home123」), x => x.UseMiddlewareLogic1()); 只有Logic3執行。 –

+0

但是,我知道中間件標準代碼是爲簡單場景創建的,所以不適用於此。我需要修改它。 –

+0

是的,他們都有終止行爲。你能否更新你的答案,我將表示感謝。 –