Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как я могу расширить поведение согласования контента в MVC4?

Автор вопроса: Brandon LintonОтветов: 1

Я работаю над дизайном RESTful API, и один из вопросов, которые у меня есть о согласовании контента, я разместил на сайте Programmers StackExchange здесь.

Исходя из этого, меня интересует, как я буду поддерживать следующее поведение в MVC4:

  1. Если в URL-адресе указано расширение (например, GET /api/search.json или /api/search.xml), переопределите поведение согласования содержимого по умолчанию в MVC4.
  2. Если расширение не указано, используйте поведение по умолчанию для проверки значения заголовка accept на application/xml или application.json.

Каким будет самый чистый/самый простой способ захватить это расширение и изменить поведение согласования контента?

rest

Ответы

Ответ 1 · рейтинг 9 · carlosfigueira

Для этого вы можете использовать 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();
    }

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы