【问题标题】:How to produce ATOM formatted ODATA service with ASP.NET WebApi 2.2?如何使用 ASP.NET WebApi 2.2 生成 ATOM 格式的 ODATA 服务?
【发布时间】:2017-05-11 11:34:52
【问题描述】:

如何在 ASP.NET WebApi 2.2 ODATA 服务中生成 ATOM 格式的输出?创建 JSON 版本或简单的 XML 格式很容易。但无论我如何请求 Content-Type,我总是在配置中获得第一种格式。 (使用 PostMan for Chrome,或者在 producer 方法中设置 Request 的 Content-Type。)

如果我使用 WCF 数据服务,我会得到 ATOM 格式的结果。但据我了解,ODATA v4 仅在 WebApi 中实现,而不在 WCF 中实现。所以,这似乎有点奇怪,我不能以任何我喜欢的方式格式化它......

我的配置代码是基本的:

   config.MapODataServiceRoute(
        routeName: "ODataRoute",
        routePrefix: null,
        model: builder.GetEdmModel());

谢谢,

反人才

更新: 使用typical solution found on the net(来自第一条评论的链接,@mdisibrio),我得到了这个(WebApi 2.2):

<ODataServiceDocument 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/Microsoft.OData.Core">
  <EntitySets>
    <ODataEntitySetInfo>
      <Name>Projects</Name>
      <Title i:nil="true"/>
      <Url>Projects</Url>
    </ODataEntitySetInfo>
  </EntitySets>
  <FunctionImports/>
  <Singletons/>
</ODataServiceDocument>

但我想得到的是(WCF 数据服务):

<service xmlns="http://www.w3.org/2007/app"
 xmlns:atom="http://www.w3.org/2005/Atom" 
 xml:base="http://MYSERVER/Service.svc/">
  <workspace>
    <atom:title>Default</atom:title>
    <collection href="ProjectList">
    <atom:title>ProjectList</atom:title>
    </collection>
  </workspace>
</service>

是的,我完全清楚,实体有不​​同的名称。这不是我的问题。

【问题讨论】:

  • this answer 是否解决了您想要完成的任务?它将向请求处理程序添加一个原子格式化程序。不幸的是,v4 默认不添加它。
  • @mdisibio:谢谢。已经试过了。它确实生成 XML,但格式不正确。查看我的更新。
  • Arrrg...我花了很长时间才弄清楚如何获得 xml 响应,以至于我从未注意到它是普通的旧 xml 而不是 Atom。 This is the closest explanation 我发现这很有意义,从 6.1 库开始:OData 核心库能够序列化 OData v4 Atom 格式,但由于 Atom 规范尚未处于 CS2 阶段,因此并未得到官方支持。

标签: asp.net-web-api odata atom-feed


【解决方案1】:

从此链接借用: How to disable Formatters in Web Api OData web service

您可以在 WebApiConfig 中添加您希望使用的任何格式化程序。因此,对于您的示例,我认为您想这样做:

var odataFormatters = ODataMediaTypeFormatters.Create();
odataFormatters = odataFormatters.Where(
    f => f.SupportedMediaTypes.Any(
        m => m.MediaType == "application/atom+xml" ||
            m.MediaType == "application/atomsvc+xml")).ToList();

config.Formatters.Clear();
config.Formatters.AddRange(odataFormatters);

【讨论】:

  • 有了你的解决方案我得到406Not Acceptable
猜你喜欢
  • 2013-03-12
  • 2011-05-08
  • 2012-12-28
  • 2013-11-26
  • 2018-09-23
  • 2015-03-12
  • 2015-02-07
  • 2015-03-07
  • 1970-01-01
相关资源
最近更新 更多