Copyright© 2017  Aiprovide Corporation all Right Reserved.

  • Aiprovide Coroporation
  • Aiprovide Corporation

Remote Event Receiver の望ましい実装 No.2[オンライン]

2017/05/07

この記事は、リモートイベントレシーバー(Remote Event Receiver)を、実用的に利用ための実装方法について記載しています。

Remote Event Receiver の望ましい実装 No.1[オンライン]

で記載した様に、「Provider Hosted App」プロジェクトにリモートイベントレシーバーを追加しただけでは、アイテムの追加/変更/削除のイベントの発生時に起動するプログラムを実装することはできません。

 

1.3つのWeb

 

 SharePoint アドイン(アプリ)のプログラムを開発する際に、3つのWebが登場します。

 

①Host Web

  • SharePoint Online上の通常のサイトコレクションのことです。

  • 業務アプリケーションでは、このサイトコレクション上にマスターやトランザクションデータの保存先となるリストやドキュメントライブラリを持ちますので、業務アプリケーションの利用者にとって、操作する主体と言うことができます。

  • SharePointアドイン(アプリ)は、管理ユーザーがこのHost Webに登録することで利用可能となります。

 

②App Web

  • 管理ユーザーが、SharePointアドイン(アプリ)をHost Webに登録すると、SharePoint Onlineは自動的に「App Web」というサイトコレクションに類するものを作成します。

  • SharePointアドインは、この「App Web」に対してフルコントロールの権限を持ちます。そのため、「App Web」内にリストやドキュメントライブラリを作成することができます。

  • 「SharePoint Hosted App」によりSharePointアドインを作成した場合、アドインのスタートページは、この「App Web」内に存在するページとなります。

  • 「SharePoint Hosted App」によりSharePointアドインを作成した場合、プログラムの操作対象は、この「App Web」内のリストやドキュメントライブラリとなります。

 

③Remote Web

  • 外部Webサーバー上に実装されたWebアプリケーションのことです。

  • 「Provider Hosted App」によりSharePointアドインを作成した場合、アドインのスタートページは、この「Remote Web」のWebアプリケーション内に存在するページとなります。

  • 「Provider Hosted App」によりSharePointアドインを作成した場合、プログラムの操作対象は、「Host Web」内のリストやドキュメントライブラリとすることも可能ですし、「App Web」内のリストやドキュメントライブラリとすることも可能です。

 

「②App Web」では、「App Web」内にリストやドキュメントライブラリを作成することができると書きましたが、これをどの様に行うかと言うと、「Elements.xml」にリストインスタンスとしてCAMLにより定義する方法と、プログラムにより作成する方法があります。

Visual Studio 2015にて、[追加]-[新しい項目]の「リスト」にてリストを追加した場合は、「Elements.xml」にCAMLにより定義する方法となります。

 

 

 

2.Host Webのイベントは捉まらない?

 

 上記の様に、Visual Studio 2015でSharePointアドインを作成した際に、「Elements.xml」に定義した内容は、全て「App Web」に対して適用されるものとなります。これは、「SharePoint Hosted App」だけではなく「Provider Hosted App」でも同様です。

 

したがって、

Remote Event Receiver の望ましい実装 No.1[オンライン]

にて、「Elements.xml」に追記されたリモートイベントレシーバーの呼び出しの定義

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

についても、「App Web」に対して適用され、「Host Web」に対しては一切関係のないものとなります。

つまり、リモートイベントレシーバーは「Host Web」のリスト/ドキュメントライブラリとは紐づいていません。

 

 これが、リモートイベントレシーバーを作成しても、「Host Web」上のアイテムの追加/更新/削除のイベントの発生が、Web Serviceのプログラムを呼び出さない原因です。

 

 

3.Host Webのイベントを捉まえる

 

 このように、単にリモートイベントレシーバーを作成しただけでは、「Host Web」上のアイテムの追加/更新/削除のイベントを捉えることはできません。

しかし、前記した様に、業務アプリケーションでは、この「Host Web」上のリストやドキュメントライブラリこそが操作の主体ですから、これらのイベントが捉えられなければ、リモートイベントレシーバーを実装する意味は余りありません。

 

実は、これには以下の解決策があります。

  1. 「Host Web」の「Elements.xml」にリモートイベントレシーバー呼び出しの定義を追加する。

  2. 「Host Web」のリスト/ドキュメントライブラリに対して、プログラムにより、直接リモートイベントレシーバーを紐づける。

