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
Тогда вы можете оставить свои маршруты в покое. (См. Примеры приложений для примеров.)