【问题标题】:How implement a OData V4 services like official example services?如何实现像官方示例服务这样的 OData V4 服务?
【发布时间】:2015-10-24 07:22:17
【问题描述】:

示例服务的含义如下: http://services.odata.org/V4/Northwind/Northwind.svc/

我的问题是:

  1. 为什么这个服务有一个“.svc”后缀?据我所知,现在只有两种方法可以在.Net平台上实现odata v4服务,RESTier和WebAPI,见http://odata.github.io/,但它们都没有“.svc”。其实wcf数据服务有“.svc”,但是wcfds不支持odata v4。

  2. 这个示例服务的响应体是高度优化的,像这样:

    HTTP/1.1 200 OK
    Cache-Control: private
    Content-Length: 2015
    Content-Type: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8
    Expires: Sat, 24 Oct 2015 05:10:34 GMT
    Vary: *
    Server: Microsoft-IIS/8.0
    X-Content-Type-Options: nosniff
    OData-Version: 4.0;
    X-AspNet-Version: 4.0.30319
    ...
    
    {"@odata.context":"http://services.odata.org/V4/Northwind/Northwind.svc/$metadata","value":[{"name":"Categories","kind":"EntitySet","url":"......
    

    只有一行,又像 wcfds,但我的服务是这样的:

    HTTP/1.1 200 OK
    Cache-Control: no-cache
    Pragma: no-cache
    Content-Type: application/json; odata.metadata=minimal; charset=utf-8
    Expires: -1
    Vary: Accept-Encoding
    Server: Microsoft-IIS/7.5
    OData-Version: 4.0
    X-AspNet-Version: 4.0.30319
    X-Powered-By: ASP.NET
    Date: Sat, 24 Oct 2015 06:56:24 GMT
    Content-Length: 364
    
    {
      "@odata.context":"http://192.168.1.99:908/api/$metadata","value":[
        {
          "name":"Test","kind":"EntitySet","url":"Test"
        },{
          "name":"TDefStoreEmp","kind":"EntitySet","url":"TDefStoreEmp"
        },{
          "name":"TDefEmp","kind":"EntitySet","url":"TDefEmp"
        },{
          "name":"TDefStore","kind":"EntitySet","url":"TDefStore"
        }
      ]
    }
    

    行太多,怎么一行?

  3. 所以我怀疑示例服务基于 wcfds,但它如何支持 V4?其实我喜欢wcfds,因为它不需要任何Controllers,我只想公开一个数据库但不想在互联网上打开1433端口。

我的英文不好,请理解并帮助我,谢谢!

【问题讨论】:

    标签: odata northwind


    【解决方案1】:
    1. 你是对的,这个演示服务是使用 WCF 数据服务实现的。 基于web api的demo服务,可以参考:

    http://services.odata.org/TripPinWebApiService

    官方不支持OData V4的WCF数据服务,建议改用WebAPI。

    1. 这称为 JSON 的缩进,默认情况下已启用。 要禁用缩进,请在您的 webapi 配置代码中添加以下内容:

      var formatters = ODataMediaTypeFormatters.Create();

      foreach(格式化程序中的 var 格式化程序) { 格式化程序.MessageWriterSettings.Indent = false; }

      config.Formatters.InsertRange(0, formatters);

    2. 源 WCF 数据服务在此处公开可见: https://github.com/OData/odata.net/tree/WCFDSV4

    请注意,该实现确实与 OData V4 规范存在一些差距。但如果您有兴趣,可以随意自行构建它或添加新功能。

    按照建议,建议使用 WebAPI OData 来设置 OData V4 服务。此外,您可以选择使用更类似于 wcfds 样式的 RESTier。

    【讨论】:

    • 原来如此,我明白了,非常感谢您回答我!关于 JSON 的缩进,我在“WebApiConfig.cs”中使用了您的代码,它适用于服务的根 url,例如:请求xxx/api,然后获取像“{”@odata.context“:”@ 987654324@{"name":"TAccStock..." 在一行中,但它不适用于实体,请求xxx/api/Emp?$top=10,再次返回多行。我会试试这个 WCFDSV4 库。我试过RESTire,搭建一个服务很简单,但是有一些问题让我失望,比如datetime -> Edm.Date,导致时间数据丢失。谢谢。
    • 不好意思,我有点好奇,为什么你知道官方的demo是基于wcfds的?尤其是“非官方支持”,你是官方内部人吗^_^?只是好奇,你没有回应我。无论如何,再次感谢您。
    • 关于json缩进,上面的注释是在RESTier上的,我在WebApi上测试过,没问题,root和entity都返回一行。我不知道为什么 RESTier 有问题。
    • 1.wcfds,详细请参考这篇博文:blogs.msdn.com/b/odatateam/archive/2014/03/27/… 2.restier 不工作,看起来是由于下面的代码(做同样的事情,但忽略了设置) ,也许我们可以为此创建一个错误:github.com/OData/RESTier/blob/master/src/…
    • 谢谢,恐怕没有更多的时间和能力继续尝试这个,可能我的项目中还在使用熟悉的webservice/xml,等RESTier更成熟了,我再试试。
    【解决方案2】:

    如果您正在寻找 TripPin OData 示例,您可以在这里找到它:

    https://github.com/OData/ODataSamples/tree/master/Scenarios/TripPin

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      相关资源
      最近更新 更多