將 REST Web Service 變更為使用 Action-Based Routing 方式處理路由

在 Tip 2 的圖中,紅色框住的 URI 是要順便指出,這個畫蛇添足版的 Web API 方法名稱是 HandMadeJson,它和先前的 Get() 一樣是 TestJsonController 的成員。

可是如果沒有額外動手腳,用戶端在存取 http://HostName/api/TestJson/HandMadeJson 這樣的 URI  時,仍然會由預設的 Get 方法來服務,而不會派送給 HandMadeJson。這是 routing 設定的緣故,把 App_Start\WebApiConfig.cs 裡面的 Register 方法稍微改一下就行了:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
        );

        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

原本的 MapHttpRoute() 呼叫所傳入的 routeTemplate 參數是 "api/{controller}/{id}",現在只是在中間多加了一個 "action" 而已。這種 routing 方式叫做 action-based routing。

加了一層 action 的路徑,可以讓 Web API 不受限於 Get、Post、Put、Delete 等 HTTP 動作方法的命名規則,提供更大的彈性,就好像在寫傳統的 Web service 或 HTTP Handler 那樣,可以自訂動作名稱。不過,這好像就不是純正的 REST 了?這點對我來說倒不是問題。




資料來源: https://www.huanlintalk.com/2013/01/aspnet-web-api-and-json.html

留言

這個網誌中的熱門文章

[C#]Windows 10 停用與啟用網路卡(連線)[手把手教程][原創]

ASP.NET Web API 將傳回的值轉換從控制器動作至 HTTP 回應訊息的方式。

[C#]程式更改電腦IP位置與電腦名稱