如何使用v3协议进行OData v3 WCF数据服务调用

时间:2013-10-18 00:17:14

标签: android wcf ios6 odata odata4j

我有一个有趣的情况。我有两个应用程序调用Microsoft WCF OData服务上的函数:

  1. Android使用OData4J库(v0.7)
  2. iOS使用OData4ObjC库(适用于iOS 6.1的Elizabeth Duncan fork
  3. 使用Microsoft WCF Data Service v5.6编写OData服务。我在服务类中的方法上使用[WebGetAttribute()]属性:

    namespace MyServices
    {
        public class MyService : DataService<MyEntities>
        {
            public static void InitializeService(DataServiceConfiguration config)
                {
                    config.UseVerboseErrors = true;
                    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
                    config.SetServiceOperationAccessRule("MyServiceCall", ServiceOperationRights.ReadSingle);
                }
    
            [WebGet()]
            public IQueryable<MyComplexType> MyServiceCall()
            {
                return AListOfMyComplexTypes();
            }
        }
    }
    

    当Android应用程序进行OData函数调用时,WCF数据服务会以v1的复杂类型集合进行响应。当iOS库对WCF数据服务进行函数调用时,它期望使用v3返回集合。

    我的问题是:

    1. 是否可以让OData4ObjC库使用OData v1协议进行通信?
    2. 是否可以使用OData v3协议来响应WCF数据服务?
    3. 我需要做些什么才能让第1项和/或第2项工作?
    4. <小时/> 这就是我对OData v1响应的意思:

      <MyServiceCall
          xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices"
          xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
          <element m:type="MyService">
              <Id m:type="Edm.Int16">1</Id>
              <Name>Bariatric</Name>
              <IsEnabled m:type="Edm.Boolean">true</IsEnabled>
          </element>
          <element m:type="MyService">
              <Id m:type="Edm.Int16">2</Id>
              <Name>General</Name>
              <IsEnabled m:type="Edm.Boolean">true</IsEnabled>
          </element>
      </MyServiceCall>
      

      这就是我对OData v3响应的意思:

      <?xml version="1.0" encoding="utf-8"?>
      <feed xml:base="http://services.odata.org/V3/(S(ii5qwgb20wk0ptgfvvtlpwoy))/OData/OData.svc/" 
          xmlns="http://www.w3.org/2005/Atom" 
          xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
          xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"         
          xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
      <id>
      http://services.odata.org/V3/(S(ii5qwgb20wk0ptgfvvtlpwoy))/OData/OData.svc/GetProductsByRating</id>
      <title type="text">GetProductsByRating</title>
      <updated>2013-10-17T21:56:42Z</updated>
      <link rel="self" title="GetProductsByRating" href="GetProductsByRating" />
      <entry>
      <id>http://services.odata.org/V3/(S(ii5qwgb20wk0ptgfvvtlpwoy))/OData/OData.svc/Products(1)/id>
          <category term="ODataDemo.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
          <link rel="edit" title="Product" href="Products(1)" />
          <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Category" type="application/atom+xml;type=entry" title="Category" href="Products(1)/Category" />
          <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Supplier" type="application/atom+xml;type=entry" title="Supplier" href="Products(1)/Supplier" />
          <title type="text">Milk</title>
          <summary type="text">Low fat milk</summary>
          <updated>2013-10-17T21:56:42Z</updated>
          <author>
              <name />
          </author>
          <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Category" type="application/xml" title="Category" href="Products(1)/$links/Category" />
          <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks/Supplier" type="application/xml" title="Supplier" href="Products(1)/$links/Supplier" />
          <m:action metadata="http://services.odata.org/V3/(S(ii5qwgb20wk0ptgfvvtlpwoy))/OData/OData.svc/$metadata#DemoService.Discount" title="Discount" target="http://services.odata.org/V3/(S(ii5qwgb20wk0ptgfvvtlpwoy))/OData/OData.svc/Products(1)/Discount" />
              <content type="application/xml">
                  <m:properties>
                      <d:ID m:type="Edm.Int32">1</d:ID>
                      <d:ReleaseDate m:type="Edm.DateTime">1995-10-01T00:00:00</d:ReleaseDate>
                      <d:DiscontinuedDate m:null="true" />
                      <d:Rating m:type="Edm.Int32">3</d:Rating>
                      <d:Price m:type="Edm.Decimal">3.5</d:Price>
                  </m:properties>
              </content>
          </entry>
      </feed>
      

1 个答案:

答案 0 :(得分:1)

也许我误解了你的场景,但是根据你在这里发布的例子,我不认为这与版本控制有任何关系。对MyServiceCall的调用是返回复数值的集合,而对GetProductsByRating的调用则返回实​​体集合。由于Atom没有“复杂值集合”的概念,OData定义了自己的XML格式。但Atom确实定义了“实体集合”的概念,因此OData重用了Atom的feed概念。

所以我在这里看不到版本控制的问题。这只是不同类型的有效载荷格式化方式之间的差异。

如果您正在查看HTTP标头,并且您对v3服务器为何会响应指示有效负载为v1的标头感到困惑,请注意WCF数据服务服务器始终以所需的最低版本响应那个特别的回应。因此,如果您向具有v3功能的服务器询问没有v3功能的有效负载,则服务器会将有效负载标记为v2或v1(否则,它可能会阻止与v3不兼容但实际上能够读取此负载的客户端)。