2016-04-15 9 views
2

私はハイブリッドMVC/Web APIプロジェクトを持っており、APIレスポンスをラップするための単純なDelegatingHandler実装を追加しました。これはうまくいくが、ハンドラはMVCコントローラへのリクエストに対しても呼び出されている。私の理解では、DelegatingHandlerはAPIルートに対してのみ呼び出されます。MVC要求に対して私のDelegatingHandlerがなぜ起動しますか?

私はOWINといくつかの属性ルートを使用しています。 Startup.csの関連コードは次のとおりです。

var config = new HttpConfiguration(); 
// ... 
var debugging = HttpContext.Current == null || HttpContext.Current.IsDebuggingEnabled; 
config.MessageHandlers.Add(new ApiResponseDelegatingHandler(debugging)); 

これにより、APIとWebリクエストの両方がラップされ、JSONとして送信されます。コメントアウトすると問題は解決されますが、APIリクエストはラップされません。 Webページのエラーメッセージは、

要求URI 'xxx'と一致するHTTPリソースが見つかりませんでした。いいえ このリクエストのルートデータが見つかりました。

Web APIより前にMVCルートが追加されるようにルートを登録するように強制しましたが、それは助けになりませんでした。

+0

私はこれをActionFilterAttributeを使用して正常に実装できますが、エラーは処理されません。 –

+0

MVCでもハンドラを持つことができますが、動作は期待通りです。あなたができることは、特定のリクエストで見つかったルートがAPIコントローラを持つ名前空間にあるかどうかを確認することです。しかし、IMOでは2つのプロジェクトを分割する必要があります。 – Marco

+0

アクションフィルタはエラーを処理しますが、スタック内ではコントローラ自体で発生するエラーを処理します。 – Marco

答えて

0

これは再現が容易で、バグかどうかわかりません。

  • WebApiConfigからMicrosoft.AspNet.WebApi.Owinと Microsoft.Owin.Host.SystemWeb NuGetパッケージ
  • 移動のWeb APIの起動をインストール
  • ASP.NET MVCテンプレートを使用して新しいWebアプリケーションを作成します。新しいStartup.csには.csは
  • ファイルDelegatingHandlerを作成して、スタートアップクラスでconfig.MessageHandlersに追加
  • DelegatingHandlerは、MVCのために呼び出され、APIは
を要求

Startup.csとWebApiConfig.csでいくつかの組み合わせを試してみましたが、成功しませんでした。あなたが属性ルーティングを使用していない場合、解決策はハンドラをルートに追加することです。もし私が見つけた唯一の回避策は、ハンドラのルートを調べ、ルートが "/ api /"で始まっていればAPIレスポンスをラップすることです。

public class WtfDelegatingHandler : DelegatingHandler 
{ 
    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var response = await base.SendAsync(request, cancellationToken); 

     if (request.RequestUri.LocalPath.StartsWith("/api/", StringComparison.OrdinalIgnoreCase)) 
     { 
      response = new HttpResponseMessage() 
      { 
       StatusCode = HttpStatusCode.OK, 
       Content = new StringContent("I'm an API response") 
      }; 
     } 

     return response; 
    } 

} 
関連する問題