加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – 从asp.net web api定制odata输出

发布时间:2020-12-16 04:35:00 所属栏目:asp.Net 来源:网络整理
导读:我正在使用新的ASP.NET webapi odata(版本4.0.0,根据Nuget上次发布于2013年2月27日) 基本上我按照这里描述的那样做:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api 我正在发布我的数据传输对象,并创建了odata atom pub feed,但我想
我正在使用新的ASP.NET webapi odata(版本4.0.0,根据Nuget上次发布于2013年2月27日)

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

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

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

解决方法

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,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,即别名类型名称和命名空间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读