【SharePoint と BizTalk の連携 (3)】 SharePoint へのドキュメントの送信


環境:
Microsoft Office SharePoint Server (MOSS) 2007 (または WSS 3.0)
BizTalk Server 2006 R2
Visual Studio 2005

SharePoint と BizTalk の連携

  1. 考え方と環境準備
  2. SharePoint からのドキュメントの受信
  3. SharePoint へのドキュメントの送信
  4. タスクリストなど (ドキュメントライブラリ以外のリスト) との連携

こんにちは。

今回は送信方法についてご説明します。
BizTalk Server を使った作成の全般的な手順については 前回 詳述しましたので、今回は前回と異なる箇所を中心に説明していきます。BizTalk Server と SharePoint を使った一般的な流れをまず学習したい方は、事前に 前回 の投稿を確認してからこちらを読んでください。(ただし 「送信」 時独自のネタなどもいくつかありますので、このあたりはちゃんと記載するようにします。)

こんどは、csv ファイルが配置されたら、ファイルの中の各レコードをみて、一定金額以上なら InfoPath のフォームライブラリにドキュメントを登録し、そこから先は SharePoint の承認ワークフローなどで承認されるというサンプルを作成してみましょう。

前回 と同様の InfoPath フォーム (.xsn) と csv ファイルをあらかじめ作成しておきましょう。(前回作成した方はそのまま使用してOKです)

