asp.net-web-api - 自定义 asp.net web api 的 odata 输出

标签 asp.net-web-api odata

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

基本上我是按照这里描述的方式进行的:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

我正在发布我的数据传输对象,并且创建了 odataatom pub feed,但我希望对其有更多的控制权。我主要希望能够执行以下操作:

  • 决定 Feed 的标题、作者和更新元素的内容
  • 决定是否有编辑链接
  • 更改 <category term="X" 中显示的内容并在 m:type在我的应用程序中的类的子属性中。目前,他们公开了带有完整命名空间的 C# 类名,但我不想公开这一点。

谢谢。

最佳答案

OData 媒体类型格式化程序现在更具可扩展性。示例如下。

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

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

关于asp.net-web-api - 自定义 asp.net web api 的 odata 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15132667/

相关文章:

c# - mvc调用api Controller PostAsJsonAsync操作方法名称获取

c# - 处理 ASP.NET Web API 中的非法查询字符串参数名称

odata - 确定 OData 服务器的版本

odata - 使用 OData 4 POST 到 WEB API 2 中的相关集合

c# - SQLite 异常 : "no such function: BigCount" when using "count" calling OData service with EntityFramework provider

excel - PowerPivot 未将基本身份验证中的授权 header 发送到 OData Svc

c# - Javascript ajax 调用无法访问我的 Web API Controller 页面。似乎无法获取正确的网址

asp.net-web-api - 未为预检 CORS 请求调用 WebApi DelegatingHandler

rest - 如何使 ASP.NET Web API 正确响应 403 或 401?

ios - 如何将 WCF 数据服务中的 JSON 图像数据转换为 iOS 中的 UIImage