文章出處

問題

在 Controller 中有一個 public 的方法,但是又不想將這個 publlic 方法暴露成為一個 API。

 

解決方案

ASP.NET Web API 中,正常是通過 HTTP 謂詞來匹配 Controller 中相關 Action 的。默認情況下,Contoller 中的每個 public 方法都是一個 Action。為了防止 public 的方法成為 Action,只要在 public 的方法上使用 [NonAction] 屬性就可以。

 

工作原理

NoActionAttribute(如代碼片段 3-19 所示)是一個非操作類,其中沒有做任何事情,只是一個標記。

代碼片段 3-19. NonAction 定義

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class NonActionAttribute : Attribute
{
}

 

ApiControllerActionSeletor,在 Controller 找到合適的 Action 時,內部的驗證執行如代碼片段 3-10 所示,他將 Controller 中所有的 public 方法都作為潛在的 Action,然后再進行逐步篩選,聲明再 ApiController 的會被排除掉,聲明再 IHttpController 也會被排除掉,最后,如果使用了 NonActionAttribute 的也會被排除掉。

 

代碼片段 3-20 ApiControllerActionSelector 針對 Action 的過濾規則

 

注意 這段驗證邏輯是在 ApiControllerAtionSelector 內部的,如果自己代碼中繼承并實現了 IHttpActionSelector,要保證自己的實現中有類似邏輯的代碼,才能保證 NonActionAttribute 工作正常。

 

在 ReflectHttpActionDescriptor 類中 ASP.NET WEB API 會包裝每一個 Action,此外,他還負責找出 Action 應該處理 Http 的請求類型。他是通過方法名字或者在方法上使用了相關屬性(HttpGetAttribute,HttpPostAttribute,等等)。如果 Action 的名字是以 HTTP 動詞(GET,POST,PUT,DELETE)開頭的,ASP.NET WEB API 也會認為這 Action 適合處理相關 HTTP 類型的請求。

 

另外,Action 方法如果任何相關前綴或者聲明屬性都沒有,ASP.NET WEB API 會默認他只能處理 POST 請求。這個是一個很紅要,也很容易被忽略的地方。很多初學者會認為,什么前綴或者屬性聲明也沒有,那么,客戶端就不可能請求到這個 Action。

 

代碼演示

代碼片段 3-21 展示了三個 Action 方法。

  1. 處理 ASP.NET WEB API Get 請求。
  2. 處理 ASP.NET WEB API Post 請求(因為不使用任何 Http 謂詞的話,默認是 Post 請求)。
  3. 使用了 NonActionAttribute 來告訴 ASP.NET WEB API,這個 Controller 中的 public 方法不是 Action。

 

代碼片段 3-21. NonActionAttribute 例子

 

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()