WCF / WF 再入門           小尾 智之(Ahf)
自己紹介VB と SQL Server が主戦場 もう手広くやってますよ・・・インディー団体を含むプロレス全般と クマ(クマー含む)好き もっふりしたもの全般好き現在 Workflow Foundation メイニアが目標@IT エ...
各技術の登場経緯.NET Framework 3.0 に合わせて登場  正式リリースまでは WinFX と呼ばれていたユーザーエクスペリエンスを扱う WPF (Windows Presentation Foundation)色々なコミュ...
各技術の関係それぞれが単独でも利用可能 だが、ある程度利用する場合 は複数技術を利用する事が増                      WPF える前面に出る WPF と バックグラウンドで 動作する WCF・WF            ...
WindowsCommunicationFoundation
WCF とは多種多様にわたって存在するコミュニケーション (通信)を汎用的にプログラミング・構築するた めの基盤構成ファイルによる挙動の変更ロジックによる動的な構成変更Web に限らずサービスの提供などが主な用途
WCF 登場までの背景      C/S 型 全盛              Web サービスの登場 TCP/IP     NETBEUI     ASP.NET Web Services (ASMX)名前付きパイプ      IPX/SPX ...
TCP/IP   NETBEUI    ASP.NET Web Services (ASMX)名前付きパイプ    IPX/SPX   Web Service Enhancements (WSE)                     Mic...
開発環境についてサービス側Visual Studio Standard 以上Visual Web Developerクライアント側Visual Studio 全てのエディションデバッグ用のパケットキャプチャFiddler がお勧め...
WCF サービスの基本の流れ  リクエストは HTTP や  TCP 等を利用して送付                      2:処理実行と結果の生成        1:リクエストの送付                       3:結果...
インターネットを利用した通信プロトコル利用ガイドライン第2.0版より引用(財団法人 流通システム開発センター)     SOAP メッセージ      POST /SOAP-RPC HTTP/1.1                     Ho...
WCF4 での主な改善点「標準の構成」基本設定であれば記述量は極少量複数サイトバインディング1ファイルで複数アドレスから提供メッセージルーティング受信した内容により別サービスへと転送RoutingService クラスなどを利用 ...
重要要素 ABCA:アドレスメッセージを受信する(送信する)アドレスB:バインディングメッセージを送受信する方法C:コントラクト利用(提供)するサービスの定義  これらの定義にて エンドポイント を構成する
エンドポイント    アプリケーション同士(またはアプリケーションとサービス)が    通信するための出入口             この部分がエンドポイント    エンドポイントの定義は設定ファイル    または直接的にコーディングにて行う
構成ファイルのサンプル<?xml version="1.0" encoding="utf-8"?><configuration> <system.web>  <compilation debug="true" strict="false" ex...
WCF サービスの構築
コーディングのサンプルPublic Function StartService() As Boolean      Dim openResult As Boolean = False      WCF サービスのセルフホスト      Try ...
WCF セルフホスト
WCF 構成エディター Windows SDK として提供  %Program Files%Microsoft   SDKsWindows(v7.0A)BinSvcConfigEditor.exe   V7.0A の部分はインストールして...
アドレス   URI (Uniform Resource Identifier)    アドレスにて指定する     対応スキーム       http、https               http://clr-h.jp:8080/ ...
バインディング     BasicHttpBinding      WSHttpBinding                                          NetTcpBinding    WS2007HttpBindin...
コントラクトサービスやサービスで利用するメッセージの定義を行う  WCF サービスとして必要な属性 <ServiceContract()> Public Interface IService1     サービスの操作を表す属性   <Opera...
メッセージを表す属性<DataContract()>Public Class CompositeType                                                    メッセージのメンバを表す属性  <D...
メッセージと引数<ServiceContract()>Public Interface IService1  <OperationContract()>  Function GetData(ByVal value As Integer) As ...
メッセージの高度な制御    データ量やエンコーディングの負荷などを    考慮して適切な方法を選択する場合がある相互運用性    サイズ       速度                                 HTTPベース規定エン...
<system.serviceModel> … <bindings> <basicHttpBinding> <binding name="ExampleBinding" transferMode="Streaming"/> </basicHtt...
WCF サービスのホスティングIIS・IIS Express• AppFabric も利用可能( .NET Framework 4 以上が必要)• HTTP/S でのホストがメイン                 Web サービス向けWAS (...
IIS 利用時の捕捉                        IIS      ホストOS                        WAS        AppFabric                      バージョンWin...
サービスロジックの実装インターフェース上で定義した                                                                 サービスインターフェースを継承メソッドに対してコーディングを行う...
サービス操作の方向性  要求/応答モデル  •クライアントから要求を送信、サービスがそれに対して応答を送信するモデル  •WCF の基本スタイル  1方向サービス  •クライアントから要求を送信するのみでサービスは何も応答を送信しない  •Su...
メタデータの公開                             <?xml version="1.0" encoding="utf-8"?> Web サービスは                  <definitions xmlns...
REST サービスの実装        WebGet・WebInvoke 属性を利用すると         RESTful なサービスを構築できる            利用できるバインディングは WebHttpBinding       ...
WCF RESTful サービスの構築
返却されるデータの形式                                                            WebGet・WebInvoke 属性で返却データの<ServiceContract()>      ...
セキュリティ  大きく分けると3種類    トランスポート    メッセージ              他にもクライアント証明書など                         広範な知識が関連してくる    両方         ...
イベントログへの出力           WCF セキュリティ機能として Windows            イベントログへ簡単に出力する機能が用意            されている<configuration>              ...
WCF 拡張機能WebAPI  より容易に RESTful なサービスを適用するため   のものjQuery Support  WCF Web サービスを jQuery より利用しやす   い形にするExpress Interop B...
まとめとりあえず使う!話はそれからだ!レスポンスを考慮してチューニングする 箇所は多数用意されていますプログラム間通信や C/S での サービスにおいてもかなり簡易です特にプログラム間通信が非常に楽IIS でホストする以外でも利用価値...
WindowsWorkflowFoundation
Workflow とは?フローチャートなどの図式により プログラミングを行えるもの日本一般のワークフローとは若干異なるコンポーネント(処理のブロック) 毎の独立性が非常に高い                            アクティ...
Microsoft 製品での WFWF 4 を利用している製品 Team Foundation Server 2010 BizTalk Server 2010 (Entity Framework の内部)WF 3.x を利用している製...
WF の特徴・概念アクティビティと呼ばれる要素の集合振舞い・手順をモデルとして保存・実行 XML (WF3.x は xoml、WF4 は xaml)で  保存される長期間における実行をサポートしている 永続化、ブックマーク、アンロード...
開発環境についてExpress ではそのままだと無理 デザインコンポーネント拡張が必要な為 エディタを自前で用意すれば可能WF 3.5  Visual Studio 2005   + ExtensionS for Windows WF...
WF 3.5 と 43.5 と 4 はクラス構成も 変更され全くの別物  基底クラスから全て異なる3.5 で実装されたアク ティビティを4 環境で 利用する特殊措置を提供  Interop アクティビティ  CodePrex で移行キ...
WF4 での主な改善点WF 3.x よりもパフォーマンス向上全面的に向上しすぎ今まではなんだったんだ 参考:MSDN:Windows Workflow Foudation 4 のパフォーマンス     http://msdn.micros...
ワークフローの種類                                       ※1 ステートマシンを         シーケンシャル   ステートマシン   フローチャート                           ...
組み合わせたワークフローSequenceワークフロー内でFlowchartワークフローを利用するなど、複数のワークフローを組み合わせて利用できる
アクティビティとワークフロー   WF4 になり大きく変更したクラス構成System.Workflow.Activities 名前空間                                  WF 3.x         WF 4  ...
デザイナ・リホスティングWF4 になって大きく進化した点の一つ  デザイナ・ツールボックス・プロパティエディタ  を標準で提供(しかも簡易に利用できる)
デザイナーのリホスティング
アクティビティの利用             例)Assign アクティビティ              値の代入や計算の実行等多くの事が行える。              変数の新規定義は行えないVB 構文を利用して式を記述する変数はデザイナ...
標準アクティビティ                                                  フロー制御アクティビティ名                    処理内容DoWhile / While           ...
標準アクティビティ(2)                                             ランタイムアクティビティ名               処理内容Persist                永続化を行うTerm...
Persist / Unload / Bookmark実行時間が比較的長めになる ワークフローを補助する機能Persist                永続化を SQL                        Server 以外にす...
SQL Server に永続化する      WF4 の標準機能として提供 Dim persistInstance As SqlWorkflowInstanceStore = Nothing SQL Server の永続化を有効にする Dim...
標準アクティビティ(3)                                               トランザクションアクティビティ名              処理内容CancellationScope     処理の取消を行...
標準アクティビティ(4)                                                 メッセージングアクティビティ名                 処理内容CorrelationScope         ...
メッセージ関係アクティビティReceiveAndSendReply アクティビティ を利用すると簡単にサービスが作成できる                リクエストの受信               サービスで行う処理            ...
標準アクティビティ(5)                                                移行アクティビティ名          処理内容Interop           WF 3.x アクティビティを WF 4...
フロー制御アクティビティメッセージングアクティビティ Flowchart ワークフロー
アクティビティの実装                   アクティビティ本体                        クラス    Activity       CodeActivity      同期処理型アクティビティ        ...
アクティビティの実装(2)Imports System.ActivitiesImports System.Windows.Forms                                             ワークフローで管理すべ...
アクティビティの実装(3)Public Class AsyncInputDialogActivity  Inherits AsyncCodeActivity  Public Property InputStrings As OutArgumen...
補足:Activity Execution Context           Public Class SampleAddValue             Inherits CodeActivity             Public P...
デザイナーの実装   デザイナーの実装は XAML にて行う<sad:ActivityDesigner x:Class="MultilineCommentActivityDesigner"  x:Uid="MultilineCommentAct...
アクティビティのカスタマイズ
Expression TextBoxワークフローデザイナ上で計算式を入力する際にインテリセンスの提供や構文チェックなどが行える                                  VisualBasic 構文でのみ利用可能   ...
補足:インテリセンス    Visual Studio 2010 で提供されている Dll を     利用すれば同等の挙動をさせる事は可能    Express ではインストールされない Dll を含め     大量に参照が必要    ...
ワークフロー上の変数     親アクティビティで定義した変数は      子アクティビティで利用できる      (Activity Delegate)  子アクティビティで利用できる    (エラーにならない)内部では Activity D...
Workflow サービス ワークフローを WCF に  て外部公開  メッセージ系アクティビ   ティを利用 拡張子が xaml ではなく  xamlx 中身はほぼ同一  サービス固有の事象はなし ワークフロールート要素  が W...
WF サービスのデプロイ最低限必要なファイルは2つ  Web.config と サービスの xamlxWindows Azure にデプロイする際は [WCF Service Web Role]にて作成
Workflow サービス
WF 拡張機能Security Pack (CTP 1)ADO.NET Activity Pack (CTP 1)UnitTesting (v1.8.3)Microsoft.Activities (v.1.8.3)AppFabrix ...
WF が適する場面スクリプトで行う定型的な処理監視用スクリプトなどはお勧めユーザーに簡易プログラムを 作成させるもの (EDI 連携とか給与システムとか)デザイナ部分のみ利用承認ワークフローシステムへと流用…?
まとめ基本的には実行基盤なので何でも できる…が、向き不向きは当然あるActivity をどこまで用意できるか で使われ度合は大きく変わる開発者向けではないと思おう既存資産をアクティビティ化すると 非常に効果が高い
Appendix WCF Fiddler  (http://www.fiddler2.com/fiddler2/) WCF Community site  (http://wcf.codeplex.com/) The Problem So...
Appendix WF The Activity Designer  (http://blogs.msdn.com/b/tilovell/) AppFabric Team Blog(旧 The .NET EndPoint)  (http:/...
Upcoming SlideShare
Loading in …5
×

Clrh 110716 wcfwf

1,443 views

Published on

2011/07/16 にて利用した WCF4 / WF4 概要説明スライド

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,443
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Clrh 110716 wcfwf

  1. 1. WCF / WF 再入門 小尾 智之(Ahf)
  2. 2. 自己紹介VB と SQL Server が主戦場 もう手広くやってますよ・・・インディー団体を含むプロレス全般と クマ(クマー含む)好き もっふりしたもの全般好き現在 Workflow Foundation メイニアが目標@IT エンジニアライフで色々書いてます
  3. 3. 各技術の登場経緯.NET Framework 3.0 に合わせて登場  正式リリースまでは WinFX と呼ばれていたユーザーエクスペリエンスを扱う WPF (Windows Presentation Foundation)色々なコミュニケーション(通信)を扱う WCF (Windows Communication Foundation)コンポーネント指向プログラミング プラットフォーム WF (windows Workflow Foundation)
  4. 4. 各技術の関係それぞれが単独でも利用可能 だが、ある程度利用する場合 は複数技術を利用する事が増 WPF える前面に出る WPF と バックグラウンドで 動作する WCF・WF WF WCFアプリケーション、システム という観点ではかなり複数 利用する事が増えている
  5. 5. WindowsCommunicationFoundation
  6. 6. WCF とは多種多様にわたって存在するコミュニケーション (通信)を汎用的にプログラミング・構築するた めの基盤構成ファイルによる挙動の変更ロジックによる動的な構成変更Web に限らずサービスの提供などが主な用途
  7. 7. WCF 登場までの背景 C/S 型 全盛 Web サービスの登場 TCP/IP NETBEUI ASP.NET Web Services (ASMX)名前付きパイプ IPX/SPX Web Service Enhancements (WSE) Microsoft メッセージ キュー (MSMQ)接続にまつわるテクノロジ .NET Remotingだけでも種類が増加 Enterprise Services テクノロジにより実装内容もかなり異なる
  8. 8. TCP/IP NETBEUI ASP.NET Web Services (ASMX)名前付きパイプ IPX/SPX Web Service Enhancements (WSE) Microsoft メッセージ キュー (MSMQ)コミュニケーション基盤 .NET Remotingとして汎用的である需要が高まる Enterprise Services 業界に依存しない統一した Web サービス標準対応プログラミングモデル (WS-I) Windows Communication Foundation
  9. 9. 開発環境についてサービス側Visual Studio Standard 以上Visual Web Developerクライアント側Visual Studio 全てのエディションデバッグ用のパケットキャプチャFiddler がお勧め 無償で行う場合は、Visual Web Developer と Visual Studio (C#、VB…)Express を利用します。
  10. 10. WCF サービスの基本の流れ リクエストは HTTP や TCP 等を利用して送付 2:処理実行と結果の生成 1:リクエストの送付 3:結果のエンコード 4:結果の送付 結果は SOAP 形式として 整形される5:結果のデコード
  11. 11. インターネットを利用した通信プロトコル利用ガイドライン第2.0版より引用(財団法人 流通システム開発センター) SOAP メッセージ POST /SOAP-RPC HTTP/1.1 Host: edi.seller.co.jp SOAP メッセージ Content-Length: 2410 Content-Type: text/xml; charset=UTF-8 SOAPAction: "http://www.dsri.jp/edi-bp/2004/jedicos-xml/client- ヘッダ server/PutDocument" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> SOAP エンベロープ <soap:Header> <MessageHeader> <From>cliuri.co.jp</From> SOAP ヘッダ <To>svruri.co.jp</To> <MessageId>20040313123814@cliuri.co.jp</MessageId> <Timestamp>2004-03-13T12:38:14</Timestamp> ヘッダ情報 </MessageHeader> </soap:Header> <soap:Body> <PutDocument> SOAP ボディ <messageId>20040313123814@cliuri.co.jp</messageId> <data>WwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iU2hpZn==</data> <senderId>4912345000019</senderId> メッセージ <receiverId>4969951110016</receiverId> <formatType>SecondGenEDI</formatType> <documentType>Order</documentType> </PutDocument> </soap:Body> </soap:Envelope>
  12. 12. WCF4 での主な改善点「標準の構成」基本設定であれば記述量は極少量複数サイトバインディング1ファイルで複数アドレスから提供メッセージルーティング受信した内容により別サービスへと転送RoutingService クラスなどを利用 Windows Server AppFabric との 連携など他にも改善が多く行われている
  13. 13. 重要要素 ABCA:アドレスメッセージを受信する(送信する)アドレスB:バインディングメッセージを送受信する方法C:コントラクト利用(提供)するサービスの定義 これらの定義にて エンドポイント を構成する
  14. 14. エンドポイント アプリケーション同士(またはアプリケーションとサービス)が 通信するための出入口 この部分がエンドポイント エンドポイントの定義は設定ファイル または直接的にコーディングにて行う
  15. 15. 構成ファイルのサンプル<?xml version="1.0" encoding="utf-8"?><configuration> <system.web> <compilation debug="true" strict="false" explicit="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <behaviors> この場合はWCF既定の構成として <serviceBehaviors> 4つのエンドポイントが自動設定される <behavior> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel> <protocolMapping> <add scheme=‖http‖ binding=‖basicHttpBinding‖ <system.webServer> bindingConfiguration=‖MyBindingConfiguration‖/> <modules runAllManagedModulesForAllRequests="true"/> <add scheme=‖net.tcp‖ binding=‖netTcpBinding‖/> </system.webServer> <add scheme=‖net.pipe‖ binding=‖netNamedPipeBinding‖/> <add scheme=‖net.msmq‖ binding=‖netMSMQBinding‖/></configuration> </protocolMapping>
  16. 16. WCF サービスの構築
  17. 17. コーディングのサンプルPublic Function StartService() As Boolean Dim openResult As Boolean = False WCF サービスのセルフホスト Try ‗アドレスの指定 Dim localServiceAddress As Uri() = {New Uri(serverAddress)} Dim svType As Type = GetType(ServiceManagerService) _serviceInstance = New ServiceHost(svType, localServiceAddress) ‗バインディングの指定 Dim namedPipeBnd As Binding = NewNetNamedPipeBinding(NetNamedPipeSecurityMode.None) namedPipeBnd.Namespace = BINDING_NAMESPACE ‗コントラクトの指定 Dim procesMetadata As New ServiceMetadataBehavior _serviceInstance.AddServiceEndpoint(GetType(IWcfServiceManager), namedPipeBnd,String.Empty) _serviceInstance.Description.Behaviors.Add(procesMetadata) _serviceInstance.Open() openResult = True Catch ex As Exception サンプルは「名前付きパイプ」を End Try 利用したサービスのセルフホスト Return openResultEnd Function
  18. 18. WCF セルフホスト
  19. 19. WCF 構成エディター Windows SDK として提供  %Program Files%Microsoft SDKsWindows(v7.0A)BinSvcConfigEditor.exe  V7.0A の部分はインストールしているバージョン ※ただし WCF4 の 規定構成について v7.0A までの エディタでは 対応していない
  20. 20. アドレス URI (Uniform Resource Identifier) アドレスにて指定する 対応スキーム  http、https http://clr-h.jp:8080/  net.tcp とか  net.pipe net.tcp://clr-h.jp:8000/ とか  net.msmq  net.p2phttp://blogahf.blogspot.com/2011/05/sql-azure-rest-api.html コンピュータの後にスキーム コンピューター パス ポートを記載する事 もある
  21. 21. バインディング BasicHttpBinding WSHttpBinding NetTcpBinding WS2007HttpBinding NetNamedPipeBinding WSDualHttpBinding NetMsmqBinding WSFederationHttpBinding NetPeerTcpBindingWS2007FederationHttpBinding MsmqIntegrationBinding一般 Web サービス向け .NET アプリケーション向けバインディング バインディングWCF の標準で対応していない FTP 等はバインディングを自作する事で対応可能(製品として販売はされている) 既定の動作、対応するセキュリティ仕様や双方向性などが異なる どれを用いるかを設定ファイルやコーディングにて記述する http://msdn.microsoft.com/ja-jp/library/ms731092.aspx
  22. 22. コントラクトサービスやサービスで利用するメッセージの定義を行う WCF サービスとして必要な属性 <ServiceContract()> Public Interface IService1 サービスの操作を表す属性 <OperationContract()> Function GetData(ByVal value As Integer) As String <OperationContract()> Function GetDataUsingDataContract (ByVal composite As CompositeType) As CompositeType End Interface 独自のメッセージを利用する場合 は別途メッセージ定義が必要
  23. 23. メッセージを表す属性<DataContract()>Public Class CompositeType メッセージのメンバを表す属性 <DataMember()> Public Property BoolValue() As Boolean <DataMember()> Public Property StringValue() As StringEnd ClassPublic Class Service1 Implements IService1 サービスの実体 Public Function GetData(ByVal value As Integer) As String Implements IService1.GetData Return String.Format("You entered: {0}", value) End Function Public Function GetDataUsingDataContract(ByVal composite As CompositeType) AsCompositeType Implements IService1.GetDataUsingDataContract If composite Is Nothing Then Throw New ArgumentNullException("composite") End If If composite.BoolValue Then composite.StringValue &= "Suffix" End If 利用する属性は Return composite End Function System.ServiceModel 名前空間の属性クラスEnd Class
  24. 24. メッセージと引数<ServiceContract()>Public Interface IService1 <OperationContract()> Function GetData(ByVal value As Integer) As String <OperationContract()> Function GetDataUsingDataContract (ByVal composite As CompositeType) As CompositeTypeEnd Interface • 引数は何個でも定義可能 • .NET 基本型であれば DataContract による定義も不要 • ただしメッセージを独自定義し利用する場合は一つに限定 • 複合型を利用したい場合は DataContract にて メッセージの型を定義
  25. 25. メッセージの高度な制御 データ量やエンコーディングの負荷などを 考慮して適切な方法を選択する場合がある相互運用性 サイズ 速度 HTTPベース規定エンコーダ高 大 遅 テキスト BASE64 にてエンコーディング XML形式 バイトデータはそのまま 他データをエンコーディング MTOM形式 バイトデータが2000バイト を超える場合にメリットあり バイナリ .NET Binary XML 形式低 小 速 形式
  26. 26. <system.serviceModel> … <bindings> <basicHttpBinding> <binding name="ExampleBinding" transferMode="Streaming"/> </basicHttpBinding> </ WCF でのストリーミング 大量データを送受信するストリーミングを 行うには制約がついて回る  メッセージ全体に対してデジタル署名を使えない  データ部のみなら利用できる  バインディングが限定される  BasicHttpBinding  NetTcpBinding  NetNamedPipeBinding  WebHttpBinding <system.serviceModel> ストリーミング利用時の構成サンプル <bindings> <basicHttpBinding> <binding name="ExampleBinding" transferMode="Streaming"/> </basicHttpBinding> </bindings> <system.serviceModel>
  27. 27. WCF サービスのホスティングIIS・IIS Express• AppFabric も利用可能( .NET Framework 4 以上が必要)• HTTP/S でのホストがメイン Web サービス向けWAS (Windows process Activation Service)• IIS の追加コンポーネント (IIS 7.0 以降)• HTTP 以外でのホスト(TCP や キュー) イントラネット向けセルフホスト• 自作プログラムでホスト• 名前付きパイプだろうがなんでも OK パッケージ向け
  28. 28. IIS 利用時の捕捉 IIS ホストOS WAS AppFabric バージョンWindows XP IIS 5.1 × ×Windows Server 2003 IIS 6.0 × ×Windows VistaWindows Server 2008 IIS 7.0 ○ ○ (XP 以降) Express ○ △ ※AppFabric は Windows Vista 以降でのみ利用可能 • AppFabric をインストール済みの場合 IIS Express は AppFabric の影響を受けます。 • 勝手に永続化を行おうとしてエラーになって気付きます… • AppFabric は IIS の管理コンソールに追加されますので IIS Express だけでは調整ができません。
  29. 29. サービスロジックの実装インターフェース上で定義した サービスインターフェースを継承メソッドに対してコーディングを行うPublic Function UserLogin(ByVal sessionID As Integer, ByVal userName As String) As Boolean Implements IWcfSessionService.UserLogin Dim result As Boolean = False Try Using dbCon As New SqlCeConnection(CreateDbConnectionStrings) dbCon.Open() Dim ceTran As SqlCeTransaction = dbCon.BeginTransaction 現時点のセッション情報を更新 Dim sql As String = "INSERT INTO T_SESSION " _ + "VALUES (" _ + "1" + ", " + sessionID.ToString + ", N" + userName + ")" Dim dbCom As New SqlCeCommand(sql, dbCon, ceTran) dbCom.ExecuteNonQuery() ceTran.Commit() dbCon.Close() End Using result = True Catch ex As Exception サービスのロジック部分は通常の WriteEventLog(ex.Message) End Try アプリケーションとなんら変化なし Return result End Function
  30. 30. サービス操作の方向性 要求/応答モデル •クライアントから要求を送信、サービスがそれに対して応答を送信するモデル •WCF の基本スタイル 1方向サービス •クライアントから要求を送信するのみでサービスは何も応答を送信しない •Sub (Void) なメソッド呼出(実際の Sub(Void) とは異なる) 双方向サービス •クライアント・サービス双方が互いに独立してメッセージを送信できる形式 •サービスコントラクトでコールバック指定を行いクライアント側で呼び出す処 理を指定する
  31. 31. メタデータの公開 <?xml version="1.0" encoding="utf-8"?> Web サービスは <definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/‖ xmlns="http://schemas.xmlsoap.org/wsdl/"> メタデータを公開できる <types> <s:schema elementFormDefault="qualified"  構成ファイル等で targetNamespace="http://www.dsri.jp/edi-bp/2004/jedicos- xml/client-server"> HttpGetEnabled = ―true‖ <s:element name="PutDocument"> <s:complexType>  WSDL ファイル形式 <s:sequence> <s:element minOccurs="1" maxOccurs="1" 以外も可能 name="messageId" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="data"  クライアント AP は type="s:base64Binary" /> <s:element minOccurs="1" maxOccurs="1" これらを参照して name="senderId" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" サービスにアクセスする name="receiverId" type="s:string" /> <s:element minOccurs="1" maxOccurs="1"  直接 WSDL を定義して name="formatType" type="s:string" /> アクセスする事も可能 <s:element minOccurs="1" maxOccurs="1" name="documentType" type="s:string" />  VS で Web 参照を行った場 </s:sequence> </s:complexType> 合はこの情報を自動で取込み </s:element> <s:element name="PutDocumentResponse"> ラッパークラスを生成する <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="PutDocumentResult" type="s:boolean" />
  32. 32. REST サービスの実装 WebGet・WebInvoke 属性を利用すると RESTful なサービスを構築できる  利用できるバインディングは WebHttpBinding に限定される<ServiceContract()> UriTemplate でアクセスするPublic Interface IService1 アドレスを設定 <OperationContract()> <WebGet(UriTemplate:="/{Value}")> WebInvoke では HTTP Function ExecuteWorkflow(ByVal Value As String) As String 動詞の指定も行える <OperationContract()> <WebInvoke(UriTemplate:="/{Value}/{opt}", Method:="POST")> Function UpdateCommand(ByVal Value As String, ByVal opt As String) As StringEnd Interface WebGet は WebInvoke の特定パターンを簡易に記載するためのもの
  33. 33. WCF RESTful サービスの構築
  34. 34. 返却されるデータの形式 WebGet・WebInvoke 属性で返却データの<ServiceContract()> 形式を XML または JSON から選択できるPublic Interface IService1 <OperationContract()> <WebInvoke(UriTemplate:="/{Value}/json ", ResponseFormat:=WebMessageFormat.Json)> Function ConvToJSON(ByVal Value As String) As ResValue <OperationContract()> <WebInvoke(UriTemplate:="/{Value}/xml ", ResponseFormat:=WebMessageFormat.Xml)> Function ConvToXML(ByVal Value As String) As ResValueEnd InterfacePublic Function ConvToJSON(Value As String) As ResValue データコントラクト Implements IService1.ConvToJSON Return New ResValue With {.ResultValue = Long.Parse(Value)} と実装 End Function <DataContract()> Public Function ConvToXML(Value As String) As ResValue Public Class ResValue Implements IService1.ConvToXML <DataMember(Name:="resvalue")> Return New ResValue With {.ResultValue = Long.Parse(Value)} Public Property ResultValue As Long End Function End Class<!– XML 形式 --> <!– JSON 形式 --><ResValue xmlns="http://schemas.datacontract. {"resvalue":110}org/2004/07/RESTWFService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 実行結果<resvalue>110</resvalue></ResValue>
  35. 35. セキュリティ 大きく分けると3種類  トランスポート  メッセージ 他にもクライアント証明書など 広範な知識が関連してくる  両方 トランスポート メッセージ 相互運用性 高 低パフォーマンス 速 遅 柔軟性 低 高 メッセージセキュリティはトランスポートに依存しないため 複数のトランスポートで共通したセキュリティを実装できる
  36. 36. イベントログへの出力 WCF セキュリティ機能として Windows イベントログへ簡単に出力する機能が用意 されている<configuration> セキュリティポリシーの <system.serviceModel> 設定と関連がある <behaviors> <behavior> <serviceSecurityAudit auditLogLocation="Application" suppressAuditFailure="true" serviceAuthorizationAuditLevel="Failure" messageAuthenticationAuditLevel="SuccessOrFailure" /> </behavior> </behaviors> </system.serviceModel></configuration> ただし XP ではアプリケーション ログへの出力のみ可能newAudit.AuditLogLocation = AuditLogLocation.ApplicationnewAudit.MessageAuthenticationAuditLevel = AuditLevel.SuccessOrFailurenewAudit.SuppressAuditFailure = FalseserviceHost.Description.Behaviors.Remove(Of ServiceSecurityAuditBehavior)serviceHost.Description.Behaviors.Add(newAudit)
  37. 37. WCF 拡張機能WebAPI  より容易に RESTful なサービスを適用するため のものjQuery Support  WCF Web サービスを jQuery より利用しやす い形にするExpress Interop Bindings  一部特定システムと接続を行いやすくするため のもの( VS のアドイン)  Oracle WebLogic  Oracle Metro  IBM WebSphere  Apache Axis2 WebAPI と jQuery Support は NuGet より適用可能
  38. 38. まとめとりあえず使う!話はそれからだ!レスポンスを考慮してチューニングする 箇所は多数用意されていますプログラム間通信や C/S での サービスにおいてもかなり簡易です特にプログラム間通信が非常に楽IIS でホストする以外でも利用価値は高 いですレガシーマイグレーションも効果が高いレガシーアプリをラップしてサービス提供
  39. 39. WindowsWorkflowFoundation
  40. 40. Workflow とは?フローチャートなどの図式により プログラミングを行えるもの日本一般のワークフローとは若干異なるコンポーネント(処理のブロック) 毎の独立性が非常に高い アクティ ビィ1 アクティ アクティ ビティ2-1 ビティ2-2 アクティ アクティ アクティ ビティ3-1 ビティ3-2 ビティ3-3
  41. 41. Microsoft 製品での WFWF 4 を利用している製品 Team Foundation Server 2010 BizTalk Server 2010 (Entity Framework の内部)WF 3.x を利用している製品 Sharepoint Server似ているけど違う製品 SQL Server Integration Services System Center Orchestrator 2012 (旧 Opalys)
  42. 42. WF の特徴・概念アクティビティと呼ばれる要素の集合振舞い・手順をモデルとして保存・実行 XML (WF3.x は xoml、WF4 は xaml)で 保存される長期間における実行をサポートしている 永続化、ブックマーク、アンロード 標準で SQL Server を容易に利用できるデザイナ上でモデル作成する方法とロジッ ク上で全てを行う方法があるGUI / CUI どちらも対応可能
  43. 43. 開発環境についてExpress ではそのままだと無理 デザインコンポーネント拡張が必要な為 エディタを自前で用意すれば可能WF 3.5  Visual Studio 2005 + ExtensionS for Windows WF Visual Studio 2008 Standard 以降WF 4 Visual Studio 2010 Professional 以降
  44. 44. WF 3.5 と 43.5 と 4 はクラス構成も 変更され全くの別物  基底クラスから全て異なる3.5 で実装されたアク ティビティを4 環境で 利用する特殊措置を提供  Interop アクティビティ  CodePrex で移行キットを 提供…  基本は作り直し  WF 3.x を利用してないのなら 気にしないのが幸せです
  45. 45. WF4 での主な改善点WF 3.x よりもパフォーマンス向上全面的に向上しすぎ今まではなんだったんだ 参考:MSDN:Windows Workflow Foudation 4 のパフォーマンス http://msdn.microsoft.com/ja-jp/library/gg281645.aspx
  46. 46. ワークフローの種類 ※1 ステートマシンを シーケンシャル ステートマシン フローチャート 利用するにはWF 3.5 ○ ○ × .NET Framework 4 Platform Update 1WF 4 ○ ○※1 ○ の適用が必要
  47. 47. 組み合わせたワークフローSequenceワークフロー内でFlowchartワークフローを利用するなど、複数のワークフローを組み合わせて利用できる
  48. 48. アクティビティとワークフロー WF4 になり大きく変更したクラス構成System.Workflow.Activities 名前空間 WF 3.x WF 4 System.Activities 名前空間ActivityToolboxItem Sequence StateMachine Activity Activity ActivityDesigner ActivityDesigner ActivityDesigner ActivityValidator Theme WinForms と同様に基本は全てコード コードでのカスタマイズと のみでカスタマイズを行う xaml によるカスタマイズを利用する
  49. 49. デザイナ・リホスティングWF4 になって大きく進化した点の一つ デザイナ・ツールボックス・プロパティエディタ を標準で提供(しかも簡易に利用できる)
  50. 50. デザイナーのリホスティング
  51. 51. アクティビティの利用 例)Assign アクティビティ 値の代入や計算の実行等多くの事が行える。 変数の新規定義は行えないVB 構文を利用して式を記述する変数はデザイナ上で定義変数や起動時の引数などもデザイナ上で定義する事ができる
  52. 52. 標準アクティビティ フロー制御アクティビティ名 処理内容DoWhile / While While 形式のループ制御。条件判定の位置が異なるForEach / ParallelForEach ForEach 形式のループ制御If 計算式の結果による制御分岐Parallel 指定されたアクティビティを並行して動作させる(※)Pick アクティビティの実行結果による制御分岐Switch 計算式の結果による制御の多分岐Sequence 順番に制御を遷移させるコンテナー プリミティブアクティビティ名 処理内容Assign 値の設定、計算の実行Delay ワークフローの実行待機InvokeMethod アセンブリ・クラス・メソッドを指定して実行WriteLine 標準出力(コンソール)へデータを出力
  53. 53. 標準アクティビティ(2) ランタイムアクティビティ名 処理内容Persist 永続化を行うTerminateWorkflow ワークフローを終了させる エラー処理アクティビティ名 処理内容Rethrow Catch した例外をそのままスローThrow 例外(エラー)を発生TryCatch Try~Catch 形式による例外処理 コレクションアクティビティ名 処理内容AddToCollection 配列・コレクションに要素を追加ClearCollection 配列・コレクションを初期化ExistsInCollection 配列・コレクションに要素が存在するか判定RemoveFromCollection 配列・コレクションから要素を削除
  54. 54. Persist / Unload / Bookmark実行時間が比較的長めになる ワークフローを補助する機能Persist 永続化を SQL Server 以外にするた ワークフローの途中セーブ機能 めには自前で永続化 現状をストレージに保存(永続化) ロジックを用意するUnload メモリ上からワークフローを削除 永続化していなければ…Bookmark 外部プログラムと連携するための目印
  55. 55. SQL Server に永続化する WF4 の標準機能として提供 Dim persistInstance As SqlWorkflowInstanceStore = Nothing SQL Server の永続化を有効にする Dim conBuild As New System.Data.SqlClient.SqlConnectionStringBuilder conBuild.DataSource = "127.0.0.1SQLEXPRESS" conBuild.InitialCatalog = "WF4" conBuild.IntegratedSecurity = True persistInstance = New DurableInstancing.SqlWorkflowInstanceStore(conBuild.ToString) _wfApps.InstanceStore = persistInstance.NET 4 インストール時に WF4 用の永続化設定スクリプトもインストールするので、それを実行すると SQL Server で永続化するための環境を作成してくれる(%Windows%Microsoft.NETFrameworkv4.0.30319SQLja) スキーマ定義用:SqlWorkflowInstanceStoreSchema.sql ロジック定義用:SqlWorkflowInstanceStoreLogic.sql
  56. 56. 標準アクティビティ(3) トランザクションアクティビティ名 処理内容CancellationScope 処理の取消を行える制御コンテナCompensableActivity 確認、キャンセル、補正を行える制御コンテナCompensate CompensableActivity の補正を呼び出すConfirm CompensableActivity の確認を呼び出すTransactionScope トランザクション制御を行えるコンテナワークフローは性質上一つの処理が長時間に(場合によっては数か月とかにも)わたる事がありえるので、一般的なトランザクションを利用すると、常にワークフローをメモリ上に保持していなくてはならないので非効率 補正処理はロールバック処理に近い内容 確認処理はコミット処理に近い内容
  57. 57. 標準アクティビティ(4) メッセージングアクティビティ名 処理内容CorrelationScope メッセージの相関関係を設定InitializeCorrelation 相関関係の初期化Receive メッセージの受信ReceiveReply 受信したメッセージに対する結果を送信ReceiveAndSendReply ReceiveとSendReplyアクティビティのセットSend メッセージの送信SendReply 送信したメッセージに対する結果の受信SendAndReceiveReply SendとReceiveReplyアクティビティのセットTransactedReceiveScope サーバー・クライアント間でトランザクションを構成 SendAndReceiveReply アクティビティ等のセット構成を利用すると Correlation 等の必要事項設定が自動的に行われる
  58. 58. メッセージ関係アクティビティReceiveAndSendReply アクティビティ を利用すると簡単にサービスが作成できる リクエストの受信 サービスで行う処理 処理内容を変更する際は アクティビティを組み替えれば良い 結果の送信
  59. 59. 標準アクティビティ(5) 移行アクティビティ名 処理内容Interop WF 3.x アクティビティを WF 4 上で利用する※全ての WF 3.x アクティビティを利用できるのではなく様々な条件が存在する フローチャートアクティビティ名 処理内容Flowchart フローチャート型のワークフローFlowDecision 式の結果による制御分岐FlowSwitch 対象による制御多分岐※FlowDecision と FlowSwitch は Flowchart 上でのみ利用可能 ステートマシンアクティビティ名 処理内容StateMachine 状態遷移型のワークフローState ステートマシン内部で状態を設定・表現FinalState 状態遷移の終了
  60. 60. フロー制御アクティビティメッセージングアクティビティ Flowchart ワークフロー
  61. 61. アクティビティの実装 アクティビティ本体 クラス Activity CodeActivity 同期処理型アクティビティ NativeActivity 全機能が利用できるアクティビティ DynamicActivity 動的にアクティビティを生成 CodeActivity か NativeActivity を継承して実装する ※非同期用 CodeActivity の AsyncCodeActivity もある デザイナ上でアクティビティを操作・設定する際に必要 ActivityDesigner 有りActivityDesigner ActivityDesginer 無し
  62. 62. アクティビティの実装(2)Imports System.ActivitiesImports System.Windows.Forms ワークフローで管理すべき変数はPublic Class DisplayActivity InArgument、OutArgument、 Inherits CodeActivity InOutArgument にて定義 文字列型のアクティビティ入力引数を定義します Property Text() As InArgument(Of String) Public Sub New() Me.DisplayName = "メッセージを表示" End SubProtected Overrides Sub Execute(ByVal context As CodeActivityContext) テキスト型の入力引数のランタイム値を取得します Dim inpText = context.GetValue(Me.Text) MessageBox.Show(inpText) End SubEnd Class Execute メソッドがアクティビティ 実行時に呼び出される
  63. 63. アクティビティの実装(3)Public Class AsyncInputDialogActivity Inherits AsyncCodeActivity Public Property InputStrings As OutArgument(Of String) Private Delegate Function AsyncExecuteDelegate() As String Protected Overrides Function BeginExecute(ByVal context As AsyncCodeActivityContext,ByVal callback As AsyncCallback, ByVal state As Object) As IAsyncResult Dim asyncExecDel = New AsyncExecuteDelegate(AddressOf [sampleMethod]) context.UserState = asyncExecDel Return asyncExecDel.BeginInvoke(callback, state) End Function Protected Overrides Sub EndExecute(ByVal context As AsyncCodeActivityContext, ByValresult As IAsyncResult) Dim asyncExecDel = TryCast(context.UserState, AsyncExecuteDelegate) Dim resultStrings = asyncExecDel.EndInvoke(result) InputStrings.Set(context, resultStrings) End SubEnd Class 処理開始時に BeginExecute メソッドが 処理終了時に EndExecute メソッドが呼び出される
  64. 64. 補足:Activity Execution Context Public Class SampleAddValue Inherits CodeActivity Public Property ActivityValue1 As Integer = 0 Public Property ActivityValue2 As InArgument(Of Integer) = 0 Protected Overrides Sub Execute(context As CodeActivityContext) ActivityValue1 += 1 Dim arg = context.GetValue(ActivityValue2) arg += 1 Console.WriteLine("Prop : " + ActivityValue1.ToString) Console.WriteLine("Args : " + arg.ToString) End Sub End Class特定のアクティビティ内部では実行アクティビティを毎回生成せずにインスタンスを使いまわす(WF 3.x までの挙動とは逆になります)そのため Property として定義されている値がインクリメントされた結果にて実行されてしまう
  65. 65. デザイナーの実装 デザイナーの実装は XAML にて行う<sad:ActivityDesigner x:Class="MultilineCommentActivityDesigner" x:Uid="MultilineCommentActivityDesigner― <!—名前空間の定義を色々と・・・--> > <sad:ActivityDesigner.Resources> <ResourceDictionary> <sadc:ModelPropertyEntryToModelItemConverter x:Key="ModelPropertyEntryToModelItemConverter" /> <sadc:ArgumentToExpressionConverter x:Key="ArgumentToExpressionConverter" /> </ResourceDictionary> </sad:ActivityDesigner.Resources> <Grid> <sapv:ExpressionTextBox Expression="{Binding Path=ModelItem.CommentStrings, Mode=TwoWay, Converter={StaticResource ArgumentToExpressionConverter}, ConverterParameter=In }" ExpressionType="s:String" OwnerActivity="{Binding Path=ModelItem}" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" /> </Grid></sad:ActivityDesigner> WPF でフォームを作成するのとほぼ同一
  66. 66. アクティビティのカスタマイズ
  67. 67. Expression TextBoxワークフローデザイナ上で計算式を入力する際にインテリセンスの提供や構文チェックなどが行える VisualBasic 構文でのみ利用可能 Visual Studio 上で利用する際はインテリセンスが自動で利用可能 リホスティングの際は自前でインテリセンスを提供する必要がある IExpressionEditorService を継承したクラスで実装 designer.Context.Services.Publish(Of IExpressionEditorService)([expEditor]) http://msdn.microsoft.com/ja- jp/library/system.activities.presentation.view.iexpressioneditorservice.aspx
  68. 68. 補足:インテリセンス  Visual Studio 2010 で提供されている Dll を 利用すれば同等の挙動をさせる事は可能  Express ではインストールされない Dll を含め 大量に参照が必要  海外の人達はこの手法を利用している気配がある  というか米国 MSDN フォーラムで掲載されている スレッドにて猛者な人がロジックを掲載したhttp://social.msdn.microsoft.com/Forums/en-IE/wfprerelease/thread/07f89fc0-81ff-4e85-a974-013b15b62f50
  69. 69. ワークフロー上の変数 親アクティビティで定義した変数は 子アクティビティで利用できる (Activity Delegate) 子アクティビティで利用できる (エラーにならない)内部では Activity Delegate を利用し架空の定義をアタッチし実行時には実変数をアタッチする親アクティビティで定義した変数
  70. 70. Workflow サービス ワークフローを WCF に て外部公開  メッセージ系アクティビ ティを利用 拡張子が xaml ではなく xamlx 中身はほぼ同一  サービス固有の事象はなし ワークフロールート要素 が WorkflowService
  71. 71. WF サービスのデプロイ最低限必要なファイルは2つ  Web.config と サービスの xamlxWindows Azure にデプロイする際は [WCF Service Web Role]にて作成
  72. 72. Workflow サービス
  73. 73. WF 拡張機能Security Pack (CTP 1)ADO.NET Activity Pack (CTP 1)UnitTesting (v1.8.3)Microsoft.Activities (v.1.8.3)AppFabrix Caching Activity Pack (v0.1) Codeplex で提供されている。 永遠に CTP 1 のような気がするものもある。
  74. 74. WF が適する場面スクリプトで行う定型的な処理監視用スクリプトなどはお勧めユーザーに簡易プログラムを 作成させるもの (EDI 連携とか給与システムとか)デザイナ部分のみ利用承認ワークフローシステムへと流用…?
  75. 75. まとめ基本的には実行基盤なので何でも できる…が、向き不向きは当然あるActivity をどこまで用意できるか で使われ度合は大きく変わる開発者向けではないと思おう既存資産をアクティビティ化すると 非常に効果が高い
  76. 76. Appendix WCF Fiddler (http://www.fiddler2.com/fiddler2/) WCF Community site (http://wcf.codeplex.com/) The Problem Solver (http://msmvps.com/blogs/theproblemsolve r/default.aspx)
  77. 77. Appendix WF The Activity Designer (http://blogs.msdn.com/b/tilovell/) AppFabric Team Blog(旧 The .NET EndPoint) (http://blogs.msdn.com/b/appfabric/) MS 松崎さん Blog (http://blogs.msdn.com/b/tsmatsuz/) てすとぶろぐ (http://blogahf.blogspot.com/) 恐らく退職などでもう更新されていない MSDN Blog  Matt Ws Windows Workflow Place (http://blogs.msdn.com/b/mwinkle/)  Go with the Flow (http://blogs.msdn.com/b/flow/)  Cathy Dumas‘s Blog (http://blogs.msdn.com/b/cathyk/)  Kushal Shah – Workflows (http://blogs.msdn.com/b/kushals/)

×