从asp.net web api定制odata输出

时间:2013-02-28 10:06:05

标签: asp.net-web-api odata

我正在使用新的ASP.NET webapi odata(根据Nuget最新发布的2013年2月27日版本4.0.0)

基本上我按照这里描述的那样做:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

我正在发布我的数据传输对象并创建了odata atom pub feed但我希望能够对它进行更多控制。主要是我希望能够做到以下几点:

  • 决定Feed的标题,作者和更新元素的内容
  • 决定是否拥有编辑链接
  • 更改我的应用中的类的子属性中的<category term="X"m:type中显示的内容。目前,他们使用完整的命名空间公开c#类名称,但我不想公开它。

感谢。

1 个答案:

答案 0 :(得分:11)

OData媒体类型格式化器现在更具扩展性。样本如下。

1)决定Feed的标题,作者和更新元素的内容

public class AtomMetadataFeedSerializer : ODataFeedSerializer
{
    public AtomMetadataFeedSerializer(IEdmCollectionTypeReference edmType, ODataSerializerProvider serializerProvider)
        : base(edmType, serializerProvider)
    {
    }

    public override ODataFeed CreateODataFeed(IEnumerable feedInstance, ODataSerializerContext writeContext)
    {
        ODataFeed feed = base.CreateODataFeed(feedInstance, writeContext);
        feed.Atom().Title = new AtomTextConstruct { Kind = AtomTextConstructKind.Text, Text = "My Awesome Feed" };
        return feed;
    }
}

public class CustomSerializerProvider : DefaultODataSerializerProvider
{
    public override ODataEntrySerializer CreateEdmTypeSerializer(IEdmTypeReference edmType)
    {
        if (edmType.IsCollection() && edmType.AsCollection().ElementType().IsEntity())
        {
            // feed serializer
            return new AtomMetadataFeedSerializer(edmType.AsCollection(), this);
        }

        return base.CreateEdmTypeSerializer(edmType);
    }
}

使用

注册自定义序列化程序提供程序
config.Formatters.InsertRange(0, ODataMediaTypeFormatters.Create(new CustomSerializerProvider(), new DefaultODataDeserializerProvider()));

2)自定义编辑链接

public class CustomEntityTypeSerializer : ODataEntityTypeSerializer
{
    public CustomEntityTypeSerializer(IEdmEntityTypeReference edmType, ODataSerializerProvider serializerProvider)
        : base(edmType, serializerProvider)
    {
    }

    public override ODataEntry CreateEntry(EntityInstanceContext entityInstanceContext, ODataSerializerContext writeContext)
    {
        ODataEntry entry = base.CreateEntry(entityInstanceContext, writeContext);
        if (notProduceEditLinks)
        {
            entry.EditLink = null;
        }

        return entry;
    }
}

public class CustomSerializerProvider : DefaultODataSerializerProvider
{
    public override ODataEntrySerializer CreateEdmTypeSerializer(IEdmTypeReference edmType)
    {
        if (edmType.IsEntity())
        {
            // entity type serializer
            return new CustomEntityTypeSerializer(edmType.AsEntity(), this);
        }

        return base.CreateEdmTypeSerializer(edmType);
    }
}

并按上述方式注册自定义序列化程序提供程序。

我们仍然不支持方案3,即别名类型名称和命名空间。