2013-11-12 19 views
1

согласно WebApiContrib.Formatting.Jsonp GitHub readme, оказывается, что в RouteConfig.cs это должно быть введено:WebApiContrib JSONP и атрибутов маршрутизации

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?

ответ

1

Вы можете создать атрибут пользовательского маршрута, который реализует 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; } 
} 
+0

Глядя на это сейчас. Не могли бы вы объяснить это немного больше? Клиент jQuery делает что-либо, кроме запроса jsonp? Не знаете, где находится часть {format}. – Robert

+0

Я не знаю, как работает JsonP: -) ... возможно, webapicontrib - это место, где можно найти больше об этом ... Я просто хотел показать, как вы можете включить изменение шаблона ... –

+0

Я бы предложил открыть другой вопрос, касающийся понимания jsonp и webapicontrib implementatoin. –

0

Я нашел этот комментарий в pull request, но я не понимаю, если это еще не реализовано в производственном пакете, и даже если его вообще нет.

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