1

興味深い状況があります。Microsoft WCF OData サービスで関数を呼び出す 2 つのアプリケーションがあります。

  1. OData4J ライブラリを使用する Android (v0.7)
  2. OData4ObjC ライブラリを使用する iOS ( iOS 6.1 のElizabeth Duncan フォーク)

OData サービスは、Microsoft WCF Data Service v5.6 を使用して記述されています。[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 Data Service を応答させることはできますか?
  3. 項目 1 および/または項目 2 を機能させるにはどうすればよいですか?


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>
4

1 に答える 1

1

たぶん私はあなたのシナリオを誤解していますが、あなたがここに投稿した例から、これはバージョン管理とは何の関係もないと思います. への呼び出しMyServiceCallは複雑な値のコレクションを返しますが、への呼び出しGetProductsByRatingはエンティティのコレクションを返します。Atom には「複雑な値のコレクション」という概念がないため、OData は独自の XML 形式を定義します。しかし、Atom は「エンティティのコレクション」の概念を定義しているため、OData は Atom のフィードの概念を再利用します。

したがって、ここではバージョン管理の問題は見られません。これは、さまざまな種類のペイロードがフォーマットされる方法の違いにすぎません。

HTTP ヘッダーを見ていて、v3 サーバーがペイロードが v1 であることを示すヘッダーで応答する理由について混乱している場合は、WCF Data Services サーバーは常に、その特定の応答に必要な最も低いバージョンで応答することに注意してください。 . そのため、v3 機能を持たないペイロードを v3 対応サーバーに要求すると、サーバーはペイロードを v2 または v1 としてマークします (そうしないと、v3 と互換性がないが実際にはこのペイロードを読み取ることができるクライアントをブロックする可能性があります)。 )。

于 2013-10-18T01:40:12.197 に答える