Web API自定义OData MediaTypeFormatter并不尊重ModelBuilder信息

时间:2014-06-26 18:10:33

标签: asp.net-web-api odata

如果我为OData创建自定义媒体类型格式化程序,则序列化程序会忽略我的流畅API调用"忽略"某些属性。

假设我有以下OData配置:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var builder = new ODataConventionModelBuilder();
        var products = builder.EntitySet<Product>("Products");
        products.EntityType.Ignore(e => e.Name); // IGNORE NAME FIELD
        config.EnableQuerySupport();
        config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
    }
}

我已指定忽略Name属性。这一切都很好,Name属性被忽略。

如果我将以下代码添加到WebApiConfig类 - 直接使用默认的OData序列化器/反序列化器实例 - 我的Name属性不再被忽略:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var builder = new ODataConventionModelBuilder();
        var products = builder.EntitySet<Product>("Products");
        products.EntityType.Ignore(e => e.Name); // IGNORE NAME FIELD
        config.EnableQuerySupport();

        // INSERT CUSTOM FORMATTERS
        config.Formatters.InsertRange(0,
            ODataMediaTypeFormatters.Create(
            DefaultODataSerializerProvider.Instance,
            DefaultODataDeserializerProvider.Instance));

        config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
    }
}

当然,如果我实现自己的ODataSerializerProvider等,也会出现相同的结果,但出于示例的目的,我觉得值得注意的是,这甚至发生在默认实例上。

如果我使用以下属性&#34;忽略&#34;很荣幸:

public class Product
{
    public int Id { get; set; }
            [IgnoreDataMember]
    public string Name { get; set; }
}

但首先我不喜欢这种方法,其次我无法实际访问某些类来添加属性。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

找到答案。

而不是:

    config.Formatters.InsertRange(0,
        ODataMediaTypeFormatters.Create(
        DefaultODataSerializerProvider.Instance,
        DefaultODataDeserializerProvider.Instance));

使用:

    config.Formatters.Clear();
    config.Formatters.AddRange(
        ODataMediaTypeFormatters.Create(
        DefaultODataSerializerProvider.Instance,
        DefaultODataDeserializerProvider.Instance));