「1.」については、

  • Visual Studioで、サンドボックスソリューションを作成する。

  • サンドボックスソリューションにイベントレシーバーを追加する。

  • イベントレシーバーの「Elements.xml」をリモートイベントレシーバーを呼び出す形に書き換える。

  • プロジェクトのプロパティで、「パッケージにアセンブリを含める」を「False」にする。

  • サンドボックスソリューションのwspファイルを作成する。

  • サイトコレクションのソリューションで、上記のwspファイルからソリューションを登録する。

  • サイトコレクションまたはサイトの機能で、上記のソリューションをアクティブ化する。

とすることで、実現可能です。

 

 この方法では、リモートイベントレシーバーの登録に、アプリの登録とフューチャーの登録の2つの操作を必要とすること、ソリューションも2つを管理しなければいけないことに留意する必要があります。

 

ここでは、小技の利く「2.」のプログラムによる方式を採用してみたいと思います。

 

 

4.プログラムによりリモートイベントレシーバーを紐づける

 

 「Host Web」のリスト/ドキュメントライブラリに対して、プログラムにより、直接リモートイベントレシーバーを紐づける方法を記載します。

 

①ソリューションを開きます。

Remote Event Receiver の望ましい実装 No.1[オンライン]

で作成したソリューションを、Visual Studio 2015で開きます。

 

SharePointアドインのプロジェクトをクリックした際に、SharePoint Onlineへのログインが要求された場合は、ログインしておきます。

 

 

②「AppManifest.xml」を開き、アクセス許可を指定します。

 

[スコープ]で「サイトコレクション」とし、[アクセス許可]を「FullControl」とします。

ここで指定する「アクセス許可」は、SharePointアドイン(アプリ)が「Host  Web」のアドインを登録したサイトコレクションに対して持つ、アクセス許可となります。

 

これに対し、「App Web」上のリスト/ドキュメントライブラリに対しては、特に設定しなくても、SharePointアドイン(アプリ)は、常に「FullControl」のアクセス許可を有します。

 

 

③「SharePoint アドインのイベント」を有効にします。

 

SharePointアドインのプロジェクトを選択し、「プロパティウィンドウ」にて、[SharePoint アドインのイベント]-[アドインのインストールの処理]を

「False」から「True」に変更します。

 

これにより、Visual Studio 2015が自動的に、「AppEventReceiver.svc」Web Serviceを、Webアプリケーションのプロジェクトに追加します。

 

この、「AppEventReceiver.svc」Web Serviceもリモートイベントレシーバーとなっています。

 

上記の設定により、SharePointアドイン(アプリ)がSharePoint Onlineのサイトコレクションに登録された際にイベントが発生し、「AppEventReceiver.svc」Web Serviceが呼び出されます。

 このリモートイベントレシーバーのURLは、最初にSharePointアドイン(アプリ)を作成した際に、「アプリのクライアントID」と共に設定した「Web サイトがホストされている場所」のURLが使用されます。

 つまり、「Provider Hosted App」において、外部Webサーバー「Remote Web」のWebアプリケーションのスタートページを表示するのと同様な方法により、URLを決定しています。そのため、特に配慮しなくても、このリモートイベントレシーバーの呼び出しは成功します。

 

 

④リモートイベントレシーバーを紐づけるコードを記載する。

この「AppEventReceiver.svc」に、「Host Web」のリスト/ドキュメントライブラリと、「Remote Web」のWeb Serviceのリモートイベントレシーバーを紐づけるコードを記載します。

 「②」において、「Host Web」のサイトコレクションに対して「FullControl」のアクセス許可を指定しているため、このコードの実行がブロックされることはありません。

 

(1)自動生成されたコードの、ProcessEventメソッド内にプログラムを記述します。

 

 

(2)クライアントコンテキストを取得した後、そのクライアントコンテキストにて、イベントを紐づけるリスト/ドキュメントライブラリを取得します。

 

このコードでは、直接リスト名を記載していますが、本来はweb.config等に設定した値を取得する方式にします。
 

 

(3)リモートイベントレシーバーのWeb ServiceのURLを取得します。

 

こちらも、直接URLを記載していますが、本来はweb.config等に設定した値を取得する方式にします。


 

(4)EventReceiverDefinitionCreationInformationクラスを生成し、リモートイベントレシーバーをプロパティにて設定します。

 

 

(5)最後に、リスト/ドキュメントライブラリのEventReceiversコレクションに追加することで、紐づけが完了します。

 

 

(6)全体としては、以下様なコードとなります。

 

 

以上の様にして、「Host Web」上のリスト/ドキュメントライブラリについて、アイテムの追加/変更/削除のイベントをリモートイベントレシーバーで処理することが可能となります。

 

Share on Facebook
Share on Twitter
Please reload

RECENT POST
Please reload