2017-09-19 34 views
-7

干擾禁用REST約定這是我的API配置類:如何從我的ApiController

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}" 
     ); 
    } 
} 

這是我的API控制器類:

public class RoleController : ApiController 
{ 

    // Some action that works fine... 
    // Another action that works fine... 

    public Result Delete([FromBody]int RoleID) 
    { 
     return RoleBL.Delete(RoleID); 
    } 
} 

我打電話使用POST和他們自己的行爲工作正常。 但是,當我嘗試調用使用POST我收到以下錯誤Delete行動:

405 Method Not Allowed

The requested resource does not support http method 'POST'.

很明顯,這是因爲ApiController強制REST約定 其預計DELETE動詞爲Delete行動。

現在,我該如何禁用此REST約定約束 並以經典方式編寫我的操作?

+4

這就是所謂的「約定配置」,你不能禁用它,你甚至不應該嘗試。遵循REST或不使用REST名稱。 –

回答

2

可以使用HttpPostAttribute強制執行行動只接受POST

public class RoleController : ApiController 
{  
    [HttpPost] 
    public Result Delete([FromBody]int RoleID) 
    { 
     return RoleBL.Delete(RoleID); 
    } 
} 
+2

請不要'發佈'到'刪除'資源。對您的api – Alex

+1

@Camilo的消費者做一件可怕的事情不會那麼做。然後發佈你自己的答案。 – CodeCaster

+0

@Alex我使用'POST'而不是'DELETE'來處理應用程序,因爲'DELETE'被防火牆策略阻止,所以有時候你沒有太多選擇。 –

2

你可能想保持REST公約同時允許某些客戶端(如HTML表單)正確使用你的行動。
所以,你可以使用HttpPostAttributeHttpDeleteAttributeAcceptVerbsAttribute(它允許多個動詞)的組合,以允許多個動詞:

public class RoleController : ApiController 
{  
    [HttpPost, HttpDelete] 
    // OR 
    [AcceptVerbs("DELETE", "POST") 
    public Result Delete([FromBody]int RoleID) 
    { 
     return RoleBL.Delete(RoleID); 
    } 
} 
+0

好的,是否有另一種類型的控制器類可以繼承,而不是休息啓用? – Dusan

+0

我不想使用REST,但只是一個沒有魔法動詞和魔術動作名稱的經典方法 – Dusan

+0

使用這種方法你不必?只是'POST'到'角色/刪除/ 123'(不舒服,因爲這讓我感覺) – Alex

0

如果你不希望魔術動詞和魔法動作名稱,你可以使用路由屬性。 刪除config.Routes.MapHttpRoute並設置:

config.MapHttpAttributeRoutes(); 

現在你必須手動設置路線:

[RoutePrefix("~/Role")] 
public class RoleController : ApiController 
{ 

    [HttpPost] 
    [Route("~/Delete")] 
    public Result Delete([FromBody]int RoleID) 
    { 
     return RoleBL.Delete(RoleID); 
    } 
} 
0

在你的情況我會停止使用任何類型的REST慣例。

而不是角色控制器上有一個刪除方法,你可以有一個DeleteRole方法,並允許POST。這樣,沒有什麼會干擾你想做的事情。如果這不是你所需要的,沒有什麼能夠強制你建立一個REST API。

有幾件事你可以做,仍然建立一個很好的API。

例如,你可以返回一個IHttpActionResult

你的方法看起來是這樣的:

public class RoleController : ApiController 
{  
    [HttpPost] 
    public IHttpActionResult DeleteRole([FromBody]int RoleID) 
    { 
     if (RoleID <= 0) 
     { 
       return BadRequest(); 
     } 

     var deleteResult = RoleBL.Delete(RoleID); 
     return Ok(deleteResult); 
    } 
} 

你還是返回相同的對象,但它包裹的物體內部進行適當的HTTP代碼,以便您的代碼處理結果的變化不會太大。