WCF Data Services

セッション 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
アンケートにご協力ください。