BizTalk Server プロジェクトの作成

  1. 空の BizTalk Server プロジェクトを新規作成します。

  2. 前回 と同様の方法で、csv ファイルからスキーマ定義 (.xsd) を新規作成します。また同様に、InfoPath フォーム (.xsn) のスキーマ定義を抽出して (BizTalk Server プロジェクトに) .xsd を追加しておきます。

  3. 今回は、csv ファイルには複数行存在する可能性がありますので、この複数行のレコードから順番に 1 レコードずつを取り出して処理していくようにしてみましょう。
    その方法には、スクリプトの Functoid を使う方法 (iterator の引数を使ってカスタムの XSLT などによる変換) などいろいろありますが、今回は .NET の開発者にわかりやすいよう、.NET クラスを使ってカスタムに処理していきましょう。(以前 は説明したいエッセンス以外で余計な処理を含めたくなかったので、素のまま System.Xml で処理しましたが、今回はこれとは別の方法です)

    そこでまず、上記の .xsd から .NET クラスを生成します。
  • Visual Studio コマンドプロンプトを起動し、上記の 2 つの .xsd のそれぞれについて以下の通り入力し、スキーマ定義ファイル (.xsd) から C# のコードファイル (.cs ファイル) を自動生成します。

    xsd.exe <.xsd ファイル名> /c

  • BizTalk のソリューション (Visual Studio) 上で、[ファイル] - [追加] - [新しいプロジェクト] で、[クラスライブラリ] のプロジェクトを新規に追加します。
    作成された Class1.cs などは削除し、このプロジェクトの中に上記の cs ファイル (2 つ) を追加しておきます。

  • このプロジェクトに署名を添付してビルドし、作成された dll を配置後の BizTalk アプリケーションが使用できるように GAC に登録 (%system drive%Windowsassembly にドラッグアンドドロップ) してください。

  • BizTalk プロジェクト側の [参照の追加] で、上記のクラスライブラリのプロジェクトを参照追加しておきます。

  • 以上で準備完了です。
    では、オーケストレーションを作成していきますので、前回同様、プロジェクトにオーケストレーションを追加してください。

  • 上述の通り、このオーケストレーションでは、処理の間じゅうシリアライズ可能な .NET クラスを使用して演算などの処理をしていきますので、その他の処理部分で永続化の処理などおこなえるよう、[オーケストレーションのプロパティ] を表示して [トランザクション] プロパティとして [長時間トランザクション] を選択します。



  • オーケストレーションに以下の 2 つのメッセージ (受信するメッセージと送信するメッセージ) を新規追加します。
    いつも記載することですが、実際の開発では周辺システムに中立なメッセージを設計して、マップなどを使用してシステム側の受信データとマップさせてください。今回はサンプルですので、上記で追加した csv のフラットファイルスキーマをそのままオーケストレーションのメッセージとして使用します。

    識別子 : OrderListMsg
    メッセージの種類 : <上記で追加した csv のフラットファイルスキーマ定義>

    識別子 : FormMsg
    メッセージの種類 : <InfoPath フォームのスキーマ定義>

  • さらに受信した Order 一覧のオブジェクトと、処理中のレコードのインデクス番号、レコード数、現在の Order オブジェクトを入れておく入れ物として、以下の [変数] を新規に作成しておきましょう。(これらの変数は、オーケストレーションの間じゅうずっと使用されます)

    識別子 : Idx
    型 : System.Int32
    初期値 : 0

    識別子 : TotalCount
    型 : System.Int32

    識別子 : OrderListObj
    型 : Orders (<- 上記で作成した CSV のスキーマの .cs のクラスの中で定義されている .NET クラスです)

    識別子 : OrderObj
    型 : OrdersOrder (<- 上記で作成した CSV のスキーマの .cs のクラスの中で定義されている .NET クラスです)



  • まずはオーケストレーション内でメッセージを受信します。
    [受信] 図形と、受信ポートのための [ポート] 図形を配置し、[受信] 図形の [メッセージ] プロパティを上記の「OrderListMsg」にして、[受信] 図形の [アクティブ化] プロパティを true にして、これら (受信図形とポート) を接続します。(手順詳細は、前回 を参照してください)

    下図のようになります。



  • つぎに、受信したメッセージを上記で作成した .NET クラスの変数に (シリアライズして) キャストします。
    こうしたカスタムなコードによる処理では [式] 図形を使用しますが、その前に、上述の通り、このオーケストレーションが「長時間トランザクション」であったことを思い出してください。
    例えば、「長時間トランザクション」の範囲では、シリアライズ可能な変数しか使用できません。
    今回の処理は、メモリ中で処理してメモリ上から破棄される一時的なトランザクションを使いますので、左から [スコープ] 図形をドラッグアンドドロップし、[スコープ] 図形の [トランザクション] プロパティとして [アトミック] を設定します。そして、その中に [式] 図形をドラッグアンドドロップします。
    下図のようになります。(分離レベルなどは今回そのままとしておきます)



  • つぎに "このスコープ内に" 変数を作成します。
    右のエクスプローラ上に上記でドラッグアンドドロップしたスコープのグループがありますので、ここを展開し、この中に以下の変数を作成していきます。
    以前記載しましたが、BizTalk Server のメッセージオブジェクトは下記の XLANGMessage 型で取り出すことができます(またこの型はマルチパートになっていて、下記の XLANGPart 型のコレクションになっています)。

    識別子 : receiveMessage
    型 : Microsoft.XLANGs.BaseTypes.XLANGMessage

    識別子 : receivePart
    型 : Microsoft.XLANGs.BaseTypes.XLANGPart

    識別子 : receiveOrderList
    型 : System.Array



  • つぎに上記の [式] 図形をダブルクリックするとコードを記載するエディタ (式エディタ) があがってきますので、ここに以下の通り処理を記述します。

    // Message から .NET Object にして取り出す
    receiveMessage = OrderListMsg;
    receivePart = receiveMessage[0];
    OrderListObj = (Orders) receivePart.RetrieveAs(typeof(Orders));

    // レコードの件数を取り出す
    receiveOrderList = (System.Array) OrderListObj.Order;
    TotalCount = receiveOrderList.Length;

  • 最後にループをおこなって送信用のメッセージを構築していきます。
    下図の通り [ループ] 図形をドラッグアンドドロップします。



  • ループ図形をダブルクリックすると条件を入力できる式エディタがあがってきますので、以下の通り入力します

    Idx < TotalCount

  • ループ内でもアトミックな処理を記述しますので (テンポラリの変数を使用するなど)、上記の初期化処理の際と同様に、ループ内にスコープを挿入し、[トランザクション] プロパティを [アトミック] に設定します。
    また同様に、このスコープ内にも、この中で使用する以下のアトミックな変数を作成しておきます。

    識別子 : receiveOrderList
    型 : System.Array

    識別子 : formOrderObj
    型 : MyOrder (<- 上記 xsd.exe コマンドで作成した InfoPath フォームの .NET クラス)

  • Idx 番目の項目 (Order) を取り出すため、[式] 図形をこのスコープ内に挿入し、この図形をダブルクリックして以下の通りコードを記入します

    // Idx 番目の Order を取得
    receiveOrderList = (System.Array) OrderListObj.Order;
    OrderObj = (OrdersOrder) receiveOrderList.GetValue(Idx);



  • つぎに金額のチェックをおこなうため、[決定] 図形をループの中のつぎの処理の場所にドラッグアンドドロップします。



  • 分岐条件として、左の Rule_1 をダブルクリックし、表示される式エディタに以下を入力します

    OrderObj.ProductCost > 3000

  • では、InfoPath フォームライブラリに送信するメッセージを構築していきます。
    上図の Rule_1 の中に [メッセージの構築] 図形をドラッグアンドドロップし、その中にさらに [メッセージの割り当て] 図形をドラッグアンドドロップします。
    そして、[メッセージの構築] 図形の [構築メッセージ] プロパティとして FormMsg を選択します。



  • [メッセージの割り当て] 図形をダブルクリックして、メッセージ構築のためのコードとして以下を記入します。

    // 送信フォーム用のオブジェクトを作成しメッセージとする
    formOrderObj = new MyOrder();
    formOrderObj.ProductName = OrderObj.ProductName;
    formOrderObj.ProductCost = OrderObj.ProductCost.ToString();
    FormMsg = formOrderObj;

  • [送信] 図形と、送信用の [ポート] 図形をドラッグアンドドロップし、下図のように FormMsg のメッセージを送信します



  • オーケストレーションの最後として、[式] 図形を上記の [決定] 図形の出口にドラッグアンドドロップし、以下の式を記入しておきましょう。

    Idx = Idx + 1;

  • さいごに、前回 同様に、CSV ファイル用の受信パイプラインを作成しておいてください。
    今回は受信パイプラインですから、[逆アセンブル] の箇所に [フラットファイル逆アセンブラ] をドラッグアンドドロップしておきます。(なお [ドキュメントスキーマ] プロパティとして、上記の最初で作成した CSV ファイル用のスキーマを選択します)
  • これで完了しましたので、あとは 前回 同様、

    • この BizTalk Server プロジェクトへの署名
    • この BizTalk Server プロジェクトへのアプリケーション名の設定

    をおこなって、リビルドと配置をおこなってください。

    物理ポートの設定

    CSV 側の物理ポートの設定については、今回は受信側になるという点を除いては 前回 同様です。(パイプラインの指定も忘れないように実施しておいてください)

    また SharePoint 側についても前回とほぼ同様ですが、今回は下図のように [構成] 画面上に [Windows SharePoint Services 統合] というグループが表示されている点に注意しましょう。
    これは、タスクリスト、ブログ、カスタムリストなど、リストの列そのものを設定する際に使用するものですが、今回はドキュメントライブラリへのドキュメント登録であり、またこれについてはおそらく次回ご説明することになると思いますので、今回は空のままにして進みましょう。

    ということで、前回 同様、下図の通り送信先の SharePoint の URL やドキュメントライブラリの URL を指定します。(このドキュメントライブラリは、無論、上記の InfoPath フォームを発行した先のライブラリとしておいてください)

    さて、ここで 「ファイル名」 が 1 つのポイントになってきます。
    今回の場合、SharePoint に保存するファイル名は上図のように BizTalk Server の Message ID を使用しています (OrderRequest-%MessageID%.xml) が、下部のコメント欄に記載されているように XPath を使った表現もできますので、例えば、InfoPath のフォームの中の ProductName を使って <ProductName>.xml といったファイル名などにすることも可能です (この場合、名前空間も正しく指定しておく必要があります。この辺りは、また次回にでも記載してみましょう、、、) また、BizTalk のオーケストレーション内部からファイル名を都度コードで指定するといったことなどもできます。
    なお、上図で [上書き] プロパティを 「はい」 に設定しておくと、同じファイル名のファイルが存在していた際に上書きをおこなってくれます。

    といった感じですが、このシナリオでは他にも留意点があります。
    BizTalk Server から SharePoint に送信をおこなう場合は、第1回 でも記載したように、SharePoint の画面や SharePoint 側で公開された Web サービスを使用するのではなく、WSS Adapter が独自にインストールする Web サービスを使用しているという点です。
    ですので、ケースによっては SharePoint 側で設定した IIS の構成内容が反映されず、それが原因でエラーとなることがあります。例えば今回のように、ドキュメントが登録されたあとで SharePoint Designer のワークフローが自動で実行される場合などには、(カスタムアクティビティを作成した経験のある方はおわかりと思いますが) web.config の authorizedType 要素をみていますので、SharePoint の config 上の以下の部分を BizTalk の WSS Adapter の .config (%Program Files%Microsoft BizTalk Server 2006Business Activity ServicesBTSharePointV3AdapterWSweb.config) にコピーする必要があります。(注 : configSections は必ず先頭に記述します)

      <configSections>
        <sectionGroup name="System.Workflow.ComponentModel.WorkflowCompiler" type="System.Workflow.ComponentModel.Compiler.WorkflowCompilerConfigurationSectionGroup, System.Workflow.ComponentModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
          <section name="authorizedTypes" type="System.Workflow.ComponentModel.Compiler.AuthorizedTypesSectionHandler, System.Workflow.ComponentModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </sectionGroup>
      </configSections>
      . . . . . . .

      <System.Workflow.ComponentModel.WorkflowCompiler>
        <authorizedTypes>
          <authorizedType Assembly="System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Workflow.*" TypeName="*" Authorized="True" />
          . . . . . . .

        </authorizedTypes>
      </System.Workflow.ComponentModel.WorkflowCompiler>

    また、ドキュメントを登録するユーザも BizTalk ホストアカウントになりますので、「アイテムの作成者」を使用したワークフローを使用している場合や、特別な権限を設定している場合には注意が必要です。

    さて、ここまで、ドキュメントライブラリへのファイル登録 (それも BizTalk と相性の良い InfoPath の例) をみてきましたが、SharePoint にはドキュメントライブラリ以外のリストも数多く存在し、重要な役割を担っています。例えばその代表例が、「タスクリスト」です。SharePoint をチームのポータルとして使用されているところでは、外部システムの状態に応じて SharePoint のタスクと連携したくなることでしょう。
    次回はこうしたドキュメントライブラリ以外のリストを使った処理について記載したいと思います。

     

    Comments (3)

    1. scriptEYE says:

      �ե꡼��������CGI��PHP������ץȤ??���ɡ�96�Υ��ƥ��꡼���鸡���Ǥ��ޤ������������ɥ�????μ»ܤˤ��͵��٤�ɾ���⤢�ꡪ ������������ץȤǤ⡢��Ͽ�����Ѥϰ���̵���Ǥ���

    2. SharePoint と BizTalkで、MSエバンジェリストの松崎さんがかなり良い記事を連載していたことに気づく。 ■SharePoint と BizTalk の連携 考え方と環境準備 http:

    Skip to main content