Как я могу расширить поведение согласования контента в MVC4? - PullRequest
4 голосов
/ 14 марта 2012

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

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

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

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

1 Ответ

9 голосов
/ 14 марта 2012

Для этого вы можете использовать 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...