現在、WebApi と WCF Data Services の間には他にも大きな違いがあり、誰も言及していないようです。MSが2つを比較する良い記事を出してくれることを願っています.
私はしばらく OData と WebApi をフォローしてきました。私はいつもいくつかの大きな違いを見つけてきました。
まず、あなたの上司が「MS は WebApi を支援している」と言って、彼らが OData を支援していないという意味で何を意味しているのかわかりません?? IMO、彼らは両方を支持しており、現在、最小限の重複があります。Windows Azure Data Market は OData を使用してデータを公開し、Azure Table Storage は OData を使用し、SharePoint 2010 はそのデータに対する OData クエリを許可し、MS の他の製品 (Excel PowerPivot など) もそれをサポートしています。リレーショナル データに関しては、非常に強力なクエリ フレームワークです。また、RESTful であるため、あらゆる言語、フレームワーク、デバイスなどを統合できます。
OData + WCF Data Services について私が気に入っている点は次のとおりです。
OData + WCF Data Services により、最終的にクライアント アプリケーションは、Web 経由でデータをクエリするときに、より「表現力豊か」になります。以前は、常に ASMX または WCF を使用して厳格な Web API を構築する必要がありましたが、これは扱いにくく、UI が少し異なるものを必要とするたびに常に変更を加える必要がありました。クライアント アプリケーションは、返す基準を指定するパラメータのみを指定できました。または、私が行ったようにLINQ式を「シリアル化」し、それらをパラメーターとして渡しExpressions<Func<T,bool>>
、サーバーに再水和します。そのまともな。作業は完了しましたが、クライアントで LINQ を使用し、REST を使用して Web 経由で変換したいと考えています。これはまさに OData が許可するものであり、ソリューションの独自の「ハック」を使用したくありません。
これは、DB 接続文字列を必要とせずに「TRANSACT SQL」を公開するようなものです。URL を指定するだけで、おっと! クエリを開始します。もちろん、WebApi と WCF Data Services の両方が認証/承認をサポートしているため、アクセスを制御したり、ロールやその他のデータ構成に基づいて追加の "Where" ステートメントを追加したりできます。これは、SQL ではなく Web Api レイヤーで行いたいと思います (ビューやストアド プロシージャの構築など)。アプリケーションがクエリ自体を作成できるようになったので、アドホックおよび BI レポート ツールが OData を活用し始め、ユーザーが独自の結果を定義できるようになります。最小限の制御しかできない静的レポートに依存しない。
Silverlight、Windows 8 Metro、または ASP.NET (MVC、WebForms など) で開発する場合、Visual Studio の「サービス リファレンス」を WCF データ サービスに追加するだけで、すぐに LINQ を使用してデータのクエリを開始できます。クライアントの「データ コンテキスト」。これは、変更を追跡し、変更を原子的にサーバーに「送信」できることを意味します。これは、Silverlight の RIA サービスと非常によく似ています。RIA サービスの代わりに WCF Data Services を使用していたでしょうが、当時は DataAnnotations や Actions をサポートしていませんでしたが、現在はサポートしています :) WCF Data Services には、RIA サービスよりも別の利点があります。クライアントから。これは、エンティティからすべてのプロパティを返したくない場合に、パフォーマンスに役立ちます。「データコンテキスト」を持つ
そのため、特に SQL Server と Entity Framework を使用している場合、リレーションシップを持つデータがある場合、WCF Data Services は優れています。非常に少ないコードで REST を介してクエリ可能なデータ + アクション (オペレーションを呼び出すための呼び出し、つまりワークフロー、バックグラウンド プロセス) をすぐに公開できます。WCF Data Services が更新されました。新しいリリースが開始されました。すべての新機能をチェックしてください。
WCF Data Services の欠点は、HTTP スタックに対する "制御" が失われることです。最大の欠陥は、IQueryable<T>
コレクションを返すメソッドにあることがわかりました。RIA サービスや WebApi とは異なり、IQueryable メソッドでロジックを開発するための完全なアクセス権はありません。RIA Services と WebApi では、 を返す限り、任意のコードを記述できますIQueryable<T>
。Expression<Func<T,bool>>
WCF Data Services では、インターセプター メソッドを使用して "Where" ステートメントを追加するためのアクセスのみを取得します。これはがっかりしました。現在のアプリケーションは RIA サービスを使用しており、IQueryable ロジックを制御する機能が本当に必要であることがわかりました。私はこれについて間違っているといいのですが、何かが足りないだけです
また、WCF Data Services はまだすべての LINQ オペレーターを完全にサポートしていません。ただし、WebApi 以外もサポートしています。
WebApiはどうですか???
- HTTP リクエスト/レスポンスの制御が好き
- 従うのは簡単です (MVC パターンを活用します)。きっとツールが増えると思います。
WebApi は実際には WCF Data Services/OData のようなエンティティ データ モデルに関するものではないため、現時点では (私の理解では)、クライアント (つまり、Silverlight、ASP.NET サーバー側コードなど) での「データ コンテキスト」のサポートはありません。は。IQueryable/IEnumerable を使用してモデル オブジェクトのコレクションを公開できますが、「データ コンテキスト」がないため、エンティティがクライアントにロードされた後に使用するプライマリ キー/外部キー「ナビゲーション プロパティ」(つまり、customer.Invoices) はありません。それらを非同期に (または $expand を使用した 1 回の呼び出しで) ロードし、変更を管理します。RIA Services や WCF Data Services の場合のように、コードで生成された Entity Data Model の "表現" はクライアントにはありません。私は、あなたのデータを表すモデルをクライアントに持つことができない、または持たないと言っているのではありません。ただし、手動でデータを入力し、Web 経由で取得した各「顧客」にどの「請求書」を設定するかを管理しています。これは、特にすべての非同期処理が行われている場合、注意が必要です。どのコールが最初に戻ってくるかわかりません。ここで説明するのは難しいかもしれませんが、RIA サービスの「データ コンテキスト」に関する説明を読んでください。WCF データ サービス. したがって、基幹業務アプリを扱う場合、これは私にとって大きな問題です。これは主に生産性と保守性に基づいています。データ コンテキストがなくてもアプリを構築できます。特に Silverlight、WPF、そして現在の Windows 8 Metro では、物事が簡単になります。リレーショナル エンティティを非同期的にメモリにロードし、Two-Binding を使用すると、非常に便利です。
そうは言っても、これはいつかWebApiがクライアントで「データコンテキスト」をサポートできるということですか? できると思います。また、より多くのツールを使用すると、Visual Studio プロジェクトはデータベース スキーマ (またはエンティティ フレームワーク) に基づいてすべての CRUD メソッドを生成できます。
また、WCF Data Services または WebApi での作業に関しては、.NET から .NET Frameworks についてのみ言及していることはわかっていますが、HTML/JS も主要なプレーヤーであることは十分承知しています。Silverlight UI や ASP.NET サーバーサイド コードなどを扱うときに見つけた利点について言及したところです。HTML5/JavaScript で「データ コンテキスト」とJavaScript の LINQ フレームワークも利用可能になる可能性があり、JavaScript から OData サービスのクエリを実行する機能がさらに簡単になります (現在、OData で DataJS を使用できます)。さらに、KnockoutJS を使用して MVVM と Binding を HTML/JS でもサポートすると、簡単になります :)
現在、どのプラットフォームを使用するかを調査中です。どちらを使用しても問題ありませんが、次のアプリケーションは主に分析 (読み取り専用) に関するものであり、表現力豊かな RESTful Api が必要であるという事実に基づいて、OData に傾倒する傾向があります。OData + WCF Data Services は、WebApi がコレクションに対して $take、$skip、$filter、$orderby のみをサポートしているため、それを提供してくれると思います。プロジェクション、インクルード ($expand) などはサポートしていません。「更新/削除/挿入」はあまりなく、データはかなりリレーショナルです。
他の人が議論に参加して、考えを述べてくれることを願っています。まだ検討中ですので、他の方のご意見もお待ちしております。どちらも素晴らしいフレームワークだと思います。どちらかを選ばなければならないのだろうか、必要に応じて両方を使用してみませんか。クライアントからは、とにかく REST 呼び出しを構築することがすべてです。ちょっとした考え :)