gpt4 book ai didi

asp.net - 如何扩展 MVC4 中的内容协商行为?

转载 作者:行者123 更新时间:2023-12-02 02:05:41 24 4
gpt4 key购买 nike

我正在研究 RESTful API 设计,我对内容协商的疑问之一已发布到程序员 StackExchange 站点 here .

基于此,我对如何支持 MVC4 中的以下行为感兴趣:

  1. 如果在网址上指定了扩展名(例如 GET/api/search.json/api/search.xml),则覆盖默认内容协商行为在MVC4中
  2. 如果未指定扩展名,则使用检查 application/xmlapplication.json 的接受 header 值的默认行为。

捕获此扩展并修改内容协商行为的最干净/最直接的方法是什么?

最佳答案

您可以在格式化程序中使用 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();
}

关于asp.net - 如何扩展 MVC4 中的内容协商行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9702659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com