2015-09-16 21 views
8

Stworzyłem podstawowy projekt webAPI (pusty projekt sieciowy z zaznaczonym webAPI) i dodałem do projektu owinowane pakiety nuget.Klasa middleware nie jest wywoływana na żądanie api

  • Microsoft.AspNet.WebApi.Owin
  • Microsoft.Owin.Host.SystemWeb
  • Owin

Mam następnie stworzył klasę rejestrowania i podłączyć go poprzez starcie

using AppFunc = System.Func<System.Collections.Generic.IDictionary<string, object>, System.Threading.Tasks.Task>; 

public class Startup 
{ 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     Debug.WriteLine("Startup Called"); 
     var config = new HttpConfiguration(); 
     WebApiConfig.Register(config); 

     appBuilder.UseWebApi(config); 

     appBuilder.Use(typeof(LoggingMiddleware)); 
    } 
} 

public class LoggingMiddleware 
{ 
    private AppFunc Next { get; set; } 

    public LoggingMiddleware(AppFunc next) 
    { 
     Next = next; 
    } 

    public async Task Invoke(IDictionary<string, object> environment) 
    { 
     Debug.WriteLine("Begin Request"); 

     await Next.Invoke(environment); 

     Debug.WriteLine("End Request"); 
    } 
} 

Po uruchomieniu projektu i wyświetleniu strony domyślnej widzę wywołane żądania Początek/Koniec (dwukrotnie, tak jak to się dzieje, nie wiem, dlaczego t jest).

Jeśli jednak spróbuję wywołać trasę /api (taką jak `/ api/ping/'), żądanie zakończy się pomyślnie, ale nie widzę stanów Żądanie rozpoczęcia/zakończenia w dzienniku.

Czego mi brakuje?

Odpowiedz

15

Owin wykonuje elementy oprogramowania pośredniego w kolejności, w jakiej są zarejestrowane, kończąc na wywołaniu kontrolera (appBuilder.UseWebApi(config)), który nie wydaje się wywoływać next.Invoke(). Biorąc pod uwagę, że kod w pytaniu ma zarejestrowaną klasę Logging Middleware po wywołanie UseWebApi, powoduje to, że nigdy nie będzie wywoływana dla żądań API.

Zmiana kodu do:

public class Startup 
{ 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     //..... 

     //This must be registered first 
     appBuilder.Use(typeof(LoggingMiddleware)); 

     //Register this last 
     appBuilder.UseWebApi(config); 
    } 
} 

rozwiązuje ten problem.

+0

Uratowałem dzień !! : D –

+0

> * które nie wydaje się wywoływać next.Invoke() * Uhhhh dlaczego nie? No dalej, microsoft ... –