2015-01-07 15 views
5

私はASP .NET vNextで厄介な問題があります。より具体的には、MVC。ここでASP .NET vNext MVCはパイプラインで次へと引き渡しませんか?

は私のStartup.csファイルの簡易版である:

public void ConfigureServices(IServiceCollection services) 
{ 

    // Add MVC services to the services container. 
    services.AddMvc(); 
    services.AddScoped<Foo>(); 

} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory) 
{ 

    app.Use(async (context, next) => 
    { 
     await context.RequestServices.GetService<Foo>().Initialize(context); 
     await next(); 
    }); 
    // Add MVC to the request pipeline. 
    app.UseMvc(routes => 
    { 
     routes.MapRoute(
      name: "default", 
      template: "{controller}/{action}/{id?}", 
      defaults: new { controller = "Home", action = "Index" }); 
    }); 

    // Time to save the cookie. 
    app.Use((context, next) => 
    { 
     context.RequestServices.GetService<Foo>().SaveCookie(); 
     return next(); 
    }); 
} 

私はに実行している問題は非常に簡単です:要求パイプライン内の最後のミドルウェアは、常に(app.UseMvc後に呼び出されません。 )。実際、私がそれから作ることができる唯一の一貫性は、新しいセッション(またはCTRL + F5)の開始時に.SaveCookie()が呼び出されることだけです。

私のミドルウェアが常に実行されているわけではない韻や理由はありますか?

答えて

4

要求がMVCによって処理された場合、応答はクライアントに返され、の次のパイプラインは実行されません。

ケースのレスポンスの後処理を行う必要がある場合は、の前に、MVCミドルウェアを登録する必要があります。

また、MVCがレスポンスを記述している可能性があるため、レスポンスヘッダーを変更することが遅すぎる可能性があります(ボディの前に最初にクライアントに送信されるため)。したがって、OnSendingHeadersコールバックを使用してヘッダーを変更することができます。続き

は一例です:

app.Use(async (context, next) => 
    { 
     context.Response.OnSendingHeaders(
     callback: (state) => 
        { 
         HttpResponse response = (HttpResponse)state; 

         response.Cookies.Append("Blah", "Blah-value"); 
        }, 
     state: context.Response); 

     await next(); // call next middleware ex: MVC 
    }); 

app.UseMvc(...) 
{ 
.... 
} 
+0

すごいです!本当にありがとう!これにより、この問題は完全に解決されました。 –

+2

RC2のアップデートとして、このメソッドはOnStarting()と呼ばれるようになりました。 –

関連する問題