2013-03-04 4 views
16

ASP.NET 4.5 MVC 4 Web APIプロジェクトでは、カスタムHttpMessageHandlerを追加します。次のように私は、(\ App_Satrt \ WebApiConfig.csに)WebApiConfigクラスを変更しました:Web APIでHttpMessageHandlerを実装する方法は?

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional }, 
      constraints: null, 
      handler: new MyCustomizedHttpMessageHandler() 
     ); 
    } 
} 

は、その後、私はMyCustomizedHttpMessageHandlerを開発:

public class MyCustomizedHttpMessageHandler : HttpMessageHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     IPrincipal principal = new GenericPrincipal(
      new GenericIdentity("myuser"), new string[] { "myrole" }); 
     Thread.CurrentPrincipal = principal; 
     HttpContext.Current.User = principal; 

     return Task<HttpResponseMessage>.Factory.StartNew(() => request.CreateResponse()); 
    } 
} 

ただし、APIへのリクエストを(のはhttp://mylocalhost.com/api/valuesを言わせて)データなしで常にステータスコード200を返します。つまり、ValuesController.csの 'GET()'メソッドに到達することはありません。

私は何が欠けていますか? HttpMessageHandlerを正しく実装するにはどうすればよいですか?

PS:私を助けていない、https://stackoverflow.com/a/12030785/538387:すでにこれを読んだことがあります。

答えて

22

あなたは要求HttpMessageHandlerたショートを作成していると、要求がパイプラインの残りの部分を通過することはできません。代わりに、DelegatingHandlerを作成する必要があります。

また、Web APIには2種類のメッセージハンドラパイプラインがあります。 1つは、すべてのルートに対するすべての要求が通過する通常のパイプラインであり、特定のルートにのみ固有のメッセージハンドラを持つことができるその他のパイプラインです。あなたは、ルートの特定のメッセージハンドラを追加したい場合は、次の操作を行うことができ

config.MessageHandlers.Add(new HandlerA()) 
    1. DelegatingHandlerを作成し、メッセージハンドラのごHttpConfigurationのリストに追加してみてください:

      config.Routes.MapHttpRoute(
            name: "DefaultApi", 
            routeTemplate: "api/{controller}/{id}", 
            defaults: new { id = RouteParameter.Optional }, 
            constraints: null, 
            handler: 
              HttpClientFactory.CreatePipeline(
                new HttpControllerDispatcher(config), 
                new DelegatingHandler[]{new HandlerA()}) 
            ); 
      

    This Web Api Posterはpipeliを示しネフロー。

  • +0

    ありがとうございます。解決策(1)はうまくいきます。しかし、2番の新しいHttpControllerDispatcher()は次のように言っています:** System.Web.Http.Dispatcher.HttpControllerDispatcherには0引数を取るコンストラクタが含まれていません** - 更新:コードを修正しました。ありがとうございました。 – Tohid

    +0

    私は上記投稿too.thanksを更新しました。 –

    +0

    またあなたのanswereにクオンルの回答のこの部分を追加してください:**カスタムメッセージハンドラを作成するには、あなたがから派生する必要があり 'System.Net.Http.DelegatingHandler' ** – Tohid

    11

    カスタムメッセージハンドラを作成するには、System.Net.Http.DelegatingHandler

    class CustomMessageHandler : DelegatingHandler 
    { 
        protected override Task<HttpResponseMessage> 
         SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
        { 
         IPrincipal principal = new GenericPrincipal(
          new GenericIdentity("myuser"), new string[] { "myrole" }); 
         Thread.CurrentPrincipal = principal; 
         HttpContext.Current.User = principal; 
    
         return base.SendAsync(request, cancellationToken); 
        } 
    } 
    

    から派生し、内側のハンドラに要求を送信するためにbase.SendAsyncを呼び出す必要があります。ここで

    +2

    @Cuonge Le - 回答ありがとうございます。 'CustomMessageHandler'をあなたのコードに置き換えた後、' return base.SendAsync(request、cancellationToken);でエラーが発生します。**内部ハンドラが割り当てられていません。何が私はもう一度逃した? – Tohid

    +0

    @Counge Le - あなたの答えとKirran Chall'sを組み合わせて、問題を修正しました。ありがとうございました。 – Tohid

    +0

    @Cuong Le .NET 4.0に相当するものは何ですか?私はDelegatingHandler for .NETを見つけることができませんでした.4 ...どのように4.0でメッセージ処理を行うことができます。ご協力いただきありがとうございます。 – jaxxbo

    関連する問題