Uncategorized

(Part 6) SharePoint の Workflow 用 Web Service を使ってシステム連携をおこなう

※ 以下、Tech ED T-405 セッションに関するフォローアップ記事 Part 6 です。

  1. SharePoint Designer のカスタムアクティビティの開発で workflowProperties と同等の変数を使うには 
  2. SharePoint ワークフローで Modification Form (修正フォーム) を開発する際のいくつかのポイント
  3. Replicator を使いこなす (実行時にワークフローの流れを変える)
  4. SharePoint ワークフローにおけるカスタムなワークフローステータスの設定
  5. SharePoint ワークフロー : 上級者のための IListItemService の活用
  6. SharePoint の Workflow 用 Web Service を使ってシステム連携をおこなう

環境:
Microsoft Office SharePoint Server 2007
Visual Studio 2005 (及び Workflow 用の extensions)
Office SharePoint Server 2007 SDK

こんにちは。

今日は、小高(エバンジェリスト)の手術快気祝いのため、どうしてもあと30分で書ききる必要があります。(結局、昼すぎから仕事はできませんでした、、、しかも私は幹事ですのでさぼるわけにはいかないのです)

さて、さいごのブログ Tech ED ですが、これは、ECM Starter Kit などでもサンプルがありませんので、コードを含め記載します。

SharePoint ワークフローのシステム連携のシナリオです。ワークフローとシステム間を同期的に連携したいという場合 (例: ワークフローのアクティビティをある時点で止めて、外部システムでデータの処理をしおわったら、次のアクティビティに進める、など)、タスクを有効活用すると便利です。ワークフローからシステム用にタスクを生成して外部システム側に通知し、外部システム側で所定の処理が終了したら AlterTask メソッドなどを使用してタスクを完了させることで、同期連携を実現できます (2007/08/27 赤字追記 : すみません、急いで書きすぎたので、補足しました)。リモートのシステムの場合には、独自に Web サービスを作成して、そこから SharePoint のオブジェクト (Microsoft.SharePoint.dll など) にアクセスして更新するという処理で実現可能でしょう。しかし、例えば、不特定な SharePoint のサイトと連携をするアプリケーションなどを連想して頂くとわかりますが (例:独自システムの側から連携先の SharePoint の URL を入力して接続する、など)、この方法では、毎回接続先のサイトに開発した Web サービスをインストールしておかなければなりません。
こうした場合、もともと SharePoint がもっている Workflow 用の Web サービスを使えば解決されることがあります。

SharePoint をインストールされている環境があれば、http://<your site>/_vti_bin/Workflow.asmx にアクセスしてみてください。上述したタスク関連の更新メソッド (AlterToDo など) が存在しているのがおわかり頂けるでしょう。また、メソッドをみて頂くとわかりますが、StartWorkflow なども存在しています。つまり、リモートから特定のワークフローを開始することもできるようになっています。(SharePoint では、WF では普通におこなわれる、WorkflowRuntime を取得してインスタンスを開始する方法というのはサポートされていませんので、WF に精通されている方は注意してください。)

今日は、その使い方について非常に簡単ではありますが、サンプルをご紹介します。(すみません、セッションでは、もう少し凝ったデモをお見せしたかったのですが、煩雑にしないよう、このブログでは簡単なサンプルをのせておきます、、、)
使い方は難しくありません。が、以下の通り、タスクの ItemUrl を設定する必要などがあるなど、引数に何を入れて良いか、最初は迷われると思いますので参考にしてください。

無論、実行前に、Web 参照の追加をおこなってプロキシコードを作成しておきます。(以下で、FabrikamSystem.localhost は Web 参照の追加で追加されたプロキシオブジェクトの名称とします。)

/////////////////////////// Sample 1 : get task data from remote site// (何も設定していないと ows_PercentComplete や ows_Body は null なので要注意しましょう ,,,)/////////////////////////FabrikamSystem.localhost.Workflow wf = new FabrikamSystem.localhost.Workflow();wf.Url = @"http://kkdeveva01/sites/officedemo/_vti_bin/Workflow.asmx";wf.UseDefaultCredentials = true;wf.Credentials = System.Net.CredentialCache.DefaultCredentials;wf.PreAuthenticate = true;//// get task data (item id = 44, task list guid = 50CA0DD9-BD63-4E80-BB98-E62A4E3FA7C6)//XmlNode node = wf.GetWorkflowTaskData(@"http://kkdeveva01/sites/officedemo/Lists/Tasks/44_.000", 44, new Guid("50CA0DD9-BD63-4E80-BB98-E62A4E3FA7C6"));MessageBox.Show(node.Attributes["ows_Title"].Value);/////////////////////////// Sample 2 : update task data from remote site/////////////////////////FabrikamSystem.localhost.Workflow wf = new FabrikamSystem.localhost.Workflow();wf.Url = @"http://kkdeveva01/sites/officedemo/_vti_bin/Workflow.asmx";wf.UseDefaultCredentials = true;wf.Credentials = System.Net.CredentialCache.DefaultCredentials;wf.PreAuthenticate = true;XmlDocument taskData = new XmlDocument();taskData.LoadXml(@"<z:row xmlns:z=""#RowsetSchema""><Body><div>送信テスト成功!</div></Body><PercentComplete>0.500000000000000</PercentComplete></z:row>");XmlNode result = wf.AlterToDo(@"http://kkdeveva01/sites/officedemo/Lists/Tasks/44_.000", 44, new Guid("50CA0DD9-BD63-4E80-BB98-E62A4E3FA7C6"), taskData);

尚、update 処理で使用している <z:row> の root エレメントですが、ここは使用されていないため、<dummynode> などで設定してもそのまま動作します。(中の child エレメントのみが参照されています。)

 

Categories: Uncategorized

Tagged as: ,

14 replies»

  1. I just want to say you ROCK!!!
    You are the only person in the entire web world who actually knows how to use this webservice without having to specify a document item!!
    Thank you x

    Like

  2. 今回は VSTO からのワークフローの開始について取り上げたいと思います。 VSTO を利用した Office ドキュメントをワークフローのフロントエンドとして利用する場合、リボン UI や操作ウィンドウからワークフローを操作するようなケースがあるとは思います。

    Like

Leave a Reply