我有一个web api项目,并添加了一个JSONP格式化程序,并使用标准的WebApi实现进行了测试。我还需要公开oData - 但是使用EntitySetController的oData控制器似乎忽略了JSONP格式化程序?
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一起使用?
示例网址:
GET http://example.com/odata/Logs?$orderby=id%20desc&$top=100&callback=jQuery19106219180973712355_1380508978486&_=1380508978487 HTTP/1.1
答案 0 :(得分:1)
EntitySetController用专门的OData格式化程序替换格式化程序 - 这就是它如何返回OData格式。
编辑:OData定义了响应的特定格式,这就是EntitySetController用OData格式化程序替换默认格式化程序的原因。
您可以覆盖默认的OData格式化程序以支持JSONP。您需要从 System.Web.Http.OData.Formatter.ODataMediaTypeFormatter 派生。如果将ODataMediaTypeFormatter实例放入formatters集合中,则EntitySetController不会替换它们。
另外:您的应用是否可以使用CORS而不是JSONP?
答案 1 :(得分:0)
如何从entitysetcontroller返回json格式?
首先,你应该使用nuget的odatalib(5.6.0)。
并将此代码添加到客户端代码
container.Format.UseJson();