【问题标题】:JSONP - WebApi EntitySetControllerJSONP - WebApi EntitySetController
【发布时间】:2013-10-05 19:32:29
【问题描述】:

我有一个 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

【问题讨论】:

  • 您找到解决问题的方法了吗?

标签: asp.net-mvc asp.net-web-api jsonp odata


【解决方案1】:

如何从 entitysetcontroller 返回 json 格式?
首先,您应该使用 nuget 中的 odatalib(5.6.0)。
并将此代码添加到客户端代码中

container.Format.UseJson();

【讨论】:

    【解决方案2】:

    EntitySetController 用专门的 OData 格式化程序替换格式化程序——这就是它返回 OData 格式的方式。

    编辑:OData 定义了响应的特定格式,这就是 EntitySetController 用 OData 格式化程序替换默认格式化程序的原因。

    您可能会覆盖默认的 OData 格式化程序以支持 JSONP。您需要从 System.Web.Http.OData.Formatter.ODataMediaTypeFormatter 派生。如果您将 ODataMediaTypeFormatter 实例放入格式化程序集合中,那么 EntitySetController 将不会替换它们。

    另外:您的应用是否可以使用 CORS 而不是 JSONP?

    【讨论】:

    • 这如何帮助我们将 EntitySetController 与 JSONP 结合使用?
    • 您需要扩展 OData 格式化程序以支持 JSONP。
    猜你喜欢
    • 2014-07-26
    • 2013-02-24
    • 2013-01-01
    • 2012-05-17
    • 2016-04-21
    • 2012-08-29
    • 2013-06-20
    • 2013-07-30
    • 2013-12-23
    相关资源
    最近更新 更多