以下のようなTwitter APIのような形式のURLにして、ApiコントローラークラスのKyukoアクションを実行させたいと考えています。
しばやんの「Twitter API のように拡張子で出力フォーマットを変えてみる - しばやん雑記」を参考にしてルーティング定義したのですが、2011年の記事でASP.NET MVCのバージョンが異なるためかKyukoアクションが呼ばれません。
kyuko.json
にアクセスすると、スタティックなファイルにアクセスしようとして404を返します。
Web.config
jsonファイルにアクセスした時にハンドリングさせるためにWeb.config
に以下の追記をします。
<system.webServer> <handlers> <add name="JsonFileHandler" path="*.json" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer>
RouteConfig.cs
ルーティング設定を追加します。RouteConfig.cs
にルーティングの定義を追加します。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace Kyuko { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Api", url: "api/{version}/{action}.{format}", defaults: new { controller = "Api", action = "Kyuko", version = 1, format = "json" } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); //... 省略 } }
Controller
コントローラーを作ります。formatに応じて出力するフォーマットを変更する方法はここでは紹介しませんので、元記事を参考にしてください。
public class ApiController : Controller { public ActionResult Kyuko(int? version, string format, string univ_id) { var model = new Product { Id = 10, Name = "かなり凄い商品", Price = 1980, Count = 10, }; return Json(model, JsonRequestBehavior.AllowGet); } }