2013-09-30 2 views
1

У меня есть проект web-api и добавлен форматировщик JSONP, и он протестирован отлично, используя стандартную реализацию WebApi. Мне также нужно выставить oData - однако форматор JSONP, похоже, игнорируется для контроллера oData с использованием EntitySetController?JSONP - WebApi EntitySetController

public class LogsController : EntitySetController<Log, int> 
{ 
    // other code here... 

    [Queryable(PageSize = 50,MaxTop = 100)] 
    public override IQueryable<Log> Get() 
    { 
     return entities.Logs; 
    } 

    protected override Log GetEntityByKey(int key) 
    { 
     return entities.Logs.FirstOrDefault(p => p.id == key); 
    } 
} 


public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
     modelBuilder.EntitySet<Log>("Logs"); 

     Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel(); 
     config.Routes.MapODataRoute("ODataRoute", "odata", model); 
    } 

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
      FormatterConfig.RegisterFormatters(GlobalConfiguration.Configuration.Formatters); 
    } 
} 

public class FormatterConfig 
{ 
    public static void RegisterFormatters(MediaTypeFormatterCollection formatters) 
    { 
     var jsonFormatter = formatters.JsonFormatter; 
     jsonFormatter.SerializerSettings = new JsonSerializerSettings 
     { 
      ContractResolver = new CamelCasePropertyNamesContractResolver() 
     }; 

     // Insert the JSONP formatter in front of the standard JSON formatter. 
     var jsonpFormatter = new JsonpMediaTypeFormatter(formatters.JsonFormatter); 
     formatters.Insert(0, jsonpFormatter); 


    } 
} 

Как я могу использовать EntitySetController с JSONP?

Пример URL:

GET http://example.com/odata/Logs?$orderby=id%20desc&$top=100&callback=jQuery19106219180973712355_1380508978486&_=1380508978487 HTTP/1.1 
+0

вы нашли решение вашей проблемы? – CoffeeCode

ответ

1

EntitySetController заменяет форматтеры со специализированными OData форматтеров - вот как он может вернуться формат OData.

EDIT: OData определяет конкретный формат ответов, поэтому EntitySetController заменяет форматирование по умолчанию на форматы OData.

Потенциально вы можете переопределить форматы OData по умолчанию для поддержки JSONP. Вам нужно будет получить от System.Web.Http.OData.Formatter.ODataMediaTypeFormatter. Если вы введете экземпляры ODataMediaTypeFormatter в коллекцию форматировщиков, то EntitySetController не заменит их.

Также: Возможно ли использовать приложение CORS вместо JSONP?

+0

И как это помогает нам использовать EntitySetController с JSONP? – Corey

+0

Вам нужно будет расширить форматы OData для поддержки JSONP. –

0

Как вернуть json-формат от лица-контролера?
Во-первых, вы должны использовать odatalib (5.6.0) из nuget.
И добавьте этот код в код клиента

container.Format.UseJson(); 
Смежные вопросы