セッション ID: T4-303 Open Data Protocol (OData) と WCF Data Services によるサービスの作成 マイクロソフト株式会社 デベロッパー&プラットフォーム統括本部 エバンジェリスト 井上大輔 セッションの目的とゴール Session Objectives and Takeaways セッションの目的 Open Data Protocol の What WCF Data Services の How セッションのゴール Open Data Protocol の“多様性”を認識 WCF Data Services の“手軽さ”を認識 3 アジェンダ Open Data Protocol (OData) とは ? ~ 特徴とその価値 ~ WCF Data Services による開発 ~ 手軽なサービス開発 ~ WCF Data Services のセキュリティ ~ 認証と承認 ~ 4 Open Data Protocol (OData) とは ? ~ 特徴とその価値 ~ クラウド時代のデータ共有 Mobile 6 Server TV/Game PC OData とは ? データ共有用の RESTful プロトコル 様々な環境でデータを共有するための規約 AtomPub の拡張セット 構造化データ、CRUD 操作、URI による複雑なクエリ (クエリ式)、JSON フォーマット Open Specification Promise の基でリリース 多くの製品やテクノロジで対応 サーバー クライアント 7 HTTP/ REST ご参考 ~ URI クエリ式 ~ クエリ オプション 説明 $expand アドレス指定したエンティティと一緒に関連エンティティのセットを 1 つの応答で返すようサービスに指示します。 $filter クエリ演算子および関数を使用して、返されたセットをフィルターする ようサービスに指示します。 $inlinecount allpages が指定されている場合、URI によって返されるすべてのエン ティティのカウントを含めるようサービスに指示します。 $orderby クエリ演算子を使用して、返されたエンティティを並べ替えるようサー ビスに指示します。 $select 返されたプロパティを指定したプロジェクションのプロパティだけに制 限するようサービスに指示します。 $skip 指定した数のエンティティをセットの最初でスキップするようサービス に指示します。 $skiptoken サーバーのページングが有効な場合、結果の次のページを返すようサー ビスに指示します。 $top セット内の指定した数のエンティティを返すようサービスに指示します。 8 OData 対応 ~ サーバー ~ 製品やテクノロジ SharePoint 2010 Windows Azure Storage SQL Azure WCF Data Services WCF RIA Services SQL Server Reporting Services 2008 R2 IBM WebSphere eXtreme Scale odata4j (Google AppEngine) など 9 外部サービス Tech·Ed 2010 MIX 10 Netflix Vancouver’s vanGuide Open Government Data Initiative Open Science Data Initiative など OData 対応 ~ クライアント ~ アプリ Excel + PowerPivot OData Explorer OData PowerShell Explorer iPhone OData Browser LINQPad Sesame など 10 ライブラリ .NET Silverlight Windows Phone 7 iPhone、iPad (Objective-C) Android (odata4j) jQuery Java PHP Ruby など 多様な環境への適用 全ての層を横断した HTTP/REST の適用 デバイス、OS、クラウド、DB、UI 11 ADO.NET Data Services による開発 ~ 手軽なサービス開発 ~ WCF の全体像 Data Services Service Model Channel Model OData 13 WCF Data Services とは ? ~ サーバー ~ データの CRUD 処理に特化して手軽に RESTful なサービス開発を実現 サービス層から DAL へ直接アクセス OData としてデータを公開 様々な環境に対応したアプリやライブラリを提供 OData SOAP など 14 Web サーバー CRUD 処理 (ASP.NET Application Server) サービス ビジネス データ アクセス WCF ADO.NET Data Services EF Business など WCF Logic DB WCF Data Services によ る手軽なサービス開発 ~ サーバー ~ OData ご参考 ~ データの公開 (サーバー) ~ public class pubsDataService : DataService< pubsEntities > { データ ソース public static void InitializeService(DataServiceConfiguration config) { アクセス ルール config.SetEntitySetAccessRule("*", EntitySetRights.All); config.SetEntitySetPageSize("*", 2); ページ サイズ config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } } 16 WCF Data Services とは ? ~ クライアント ~ .NET 専用クライアント ライブラリ サービス操作用プロキシ クラスを自動生成 LINQ を活用した柔軟なクエリ 追加、更新、削除処理 変更管理の実装を含む プロキシ クラス 17 OData サービスの利用 ~ .NET ライブラリ ~ プロキシ クラス OData ご参考 ~ LINQ を使ったクエリ (クライアント) ~ プロキシ クラス pubsEntities context = new pubsEntities(new Uri("http://localhost.:8582/pubsDataService.svc/")); var query = (from e in context.employees where e.job_lvl > 100 LINQ を利用した orderby e.hire_date 様々なデータ操作 select new { name = e.fname + " " + e.lname, hire_date = e.hire_date, job_desc = e.job.job_desc }).Skip(3).Take(2).ToList(); int count = query.Count(); 19 ご参考 ~ データの追加 (クライアント) ~ pubsEntities context = new pubsEntities(new Uri("http://localhost.:8582/pubsDataService.svc/")); employee emp = new employee { emp_id = “MAP88185M”, fname = “Daisuke”,・ ・ ・}; context.AddToemployees(emp); context.SaveChanges(); データの追加を サーバーへリクエスト 20 Silverlight で利用するには ? Silverlight 専用クライアント ライブラリ サービス操作用プロキシ クラスを自動生成 Silverlight の特徴 クライアントのブラウザーで動作 データベースへの直接アクセスは不可 サーバー上のデータはサービスを通じて操作 サービスへのアクセスはすべて非同期処理 非同期 プロキシ クラス 21 OData サービスの利用 ~ Silverlight ライブラリ ~ 非同期 プロキシ クラス OData ご参考 ~ 非同期クエリ (Silverlight) ~ private void button1_Click(object sender, RoutedEventArgs e) { URL の指定は不要 pubsEntities context = new pubsEntities(new Uri("pubsDS.svc", UriKind.RelativeOrAbsolute)); var query = (from emp in context.employees select emp) as DataServiceQuery<employee>; query.BeginExecute(EmployeesQueryCompleted, query); } 非同期クエリ処理開始 private void EmployeesQueryCompleted(IAsyncResult result) { 非同期コールバック Dispatcher.BeginInvoke(() => メソッドの実装 { var query = result.AsyncState as DataServiceQuery<employee>; IEnumerable<employee> employees = query.EndExecute(result).ToList(); dataGrid1.ItemsSource = employees; 非同期クエリ処理終了 }); } 23 ご参考 ~ 非同期クエリと双方向バインド (Silverlight) ~ private void button2_Click(object sender, RoutedEventArgs e) { pubsEntities context = new pubsEntities(new Uri(" pubsDS.svc", UriKind.RelativeOrAbsolute)); var query = (from emp in context.employees select emp) as DataServiceQuery<employee>; var collection = new DataServiceCollection<employee>(); dataGrid1.ItemsSource = collection; 双方向バインド collection.LoadAsync(query); } 24 非同期クエリ処理 コレクション ご参考 ~ 非同期データ追加 (Silverlight) ~ private void button3_Click(object sender, RoutedEventArgs e) { pubsEntities context = new pubsEntities(new Uri("pubsDS.svc", UriKind.RelativeOrAbsolute)); employee emp = new employee { emp_id = “MAP88184M”, fname = “Daisuke”, lname = “Inoue”, ・ ・ ・}; context.AddToemployees(emp); context.BeginSaveChanges(SaveChangesOptions.Batch, OnAddEmployees, context); 非同期追加処理開始 } 非同期処理 コールバック メソッドの実装 private void OnAddEmployees(IAsyncResult result) { Dispatcher.BeginInvoke(() => { pubsEntities context = result.AsyncState as pubsEntities; DataServiceResponse response = context.EndSaveChanges(result); }); 非同期追加処理終了 } 25 WCF Data Services のセキュリティ ~ 認証と承認 ~ 認証と承認 認証 (Authentication) 誰であるかを特定すること (ログイン) 承認、認可 (Authorization) リソースへのアクセス制御 Web サーバー IIS OData 27 ASP.NET Windows 認証など フォーム 認証など ACL 設定 ファイル WCF Data Services QueryInterceptor ChangeInterceptor SetEntitySetAccessRule DB ご参考 ~ Windows 資格情報の取得 (クライアント) ~ context.Credentials = CredentialCache.DefaultCredentials; ※ デフォルト true context.UseDefaultCredentials = true; 28 承認、認可 (Authorization) IIS Windows 認証の場合、 エクスプローラーのプロパティ ウィンドウから ACL で指定 ASP.NET 設定ファイル (Web.config) の <authorization> 要素で指定 WCF Data Services QueryInterceptor 参照処理でカスタム ロジックを割り込ませる属性 ChangeInterceptor 参照以外の処理でカスタム ロジックを割り込ませる属性 SetEntitySetAccessRule エンティティ セット単位でアクセス権を指定 29 ご参考 ~ QueryInterceptor (サーバー) ~ エンティティ セット (employees) の参照で割り込み発生 [QueryInterceptor("employees")] public Expression<Func<employee, bool>> empfilter(){ if (!HttpContext.Current.User.Identity.IsAuthenticated) return (employee e) => false; var id = HttpContext.Current.User.Identity.Name; if (id == "Administrator") return (employee e) => true; else return (employee e) => e.emp_id == id; } 30 ご参考 ~ ChangeInterceptor (サーバー) ~ エンティティ セット (employees) の参照以外で割り込み発生 [ChangeInterceptor("employees")] public void OnChangeEmployees(employee e, UpdateOperations operations) { if (!HttpContext.Current.User.Identity.IsAuthenticated) throw new DataServiceException(403, "Access Denied"); var id = HttpContext.Current.User.Identity.Name; if (id != "Administrator") { オペレーションの指定 if (id != e.emp_id) throw new DataServiceException(403, "Access Denied"); if (operations == UpdateOperations.Add || operations == UpdateOperations.Delete) throw new DataServiceException(403, "Access Denied"); } } 31 ご参考 ~ EntitySetRights で指定可能なメンバー ~ メンバー名 説明 None データへのすべてのアクセス権を拒否 ReadSingle 単一のデータ項目を読み取る許可 ReadMultiple データ セットを読み取る許可 WriteAppend 新しいデータ項目をデータ セットに作成する許可 WriteReplace データを置換する許可 WriteDelete データ セットからデータ項目を削除する許可 WriteMerge データをマージする許可 AllRead データを読み取る許可 AllWrite データを書き込む許可 All データを作成、読み取り、更新、および削除する許可 複数指定 config.SetEntitySetAccessRule(“employees", EntitySetRights.AllRead | EntitySetRights.WriteDelete); 32 まとめ OData は今後のクラウド時代を見据えた データ共有プロトコル OData に対応することで様々な環境で データを共有 WCF Data Services を用いて多機能な OData 対応のサービスを手軽に開発 33 関連セッション T4-402:ADO.NET Entity Framework ディープ ダイブ ~ EF 4 アーキテクチャと実践的活用 ~ T6-401:WCF RIA Services を使った Silverlight 4 アプリケー ション開発 ~ 迅速性と効率性の追求 ~ T1-309:Windows Azure ストレージ詳説 T6-312:Windows Communication Foundation 4 における新機能 のポイント ~ REST サービスからワークフロー サービスまで ~ 34 リファレンス 講師のブログ http://blogs.msdn.com/b/daisukei 講師の Twitter http://twitter.com/daisukei777 データ プラットフォーム (データ アクセス) 開発 http://msdn.microsoft.com/ja-jp/data/default.aspx Open Data Protocol 本家サイト http://www.odata.org/ 35 ご清聴ありがとうございました。 T4-303 アンケートにご協力ください。
© Copyright 2024 ExpyDoc