2017-09-29 8 views
2

を働いていない私は非常にシンプルな地図シンプルapp.map()Startup.csでは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が見つかりません。 ミドルウェアロジッククラスは、ビジュアルスタジオテンプレートに含まれる標準クラスです。私は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ブランチ(ミドルウェアの順序が重要です)以外のミドルウェアを実行しません。代わりに、自動的に終了します。つまり、.Mapの内部に.Runを使用してパイプラインを終了する必要はありません。

そしてMapで使用されるあなたのMiddlewareLogic1ミドルウェアでawait _next(httpContext);があるので、あなたは404を得るが、このMapブランチに登録された他のパイプラインはありません。 あなたが更新代わりに404


の応答"This is logic123に表示されますawait _next(httpContext);を削除する場合:.Map.MapThenの両方が同じ終端挙動を有します。解決策として、 と考えることができます - .Map.Useに置き換え、ログインを内部的に比較するクエリを実行します。 - または.app.Mapにミドルウェアの別のチェーンを登録してください。

+0

上記の記事は非常に基本的です。それは私の質問に答えるものではありません。 私はこのapp.MapWhen(context => context.Request.QueryString.Value.StartsWith( "/ home123")、 x => x.UseMiddlewareLogic1())を配置します。 Logic3のみが実行されます。 –

+0

しかし、私はミドルウェアの標準コードが単純なシナリオ用に作成されていることを理解することができますので、これではうまくいかないでしょう。私はそれを修正する必要があります。 –

+0

はい、どちらも終了動作をしています。あなたはあなたの答えを更新することができますか? –

関連する問題