加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 07:23:30 所属栏目:asp.Net 来源:网络整理
导读:我正在通过RESTful API设计,以及我发布到Programmers StackExchange站点 here的内容协商的一个问题. 基于此,我对如何在MVC4中支持以下行为感兴趣: 如果在URL上指定了扩展名(例如,GET /api/search.json或/api/search.xml),则覆盖MVC4中的默认内容协商行为 如
我正在通过RESTful API设计,以及我发布到Programmers StackExchange站点 here的内容协商的一个问题.

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

>如果在URL上指定了扩展名(例如,GET /api/search.json或/api/search.xml),则覆盖MVC4中的默认内容协商行为
>如果未指定扩展名,请使用检查application / xml或application.json的accept头值的默认行为.

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读