2012-12-15 30 views
1

我正在嘗試編寫一個API。該簽名是這樣的:MVC4 API路由首先採取行動

public class CardsController : ApiController 
{ 
    [HttpGet] 
    public ClientData NewGame(){...} 
    [HttpGet] 
    public ClientData Deal(int sessionId){...} 
    [HttpGet] 
    public ClientData Stand(int sessionId){...} 
} 

與默認我得到一個錯誤,說我的課不能處理區分和林分一切。經過一番研究,我發現這是一個路由問題。所以我決定更新我的路由。

我的global.asax.cs現在看起來是這樣的:

public class MvcApplication : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     AuthConfig.RegisterAuth(); 
     RegisterRoutes(RouteTable.Routes); 
    } 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.MapHttpRoute("api", "api/{controller}/{action}/{value}", new { value = RouteParameter.Optional}); 
    } 
} 

http://localhost:54924/api/Cards/Stand/19給出說不HttpResource發現錯誤,並要http://localhost:54924/api/Cards/Stand觸發NewGame()行動。我怎樣才能讓Stand和Deal在同一個控制器上工作?

+0

當我嘗試過你的方式時出現錯誤,但是這對我有效:http:// localhost:54924/api/Cards/Stand?sessionId = 19 –

+0

@VaibhavDesai我可以看到你是如何設置的嗎?我得到了'找到多個匹配請求錯誤的操作'錯誤。 – Billdr

回答

1

添加的路線:現在

routes.MapHttpRoute("DealApi", 
        "api/{controller}/deal/{sessionId}", 
        new { action="Deal", sessionId = RouteParameter.Optional }); 


routes.MapHttpRoute("StandApi", 
        "api/{controller}/stand/{sessionId}", 
        new { action="Stand", sessionId = RouteParameter.Optional }); 

,在你的控制器類:

[HttpGet] 
[ActionName("Deal")] 
public ClientData Deal(int sessionId){...} 

[HttpGet] 
[ActionName("Stand")] 
public ClientData Stand(int sessionId){...} 

現在,每當你打開的URL http://www.yourhost.com/api/deal/12345,這筆交易功能將被調用。與Stand相同的東西。

請記住,無論您在路由表中設置什麼,只會用於識別網址是否有效。通過在第三個參數中指定動作,您告訴Web Api找到一個將其ActionName屬性設置爲您指定的值的函數。

另一件事 - 在你的任何默認api路線之前放這兩條路線。

+0

謝謝,這正是我正在尋找的。我對現在的路由工作有了更好的理解。 – Billdr

3

Web API適用於RESTful路由。在REST中,您有資源和標準操作:GET,POST,PUT,PATCH和DELETE。這就是你的行爲應該如何命名。 DealStand表示在RESTful路由中絕對注意。當你設計一個API時,你應該考慮使用這些資源的資源和標準HTTP動詞。在RESTful API中,控制器表示您的資源,HTTP動詞是您想要使用此資源執行的操作。

如果您想違反構建到Web Api路由中的默認RESTful約定,您將不得不修改您的路由設置並在其中包含{action}名稱。然後,您可以根據自己的意願爲自己的行爲命名。請記住,如果你正在設計一個API,那麼就有消費者堅持的標準。如果你想重新發明輪子,確保你有很好的API文檔。

+1

這不適用於外部消費,因爲它是供個人使用的。作爲結果,我並不太在乎自己的代碼註釋之外的文檔。至於在我的路線中設置{action},我以爲我做到了? – Billdr

+1

是的,你做到了。您還在路由中包含了一些「{value}」段,這些段在您的動作參數中無處可見。無論您的API是否公開顯示,您都應該考慮使用RESTful路由。否則,你真的錯過了Web API的全部觀點。如果是爲了內部使用,只需在消費應用程序中引用包含代碼的程序集,並且不要在Web API上浪費時間。你將失去更多的時間來使用不適合你需求的技術,而不是做一些有用的工作。 –

+0

我很欣賞這一課。乾杯。 – Billdr