2

我有3個的ASP.NET Web API的消息處理程序:的ASP.NET Web API的定製消息處理程序和全球

  • Handler1
  • Handler2
  • AuthorizeHandler

Handler1和Handler2是全局的(適用於所有路由),一個單獨的處理程序(AuthorizeHandler)適用於單一路由。

但是我在落實一些這方面的問題:

public static void Register(HttpConfiguration config) 
    {    
     config.MessageHandlers.Add(new Handler1()); //this will apply to all routes 
     config.MessageHandlers.Add(new Handler2()); //this will apply to all routes 


     config.MapHttpAttributeRoutes(); 


     config.Routes.MapHttpRoute(
      name: "FreeAPI", 
      routeTemplate: "api/free/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 


     config.Routes.MapHttpRoute(
      name: "SecretAPI", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional }, 
      constraints: null, 
      handler: new AuthorizeHandler() // this will apply just to this route 
         { 
          InnerHandler = new HttpControllerDispatcher(config) 
         } 
     );  

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 

基本上我嘗試做的是創建一個匿名的路線,其中任何人都可以不進行認證,需要爲了訪問身份驗證一個單一的路由呼叫。

但是,這個實現我做到了這一點不起作用。

例如,我希望將此端點設爲:api/free/someanonymouscontroller/someanonymousaction/someanonymousid作爲匿名,並將此端點api/somesecurecontroller/somesecureaction/somesecureid作爲需要身份驗證的安全設備。

如果我使用fiddler來測試它,在這個端點上:api/somesecurecontroller/somesecureaction/somesecureid如果我使用這個ednpoint,我不能訪問它沒有憑據:api/free/somesecurecontroller/somesecureaction/somesecureid(注意自由路徑)我可以訪問沒有處理程序觸發的安全端點..

回答

1

嗯,

我做了以下更改和接縫工作。我從模板{controller}中刪除並添加到默認值controller =「free」中。現在所有的要求都去了正確的地方...

這是正確的方法嗎?

config.Routes.MapHttpRoute(
     name: "FreeAPI", 
     routeTemplate: "api/free/{action}/{id}", 
     defaults: new { controller="free", id = RouteParameter.Optional } 
    );