WebApiContrib Jsonp и маршрутизация атрибутов

Согласно https://github.com/WebApiContrib/WebApiContrib.Formatting.Jsonp, кажется, что в RouteConfig.cs это должно быть введено:

routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{format}",
defaults: new { id = RouteParameter.Optional, format = RouteParameter.Optional }
);

В настоящее время у меня нет файла RouteConfig.cs в моем AppStart. Я создал его, используя шаблон Web API 2, и я не думаю, что я что-то изменил структурно. У меня есть WebApiConfig.cs, где я установил:

public static void Register (HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();
}

как включить его так, чтобы все маршруты могли возвращать Jsonp?

2 ответа

Вы можете создать собственный атрибут маршрута, который реализует IHttpRouteInfoProvider (который ищет построитель маршрутов Web API при добавлении маршрутов в таблицу маршрутов) и затем изменяет шаблон, который генерируется путем добавления {format}

Пример:

[RoutePrefix("api/values")]
public class ValuesController : ApiController
{
    [CustomRoute(Order = 1)]
    public IEnumerable<string> GetAll()
    {
        return new string[] { "value1", "value2" };
    }

    [CustomRoute("{id}")]
    public string GetSingle(int id)
    {
        return "value";
    }
}

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public sealed class CustomRouteAttribute : Attribute, IHttpRouteInfoProvider
{
    public CustomRouteAttribute()
    {
        Template = String.Empty;
    }

    public CustomRouteAttribute(string template)
    {
        if (template == null)
        {
            throw new ArgumentNullException("template");
        }

        if (template == string.Empty)
        {
            Template = template + "{format?}";
        }
        else
        {
            Template = template.TrimEnd('/') + "/{format?}";
        }
    }

    public string Name { get; set; }

    public int Order { get; set; }

    public string Template { get; private set; }
}

Я нашел этот комментарий в запросе на удаление, но я не понимаю, реализован ли он в производственном пакете или вообще не был извлечен.

Если вы используете маршрутизацию атрибутов, вы должны добавлять "/{format}" после каждого маршрута, если вы планируете использовать отображение URI для jsonp, например [Route("api/value/{id:int}/{format?}")], Если вам потребуется Content-Type заголовок для указания text/javascript Тогда вы можете оставить свои маршруты в покое. (См. Примеры приложений для примеров.)

Другие вопросы по тегам