我正在使用RESTful API设计,以及我发布到Programmers StackExchange网站here的内容协商问题之一。
基于此,我对如何在MVC4中支持以下行为感兴趣:
GET /api/search.json
或/api/search.xml
),则覆盖MVC4中的默认内容协商行为application/xml
或application.json
的接受标头值的默认行为。捕获此扩展并修改内容协商行为的最简洁/最直接的方法是什么?
答案 0 :(得分:9)
您可以在格式化程序中使用UriPathExtensionMapping来完成此操作。这些映射允许您为格式化程序“分配”扩展,以便在内容协商期间优先使用它们。您还需要添加路由,以便也可以接受带有“扩展名”的请求。下面的代码显示了默认模板中启用此方案所需的更改。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "Api with extension",
routeTemplate: "api/{controller}.{ext}/{id}",
defaults: new { id = RouteParameter.Optional, ext = RouteParameter.Optional }
);
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configuration.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "text/xml");
GlobalConfiguration.Configuration.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json");
BundleTable.Bundles.RegisterTemplateBundles();
}