1

を働いていないと: enter image description hereHttpMessageHandler MapHttpAttributeRoutesが、私はこのイメージにMessageHandler3の動作を取得しようとしている<a href="https://www.asp.net/web-api/overview/advanced/http-message-handlers" rel="nofollow">this tutorial</a>をfollwoingてる

これは私のコントローラのいずれかの一部です:

public class UserController : ApiController 
    { 
[Route("api/users")] 
     [ResponseType(typeof(User))] 
     public IHttpActionResult PostUser([FromBody]User newUser) 
     { 
      try 
      { 
       userService.InsertUser(newUser); 
       return Ok(newUser); 
      } 

      catch (Exception e) 
      { 
       return BadRequest(e.Message); 
      } 
     } 
} 

ですダミーバージョンのハンドラ:

public class UserTokenHandler : DelegatingHandler 
    { 
     public UserTokenHandler() 
     { 
     } 

     protected override Task<HttpResponseMessage> SendAsync(
      HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
      if (true)//actual validation method 
      { 
       var response = new HttpResponseMessage(HttpStatusCode.Unauthorized); 
       var tsc = new TaskCompletionSource<HttpResponseMessage>(); 
       tsc.SetResult(response); 
       return tsc.Task; 
      } 
      return base.SendAsync(request, cancellationToken); 
     } 
} 

ここでは、WebApiConfigの変更点を示しますクラス:

public static class WebApiConfig 
     { 
      public static void Register(HttpConfiguration config) 
      { 
       //config.MapHttpAttributeRoutes(); 
       var handlers = new DelegatingHandler[] { new UserTokenHandler() }; 
       var routeHandlers = HttpClientFactory.CreatePipeline(new HttpControllerDispatcher(config), handlers); 
       config.Routes.MapHttpRoute(
        name: "DefaultApi", 
        routeTemplate: "api/{controller}/{id}", 
        defaults: new { id = RouteParameter.Optional }, 
        constraints: null, 
        handler: routeHandlers 
       ); 
       config.MapHttpAttributeRoutes(); 
      } 
     } 

私の問題はコメント行にあります。私はそれを含めるか、最後にそれを置く(それが今であるように)ハンドラが実行されるが、私のAPIを使用しようとすると、私はこのエラーを取得しない場合:

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:12986/api/users'.", 
    "MessageDetail": "No type was found that matches the controller named 'users'." 
} 

しかし、私はそれをアンコメント(および削除した場合一番下のもの)ハンドラを経由せずにコントローラに直接行きます。

ハンドラを実行してメソッドを見つけることができますが、どうすれば修正できますか?

+0

最初の試合が優勝するため、マップの順序が重要です。コンベンショナルルートの前にアトリビュートルートをマップする – Nkosi

答えて

1

を呼び出す前

config.MapHttpAttributeRoutes(); 

を呼び出すことが決定的に重要です。

config.MessageHandlers.Add(new UserTokenHandler()); 
config.MapHttpAttributeRoutes(); 
//...other code 

私は、これはスロットルハンドラを実装するのです行われ、魔法のように動作しますが、これは、入ってくるすべての要求に適用されるであろうしました。

あなたはこれが唯一のユーザコントローラを申請したい場合は、以下を行う必要がありアトリビュートルートをあきらめ、ユーザコントローラに対してコンベンションベースのルートを使用します。

ただし、あなたがリンクした記事のように、コンベンションベースのルートと属性ルートが混在していると、うまくミックスできません。これは、コンベンションベースのルーティングに適しています。

+0

特定のルートに対してのみハンドラを使用したい場合は、この作業はできますか? – moondaisy

+0

規則に基づくルートまたは属性ルートあなたの例ではコントローラに属性ルートがありますが、コンベンションベースのルートにデリゲートを適用しようとしています – Nkosi

+0

これをユーザコントローラにのみ適用する場合は、属性ルートを断念し、ユーザーコントローラー – Nkosi

0

メモリが正しく私を提供している場合、それはあなたがしたい場合は、実際にマッピングする前にハンドラを追加することができます

config.Routes.MapHttpRoute 
+0

そうすると、ハンドラは完全に無視されます – moondaisy

関連する問題

 関連する問題