2015-01-07 8 views
5

Mam kłopotliwy problem z ASP .NET vNext; dokładniej, MVC.ASP .NET vNext MVC nie przekazuje do następnego w potoku?

Oto uproszczona wersja mojego pliku 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(); 
    }); 
} 

Problem używam do jest bardzo prosta: Ostatni middleware na żądanie rurociągu nie zawsze się nazywa po app.UseMvc (). W rzeczywistości jedyną konsekwencją, jaką mogę z tego wyciągnąć, jest to, że widzę tylko .SaveCookie() na początku nowej sesji (lub CTRL + F5).

Czy istnieje rym lub przyczyna, dla której moje oprogramowanie pośrednie nie zawsze jest wykonywane?

Odpowiedz

4

Jeśli żądanie jest obsługiwane przez MVC, to odeśle odpowiedź do klienta i nie wykona żadnego oprogramowania pośredniego następnego w potoku.

Jeśli musisz wykonać pewne przetwarzanie odpowiedzi w twoim przypadku, musisz je zarejestrować przed oprogramowaniem pośredniczącym MVC.

Ponieważ MVC może pisać odpowiedź, byłoby zbyt późno, aby zmodyfikować nagłówki odpowiedzi (ponieważ są wysyłane najpierw do klienta przed treścią). Możesz więc użyć wywołania zwrotnego OnSendingHeaders, aby uzyskać szansę na modyfikację nagłówków.

Poniżej przykład:

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

Awesome! Dziękuję bardzo! To całkowicie rozwiązało problem. –

+2

Jako aktualizacja dla RC2, metoda nazywa się teraz OnStarting(). –

Powiązane problemy