[コース: C2] .NET Framework 3.0 WCF/WF アプリケーション

Microsoft ON ― 出張ワークショップ ―
[コース: C2]
.NET Framework 3.0
WCF/WF アプリケーション開発
本日の内容
.NET Framework 3.0
新しい開発プラットフォームとしての
.NET Framework 3.0 の進化(概要)
Windows Communication Foundation
(WCF)
Windows Workflow Foundation (WF)
.NET Framework 3.0
.NET Framework 3.0
新たなビジネスアプリケーションの開発・実行基盤
Windows
Presentation
Foundation
(WPF)
Windows
Communication
Foundation
(WCF)
Windows
Workflow
Foundation
(WF)
.NET Framework 3.0
既存の .NET Framework 2.0
Windows
CardSpace
(WCS)
新しい開発プラットフォームとしての
.NET Framework 3.0 の進化(概要)
パラダイムの進化
オブジェクト、コンポーネントからサービス概念の追加
1980sオブジェクト指向
クラスベース
責務の分離、カプセル化
継承、ポリモーフィズム
1990s
2000s
コンポーネント指向
インターフェイスベース
ランタイム メタデータ
ダイナミック ローディング
サービス指向
スキーマ・コントラクト
(マルチプラットフォーム統合)
.NET Framework 3.0 で
可変と不変を区別して実装
サービス指向開発が選択可能
疎結合
ポリシーによるバインディング実装再利用 バイナリ 可変実装
技術
再利用技術
技術
.NET Framework 3.0 における開発の変化
サービス実装採用の際の分析・設計への留意
サービス指向4原則 (by Don Box, Microsoft)
境界は明確であること
サービスは自律していること
業務分析
クラスでなく
スキーマ/コントラクトを共有すること
(要件定義)
ポリシーベースの互換性を持つこと
システム分析
デメテルの法則
「知らないやつには話しかけない」
システム設計
実装・
単体テスト
結合テスト
・・・・
A
B
C
D
E
F
A
X
B
X
C
X
X
D
X
X
E
X
X
X
X
Operation
Context
DSM (The Design Structure Matrix)
X
X
×
Operation
Context
X
F
G
G
によるサービス抽出
X
ツールの技術だけでは、”サービス指向” の恩恵は手に入らない!
(技術 + 方法)
WS-* アーキテクチャ
.NET Framework 3.0 が参照する OASIS 標準
WS-Management WS-Enumeration
Management
& Device
DP4WS
WS-Transfer
WS-Security
WS-Discovery
(Devices Profile
for Web Services)
WS-Federation
WS-Coordination
Assurances
Metadata
WS-Metadata
Exchange
WS-Security
Policy
WS-Policy
BPEL4WS
(Business Process Execution
Language for Web Services)
WS-Atomic
Transaction
UDDI 2.0
WS-Secure
Conversation
WS-Reliable
Messaging
WS-Business
Activity
WSDL 1.1
WS-Addressing
WS-Eventing
WS-Trust
MTOM
Messaging
(Message Transmission
Optimization Mechanism)
XML
Schema
Foundation
XML 1.0
XML
Namespaces
XML
Infoset
仕様策定・公開 / 標準化中
HTTP
HTTPS
SOAP 1.1/1.2
標準仕様
新規開発フレームワーク(3.0 WCF/WF)
がもたらす その他のメリット
WS-* に伴う動作仕様の大幅拡張
XML Web サービスで、ASP.NET認証、独自認証
の組み込みが可能
WebMethod がトランザクションに参画可能 (従来
はルートトランザクション作成のみ)
など
テスト時などにおける通信実装の切り替え(変
更)が容易
ワークフローエンジンと利用スキルの統一
(SharePoint, BizTalk, など)
Windows Communication Foundation (WCF)
WCF のビジネスインパクト
通信処理の統一、ビジネスロジックとの分離
ASMX
.NET
Remoting
異種プラットフォーム
との相互運用
位置透過な
リモート オブジェクト
属性ベースの
プログラミングと
オブジェクト コンテナ
WS-* プロトコル
サポート
Enterprise
Services
メッセージ指向の
プログラミング
System.Messaging
WSE
WCF の価値
そのメリット全般
高度にデザインされた通信実装モデルを提供
通信テクノロジーをビジネスロジックと分離
Contract-First デザイン
分散アプリケーション開発の保守性の向上
×
チューニング結果に応じた通信方法の
変更容易性や、移行の迅速化、など
Web サービス標準に準拠した相互運用性の実現
WS-* 標準仕様のフルサポート
既存のテクノロジとの互換性、コンフィグレーションによる
他プラットフォームとの接続
WCFのデザインコンセプト
処理の基本は “A・B・C”
内部的なサービス内の振る舞いを実装
•
•
•
•
クライアント
並列処理、インスタンス化制御
Fault、Exception 処理
偽装、認証、認可
トランザクションの自動参加・投票 etc …
サービス
Behavior
Behavior
Endpoint
Behavior
C B
Endpoint
A
Message
A
Binding
Contract
B
Endpoint
Address
Where? How? What?
C
Behavior
WCF のサービス実装
コントラクトとコンフィグレーション
サービスコントラクト
using System.ServiceModel;
[ServiceContract]
public interface IProductServiceContract
{
[OperationContract]
Product[] GetProducts();
}
データコントラクト
[DataContract]
public class Product
{
[DataMember]
public int ProductID;
[DataMember]
public string ProductName;
・・・・
サービスコンフィグレーション
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.serviceModel>
サービス実装のタイプ情報
Namespace.Class 名
<services>
<service type="ProductService.ProductServiceImpl">
<endpoint
A address="http://localhost:3000/ProductService/ProductService.svc"
B binding="basicHttpBinding"
C contract="ProductService.IProductServiceContract, ProductService" />
</service>
</services>
サービスコントラクトのタイプ情報
コントラクトのアセンブリ名
Namespace.Class 名
</system.serviceModel>
WCF のサービス実装
バインディングの種類
標準バインディング セット(要件にマッチしない場合
は CustomBinding を使用)
バインディング名
.config 要素
説明
BasicHttpBinding
<basicHttpBinding />
WS-I Basic Profile に準拠した相互
運用性の高い Web サービスによる
通信
WsHttpBinding
<wsHttpBinding />
WS-* プロトコルを使用した高機能な
Web サービスによる通信
WsDualHttpBinding
<wsDualHttpBinding />
WS-* プロトコルを使用した高機能な
Web サービスによる非同期双方向で
の通信
NetTcpBinding
<netTcpBinding />
.NET to .NET に最適化された高速マ
シン間の通信
NetNamedPipeBinding
<netNamedPipeBinding />
.NET to .NET に最適化されたマシン
内プロセス間の最速度通信
NetMsmqBinding
<netMsmqBinding />
MSMQ による WCF アプリケーション
間の通信
MsmqIntegrationBinding
<msmqIntegrationBinding />
既存の MSMQ アプリケーションとの
相互接続での通信
WCF のサービス実装
バインディングごとのサポート機能
バインディング 名
通
信
プ
ロ
ト
コ
ル
相
互
運
用
性
通
信
区
間
エ
ン
コ
ー
デ
ィ
ン
グ
セ
キ
ュ
リ
テ
ィ
セ
ッ
シ
ョ
ン
リ
ラ
イ
ア
ビ
リ
テ
ィ
ト
ラ
ン
ザ
ク
シ
ョ
ン
メ
パッ
セ
ター
ージ
ンン
グ
BasicHttpBinding
HTTTP
HTTPS
WS-I
BP 1.1
BSP 1.0
Crossmachine
Text
Mixed
WsHttpBinding
HTTP
HTTPS
WS-*
Crossmachine
Text
MTOM
T|M
Mixed

D
D
WsDualHttpBinding
HTTP
WS-*
Crossmachine
Text
MTOM
M

D
D
NetTcpBinding
TCP
.NET
(WCF)
Crossmachine
Binary
Mixed
T|M

D
D
NetNamedPipeBinding
Named
-Pipe
.NET
(WCF)
Crossprocess
Binary
T

NetMsmgBinding
MSMQ
.NET
(WCF)
Binary
T|M

Q
Q
Simplex
MsmqIntegrationBinding MSMQ
MSMQ
Crossmachine
Crossmachine
T

Q
Q
Simplex
Text
Simplex
Request
-Reply
T|M
D
Simplex
Request
-Reply
Simplex
Request
-Reply
Duplex
Simplex
Request
-Reply
Duplex
Simplex
Request
-Reply
Duplex
WCF のサービス実装
Endpoint の定義
一般には、構成ファイル (.config) で定義(下記)
Self ホスティング(後述)でコードで定義することも可能
<system.ServiceModel>
<services>
<service type="EmployeeService">
<!-- Endpoint の定義 -->
<endpoint
contract="IEmployeeService"
binding="netTcpBinding"
bindingConfiguration="SampleBinding"
address="http://hoge.com:8888/Employee/" />
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="SampleBinding" transactionFlow="true" />
</netTcpBinding>
</bindings>
</system.ServiceModel>
WCF のサービス実装
Behavior の定義
サービスの実装クラスにBehaviorを定義
ServiceBehavior 属性
サービス レベルでの振舞いを定義
OperationBehavior 属性
オペレーション レベルでの振舞いを定義
[ServiceBehavior(
TrasactionIsolationLevel = IsolationLevel.Serializable )]
public class EmployeeService : IEmployeeService {
[OperationBehavior(
TransactionAutoComplete = true,
TransactionScopeRequired = true )]
public void Regist( Employee employee ) { // ... }
}
WCF のサービス実装
サービスホストによるホスティング(1)
ServiceHost クラスを使用する
ホスティング可能なアプリケーション形態:
スタンドアロン (WPF、WindowsForm、コンソール)
NT サービス
ASP.NET (IIS 5.1、6.0)
※ HTTP(S) のみサポート
WAS (Windows Activation Service: IIS7)
※ HTTP(S)、TCP、MSMQ、Named-Pipe をサポート
WCF のサービス実装
サービスホストによるホスティング(2)
Self-hosting:
// サービス実装クラスの型を指定して、サービス ホストを生成
ServiceHost host = new ServiceHost( typeof( HelloService ) );
// ... (Endpoint の追加処理)
// サービス ホストを起動
host.Open();
// ... (中略)
// サービス ホストを停止
host.Close();
ASP.NET/WAS-hosting (IIS 5.1/6.0、IIS7):
http://localhost/HelloService/HelloService.svc
<!-- サービス実装クラスの型を指定 (ServiceHost を自動生成) -->
<% @ServiceHost language="C#" class="HelloService" %>
WCF のクライアント実装
クライアントチャネルを使用する場合
ChannelFactory<T> クラス
サービス コントラクトに対応するクライアント チャネルを生
成するファクトリークラス
// サービス コントラクトに対応するクライアント チャネルのファクトリーを生成
// (.config のクライアント用 Endpoint 名を指定)
ChannelFactory<IMyService> factory
= new ChannelFactory<IMyService>( "SampleEndpoint" );
// ChannelFactory からクライアント チャネルを生成
IMyService mySvc = factory.CreateChannel();
// サービス コントラクトのオペレーションを呼び出す
mySvc.Hello( "How are you ?" );
<client>
// クライアント チャネルを破棄
( (IChannel)mySvc ).Close();
<!-- Endpoint の定義 -->
<endpoint
name="SampleEndpoint"
contract="IMyService"
binding="netMsmqBinding"
address="http://hoge.com/Private/Q" />
</client>
WCF のクライアント実装
プロキシを使用する場合
ツールでプロキシを生成可能
SvcUtil.exe (Service Metadata Utility Tool)
サービスのメタデータ (WSDL、WS-MEX) から、プ
ロキシのコードや構成情報 (.config) を生成
svcutil /config:app.config http://localhost/Employee/EmployeeService.svc?wsdl
Visual Studio から「Web 参照」ライクにプロ
キシを生成することも可能
WCF のアシュアランス
4つのアシュアランス
セキュア
(Secure)
リライアブル
(Reliable)
トランザクテッド
(Transacted)
インターオペラブル
(Interoperable)
WCF のアシュアランス
セキュリティ
機密性、完全性
セキュリティはバインディングの機能
標準的なバインディングはデフォルトでセキュア
BasicHttpBinding 以外
アプリケーションデータは暗号化され署名される
認証、認可
X.509 証明書、ユーザーネーム/パスワード、Kerberos、
SAML、カスタム
<behaviors>
<behavior name = "credentialConfig">
<serviceCredentials>
<serviceCertificate storeLocation="LocalMachine"
storeName="My" findValue="purchase.com"
x509FindType="FindBySubjectDistinguishedName"/>
</serviceCredentials>
</behavior>
</behaviors>
WCF のアシュアランス
リライアビリティ
信頼できる End-to-End のメッセージングを提供
順序保証(オプショナル)
Exactly Once (正確な1回のメッセージ保証、重複メッ
セージの排除)
WS-ReliableMessaging を使用
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<reliableSession
enabled="true"
ordered="true" />
</binding>
</wsHttpBinding>
</bindings>
WCF のアシュアランス
トランザクション
System.Transactions と連携可能
WS-AT (WS-AtomicTransaction) をサポート
MS-DTC が WS-AT、WS-Coordination に対応
[ServiceContract]
public interface IMyContract {
[OperationContract]
[TransactionFlow( TransactionFlowOption.Required )]
bool Transfer1( Account from, Account to, decimal amount );
}
[ServiceBehavior()]
public class MyService : IMyContract {
[OperationBehavior( TransactionScopeRequired = true,
TransactionAutoComplete = true )]
public bool Transfer1(Account from, Account to, decimal amount) {
// ...
}
}
WCF のアシュアランス
インターオペラビリティ
Web サービスによる相互運用性
IETF、W3C、OASIS などの標準化団体による
Web サービス標準仕様 (WS-*) の策定
WS-I による Web サービスの相互運用に対する
取り組み
Web サービス標準仕様に基づいた相互運用のガ
イドラインの作成やテストツールを公開
Basic Profile
WS-I Basic Profile 1.0/1.1
WS-I Basic Security Profile 1.0
Windows Workflow Foundation (WF)
WF のビジネスインパクト
WF の2つの目的
サービス指向 型プロセス管理(統合)の支援
ワークフローのビジュアルなデザインと変更
カスタムアクティビティの開発者とフローの作成者の分離
Windows プラットフォームにおけるワークフロー ソ
リューションの テクノロジー統一
すべてのワークフローテクノロジーにおける統一基盤の提
供(Microsoft Office Sharepoint Server 2007, など)
システム ワークフロー/ヒューマン ワークフローの双方を
想定
シーケンシャルワークフロー/ステートマシンワークフロー
の双方を想定
WFの価値
役割分担の明確化 (適材適所のワークフロー管理)
ワークフロー開発
ほぼコードレス、フローの記述
Application
Workflows
フロー ロジック
PDCA型の
ビジネスフロー進化
(社員力の活用)
カスタム・アクティビティ
アクティビティ開発
個別の機能や値評価ロジック等
ホスト開発
アプリケーションサービス&ホスト
Runtime
Services
カスタムサービス
WFの価値
統一的ワークフロープラットフォームの提供
ヒューマンワークフロー
トランザクション型プロセス
コラボレート型プロセス
ヒューマン
システムワークフロー
バッチ
システム間連携
活用例:明細書の発行、
ルーチン型データ転送、
etc
活用例: 機関間の料金
請求と決済、サプライ
チェーン etc
ワークフロー
活用例: 口座開設、
ローン申請、ドキュメン
ト承認、etc
状態機械
(データー駆動型)
活用例: 相場連動型
ポートフォリオリスク計
算(自動売買)、etc
アクティビティ複雑性 / 流動性レベル
WFの構成
ランタイムと標準ライブラリ
カスタムデザイナー
Visual Studio Workflow デザイナー
アクティビティ
Structured
State Machine
Rules
アクティビティ フレームワーク
Validation Compilation
Serialization
Transactions
Fault Handling
ワークフローランタイム
ランタイムサービス
Loader
Persistence
カスタム
アクティビティ
…
Visualization
Cancellation
Scheduling
Threads
Compensation
Instance Mgmt
Transactions
ホストプロセス (exe, Windows サービス, ASP.NET, etc..)
Tracking
WF の実装
ワークフロー定義
ワークフローの定義 (XOML)
<?Mapping XmlNamespace="Activities"
ClrNamespace="System.Workflow.Activities"
Assembly="System.Workflow.Activities" ?>
<SequentialWorkflow x:Class="MyWorkflow" xmlns="Activities"
xmlns:x="Definition">
…
</SequentialWorkflow>
ワークフローの実行
static void Main(string[] args)
{
// WorkflowRuntime の作成
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
// workflow の型をロード
Type type = typeof(MyWorkflow);
// workflow インスタンスの作成/ワークフローの開始
workflowRuntime.StartWorkflow(type);
// WorkflowRuntime の終了まで待機
waitHandle.WaitOne();
}
ワークフローの実装
カスタムアクティビティの作成
例:メール送信アクティビティ
using System.Workflow.ComponentModel;
public partial class SendMail : System.Workflow.ComponentModel.Activity
{
public SendMail() { InitializeComponent(); }
protected override Status Execute(ActivityExecutionContext context)
{
// メール送信の実装をここに記述する
return Status.Closed;
}
}
public partial class SendMail
{
public string subject;
public string Subject {
get { return subject; }
set { this.subject = value; } }
private void InitializeComponent() // Designer により生成
{
this.ID = "SendMail";
}
}
2 種類のワークフロー
シーケンシャルワークフロー
シーケンシャルワークフ
ローは、段階(Step)から
構成される
開始から終了まで、段
階を逐次実行する
段階には、条件分岐、
反復等が含まれる
A1
A2
A3
A4
2 種類のワークフロー
ステートマシンワークフロー
ステート マシン ワー
クフローは、「状態(ス
テート)」の集合から構
成される
S1
S3
S2
所定の状態では、一
組の「イベント」を受信
できる
S4
状態「遷移」の境界で
受信したイベントを基
に、「アクション」が実
行される
S5
ワークフローライフサイクルの管理
Workflow インスタンスの制御
WorkflowInstance オブジェクトを通して制御
実行中のワークフローとの接点
永続化サービスを用いた自動ロードのインスタンス
Auto-loads instance using PersistenceService
ライフサイクル管理と永続化の操作
Abort, Terminate, Suspend, Resume
Load, Unload
オペレーションは WorkflowRuntime イベントに対応
private void TerminateButton_Click(object sender, EventArgs e)
{
WorkflowInstance workflowInstance =
workflowRuntime.GetWorkflow(Program.workflowInstanceId);
workflowInstance.Terminate("Terminating Case, Problem was resolved");
}
ワークフローライフサイクルの管理
WorkflowRuntime イベント
キーコンセプト
2種類のイベント – ワークフローインスタンスとランタイム
イベントを処理するハンドラーの定義が必要
ワークフローインスタンスが実行されているスレッドから呼び出される
ワークフローインスタンスのライフサイクル
ワークフローインスタンスのステータスの変化を管理
Aborted, Terminated, Started, Completed, etc.
EventArgs はイベントを発生させたワークフローのワークフローインスタンス
IDを含む
WorkflowInstance への操作もしくはワークフローの実行を通して引き起こさ
れる
例 Terminate アクティビティの実行が
WorkflowRuntime.WorkflowTerminated イベントを引き起こす
ワークフローランタイムのライフサイクル
ワークフローランタイムのステータスの変化を管理
Started, Stopped
例 管理ツールでの制御、アプリケーション/OS のシャットダウン
ワークフローインスタンスのライフサイクル
インスタンスごとに分離されたマネージスレッド
ワークフローインスタンスはホストアプリケーションとは別々
のマネージスレッド上で実行
・ホストアプリケー
ションとは別のマ
ネージスレッド上で
動作
・スレッドプール上で
実行
ワークフローランタイム
Workflow Instance
InstanceId=25b27c73-c543-4113-acb1-0e458b8ffa54
Workflow Instance
InstanceId=a947e517-0b5a-4633-9597-934b61fb1802
・ホストアプリケー
ションとワークフロー
インスタンスとの間
でのデータの受け渡
しが必要
ホストアプリケーション(exe, ASP.NET 等)
WF の進んだトピック
標準アクティビティ
CAG (Conditioned Activity Group), トランザク
ション、等
ルール、ポリシー
ランタイムサービスとそのカスタマイズ
トラッキングサービス、永続化サービス、等
ビジュアルデザイナーをアプリケーション内で
再利用可能
技術情報リソース
Windows Vista デベロッパー センター:
http://www.microsoft.com/japan/msdn/windowsvista/
.NET Framework デベロッパー センター:
http://www.microsoft.com/japan/msdn/netframework/
Microsoft Windows Workflow Foundation 入門(手引き):
http://www.microsoft.com/japan/msdn/windowsvista/general/WWFGetS
tart.asp
MSDN® Workflow Page :
http://msdn.microsoft.com/workflow
MSDN フォーラム Windows Workflow Foundation ( WF ) :
http://forums.microsoft.com/MSDNJA/ShowForum.aspx?ForumID=799&SiteID=7
© 2006 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not
be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.
MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.