Asp.net web api 从asp.net web api自定义odata输出

Asp.net web api 从asp.net web api自定义odata输出,asp.net-web-api,odata,Asp.net Web Api,Odata,我使用的是新的ASP.NET webapi odata(根据Nuget,4.0.0版最新发布于2013年2月27日) 基本上我是这样做的: 我正在发布我的数据传输对象,并创建了ODataAtom发布提要,但我希望对它有更多的控制。我主要希望能够做到以下几点: 决定提要的标题、作者和更新元素 决定是否要编辑链接 更改中显示的内容OData媒体类型格式化程序现在更具可扩展性。样品如下 1) 决定提要的标题、作者和更新元素 公共类AtomMetadataFeedSerializer:ODataFee

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

基本上我是这样做的:

我正在发布我的数据传输对象,并创建了ODataAtom发布提要,但我希望对它有更多的控制。我主要希望能够做到以下几点:

  • 决定提要的标题、作者和更新元素
  • 决定是否要编辑链接

  • 更改
    中显示的内容OData媒体类型格式化程序现在更具可扩展性。样品如下

    1) 决定提要的标题、作者和更新元素

    公共类AtomMetadataFeedSerializer:ODataFeedSerializer
    {
    公共AtomMetadataFeedSerializer(IEdmCollectionTypeReference edmType,ODataSerializerProvider serializerProvider)
    :base(edmType、serializerProvider)
    {
    }
    公共重写ODataFeed CreateODataFeed(IEnumerable feedInstance,ODataSerializerContext writeContext)
    {
    ODataFeed=base.CreateODataFeed(feedInstance,writeContext);
    feed.Atom().Title=new-AtomTextConstruction{Kind=AtomTextConstructKind.Text,Text=“My Awesome feed”};
    回馈;
    }
    }
    公共类CustomSerializerProvider:DefaultODataSerializerProvider
    {
    公共重写ODataEntrySerializer CreateDmTypeSerializer(IEdmTypeReference edmType)
    {
    if(edmType.IsCollection()&&edmType.AsCollection().ElementType().IsEntity())
    {
    //提要序列化程序
    返回新的AtomMetadataFeedSerializer(edmType.AsCollection(),this);
    }
    返回base.CreateEdmTypeSerializer(edmType);
    }
    }
    
    并使用注册自定义序列化程序提供程序

    config.Formatters.InsertRange(0,ODataMediaTypeFormatters.Create(新建CustomSerializerProvider(),新建DefaultODataDeserializerProvider());
    
    2) 自定义编辑链接

    公共类CustomEntityTypeSerializer:ODataEntityTypeSerializer { 公共CustomEntityTypeSerializer(IEdmEntityTypeReference edmType、ODataSerializerProvider serializerProvider) :base(edmType、serializerProvider) { } 公共重写ODataEntry CreateEntry(EntityInstanceContext EntityInstanceContext,ODataSerializerContext writeContext) { ODataEntry entry=base.CreateEntry(entityInstanceContext,writeContext); 如果(不生产编辑链接) { entry.EditLink=null; } 返回条目; } } 公共类CustomSerializerProvider:DefaultODataSerializerProvider { 公共重写ODataEntrySerializer CreateDmTypeSerializer(IEdmTypeReference edmType) { if(edmType.IsEntity()) { //实体类型序列化程序 返回新的CustomEntityTypeSerializer(edmType.AsEntity(),this); } 返回base.CreateEdmTypeSerializer(edmType); } }
    并如上所述注册自定义序列化程序提供程序


    我们仍然不支持场景3,即别名类型名称和名称空间。

    我们正在为ODataMediaTypeFormatter添加扩展性挂钩。在这之后,您应该能够自定义atom元数据。关于可选的编辑链接,有一个开放的codeplex,其中是ODataFeedSerializer。我有针对Microsoft ASP.NET Web API OData(v:4.0.1)的最新Nuget软件包。它似乎不在那里。它应该在我们的夜间版本中。您可以参考Henrik关于如何使用夜间构建的博客文章。myget提要url是:版本7是否有关于ODataMEdiaTypeFormmater的文档?Create()方法已更改,ODataMediaTypeFormatter也已更改。不再包含MessageWriterSettings.MediaTypeResolver,因此我无法确定如何将自定义格式设置程序绑定到特定的媒体类型。