簡體   English   中英

MVC4 API路由進入第一個操作

[英]MVC4 API Routing goes to first action

我正在嘗試編寫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在同一個控制器上工作?

Web API與RESTful路由一起使用。 在REST中,您可以使用它們進行資源和標准操作:GET,POST,PUT,PATCH和DELETE。 這就是你的行為應該被命名的方式。 DealStand意味着在RESTful路由中絕對注意到。 在設計API時,您應該考慮資源和可以使用這些資源執行的標准HTTP謂詞。 在RESTful API中,控制器表示您的資源,HTTP謂詞是您要使用此資源執行的操作。

如果要違反Web Api路由中內置的默認RESTful約定,則必須修改路由設置並在其中包含{action}名稱。 然后,您可以根據需要為自己的行為命名。 請記住,如果您正在設計API,則會有消費者遵守的標准。 如果您想重新發明輪子,請確保您有非常好的API文檔。

添加路線:

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 });

現在,在您的Controller類中:

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

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

現在,無論何時拉出網址http://www.yourhost.com/api/deal/12345 ,都會調用Deal函數。 與Stand相同。

請記住,您在路線表中設置的任何內容僅用於識別網址是否有效。 通過在第三個參數中指定操作,您將告訴Web Api找到一個ActionName屬性設置為您指定的函數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM