2015-09-16 9 views
8

私は基本的なwebAPIプロジェクト(webAPIをチェックして空白のWebプロジェクト)を作成し、プロジェクトにowin nugetパッケージを追加しました。ミドルウェアクラスがapiリクエストで呼び出されない

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

私は、ロギングクラスを作成し、起動

を経由して、それをフックアップしました
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"); 
    } 
} 

プロジェクトを実行すると、デフォルトのページが開き、Begin/Endリクエストが表示されます(2回、発生したtは)。

しかし、私が/apiルート( `/ api/ping/'など)を呼び出そうとすると、要求は正常に完了しますが、ログに開始/終了要求の状態は表示されません。

私はこれで何が欠けていますか?

答えて

15

Owinは登録された順にミドルウェア項目を実行し、next.Invoke()を呼び出すようには見えないコントローラ(appBuilder.UseWebApi(config))の呼び出しで終了します。質問内のコードに、の呼び出し後にと登録されたロギングミドルウェアクラスがあると仮定すると、これによりAPI要求のために呼び出されることはありません。

にコードを変更する:

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

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

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

は、問題を解決します。

+0

保存しました! :D –

+0

> *これはnext.Invoke()*を呼び出すようには見えません。 C'mon microsoft ... –

関連する問題