BCS 外部システムとして使用する OData データ サービスを作成する
基礎となるデータが変更されたときに OData を使用して SharePointに通知を送る、インターネット アドレスの指定が可能な WCF サービスの作成方法について学習します。 これらの通知は外部リストに関連付けられているイベントをトリガーするために使用されます。
この記事では、ASP.NET Windows Communication Foundation (WCF) データ サービスを作成して AdventureWorks 2012 LT サンプル データベースを公開する方法について説明します。 これにより、Open Data protocol (OData) からデータにアクセスすることができます。 OData を介したアクセスが確立したら、SharePoint で外部データベースからのデータを使用できるようにする Business Connectivity Services (BCS) 外部コンテンツ タイプを構成できます。 この OData ソースをさらに拡張するため、WCF サービスにサービス契約を追加して BCS を有効にし、外部データが変更されたことを示す通知にサブスクライブできます。
OData サービス作成の前提条件
以下に、この記事での OData サービスの作成に必要なものを示します。
インターネット インフォメーション サービス (IIS) をホストしているサーバー
.NET Framework 3.5 以降
SharePoint
Visual Studio 2012
Office Developer Tools for Visual Studio 2012
開発環境のセットアップについては、「 SharePoint の一般的な開発環境を設定する」を参照してください。
OData サービス作成の中心概念
表 1 に、OData および外部コンテンツを使用する WCF サービスの作成の中心概念を理解するのに役立つ記事を示します。
表 1. OData サービス作成の中心概念
Resource | 説明 |
---|---|
SharePoint の Business Connectivity Services で OData ソースを使用する |
OData ソースに基づく外部コンテンツ タイプの作成を開始するための情報と、そのデータを SharePointまたは Office 2013 コンポーネントで使用するための情報が提供されています。 |
[方法] SharePoint で OData ソースから外部コンテンツ タイプを作成する |
Visual Studio 2012 を使用して公開済みの OData ソースを見つけ出し、SharePointの BCS で使用する、再使用可能な外部コンテンツ タイプを作成する方法を確認します。 |
Open Data Protocol |
プロトコル定義、アーキテクチャ情報、使用例など、Open Data Protocol に関する情報が提供されています。 |
WCF Data Services の概要 |
WCF Data Services は、OData を使用した Web またはイントラネット向けデータ サービスの作成および使用を実現するサービスです。 OData を使用すると、データを URI でアドレス指定可能なリソースとして公開することができます。 |
WCF Data Services の開発と配置 |
WCF Data Services の開発と配置に関する情報が提供されています。 |
外部システムを作成するときに必要な手順
次の手順を完了する必要があります。
AdventureWorks 2012 LT サンプル データベースをインストールする
OData サービスを作成する
アクセス許可を設定する
サービスをテストする
追加の BCS 機能に関する機能を追加する
サンプル データベースをインストールする
通常、外部システムはデータベースなので、この例では、専用データソースを示す AdventureWorks 2012 LT サンプル データベースの使用方法について説明します。
手順の内容
WCF OData サービスの作成方法
OData プロトコル経由でアクセス可能な Windows Communication Foundation (WCF) サービスは簡単に作成できます。 Visual Studio 2012 には、さまざまなデータ ソースからデータを自動的に見つけ出し、モデリングするためのツールがいくつか備わっています。 これを使用して SQL Server データベースおよびその他の種類のデータ ストアのデータへの接続とインターフェイスを作成すると、拡張オブジェクト モデルを使用してプログラムで操作できるようになります。
ただし、SharePointで、土台となるデータが変更された場合に BCS がリモート システムから通知を受信できるようにするには、それらの変更を受信するよう WCF サービスを変更する必要があります。
新しい WCF プロジェクトを作成するには
Visual Studio の [ ファイル] メニューで、[ 新規作成]、[ プロジェクト] を順に選択します。
[ 新しいプロジェクト] ダイアログ ボックスで、[ Web] テンプレートを選択し、[ ASP.NET Web アプリケーション] を選択します。
プロジェクト名に「 AdventureWorksService」と入力し、[ OK] をクリックします。
ソリューション エクスプローラーで、作成した ASP.NET プロジェクトのショートカット メニューを開き、[ プロパティ] を選択します。
[ Web] タブを選択し、[ Specific port] (特定のポート) テキスト ボックスを「8008」 に設定します。
データ モデルを定義するには
ソリューション エクスプローラーで、ASP.NET プロジェクトのショートカット メニューを開き、[ 新しい項目の追加] を選択します。
[ 新しい項目の追加] ダイアログ ボックスで、[データ] テンプレートを選択し、[ ADO.NET Entity Data Model] を選択します。
データ モデルの名前に、「 AdventureWorks.edmx」と入力します。
Entity Data Model ウィザードで、[ データベースから生成] を選択し、[ 次へ] を選択します。
次のいずれかの手順を実行してデータ モデルをデータベースに接続し、[ 次へ] をクリックします。
構成済みのデータベース接続がない場合は、[ 新しい接続] を選択し、新しい接続を作成します。
Northwind データベースに接続するよう構成されているデータベース接続が存在する場合は、一覧からその接続を選択します。
ウィザードの最終ページで、データベース内のすべてのテーブルのチェック ボックスを選択し、ビューおよびストアド プロシージャのチェック ボックスをオフにします。
- [ 完了] を選択してウィザードを終了します。
データ サービスを作成するには
ソリューション エクスプローラーで、ASP.NET プロジェクトのショートカット メニューを開き、[ 新しい項目の追加] を選択します。
[ 新しい項目の追加] ダイアログ ボックスで [ WCF データ サービス] を選択します。
サービスの名前に「 AdventureWorks」と入力します。
Visual Studio では新しいサービスの XML マークアップおよびコード ファイルが作成されます。 既定ではコード エディターのウィンドウが開きます。 ソリューション エクスプローラーでは、サービスの名前に「 AdventureWorks」という名前が付き、拡張子 .svc.cs または .svc.vb が付与されます。
データ サービスを定義する クラスの定義のコメント
/* TODO: put your data source class name here */
を、データ モデルのエンティティ コンテナーである型に置き換えます。この場合は AdventureWorksEntities です。 クラス定義は次のようになります。
public class AdventureWorks : DataService<AdventureWorksEntities>
既定では、WCF サービスが作成されるとセキュリティ構成のためアクセスできません。 次のステップで、アクセス可能なユーザーと、そのユーザーに付与する権限を指定します。
データ サービス リソースにアクセスできるようにするには
- データ サービスのコードで、 InitializeService 関数のプレースホルダーのコードを次の内容に置き換えます。
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
これにより、承認されたクライアントに、指定されたエンティティ セットのリソースに対する読み取りと書き込みのアクセス権が付与されます。
注:
ASP.NET アプリケーションにアクセスできるクライアントは、データ サービスによって公開されるリソースにもアクセスできます。 本番環境のデータ サービスでは、許可されていないリソースへのアクセスを防ぐため、アプリケーション自体をセキュリティで保護する必要があります。 詳細については、「WCF Data Servicesのセキュリティ保護」を参照してください。
BCS が通知を受信するには、通知購読で追加および削除される要求を受け取る、バックエンドのデータ ソースのメカニズムが必要です。
サービス作成の最後のステップは、BDC モデルに定義されている Subscribe および Unsubscribe ステレオタイプに対するサービス操作の追加です。
Subscribe および Unsubscribe ステレオタイプのサービス操作を追加するには
- AdventureWorks.cs ページで、次の文字列変数宣言を追加します。
public string subscriptionStorePath = @"\\\\[SHARE_NAME]\\SubscriptionStore\\SubscriptionStore.xml";
注:
このファイルは新しい購読によって更新される XML ファイルです。 このファイルへのアクセスはサーバー プロセスで行われるので、このファイルへのアクセスに必要な権限が付与されていることを確認してください。 > また、サブスクリプション情報を格納するためのデータベース ソリューションを作成することもできます。
次に、次の 2 つの WebGet メソッドを追加して、購読を操作できるようにします。
[WebGet]
public string Subscribe(string deliveryUrl, string eventType)
{
string subscriptionId = Guid.NewGuid().ToString();
XmlDocument subscriptionStore = new XmlDocument();
subscriptionStore.Load(subscriptionStorePath);
// Add a new subscription element.
XmlNode newSubNode = subscriptionStore.CreateElement("Subscription");
// Add subscription ID element to the subscription element.
XmlNode subscriptionIdStart = subscriptionStore.CreateElement("SubscriptionID");
subscriptionIdStart.InnerText = subscriptionId;
newSubNode.AppendChild(subscriptionIdStart);
// Add delivery URL element to the subscription element.
XmlNode deliveryAddressStart = subscriptionStore.CreateElement("DeliveryAddress");
deliveryAddressStart.InnerText = deliveryUrl;
newSubNode.AppendChild(deliveryAddressStart);
// Add event type element to the subscription element.
XmlNode eventTypeStart = subscriptionStore.CreateElement("EventType");
eventTypeStart.InnerText = eventType;
newSubNode.AppendChild(eventTypeStart);
// Add the subscription element to the root element.
subscriptionStore.AppendChild(newSubNode);
subscriptionStore.Save(subscriptionStorePath);
return subscriptionId;
}
[WebGet]
public void Unsubscribe(string subscriptionId)
{
XmlDocument subscriptionStore = new XmlDocument();
subscriptionStore.Load(subscriptionStorePath);
XmlNodeList subscriptions = subscriptionStore.DocumentElement.ChildNodes;
foreach (XmlNode subscription in subscriptions)
{
XmlNodeList subscriptionList = subscription.ChildNodes;
if (subscriptionList.Item(0).InnerText == subscriptionId)
{
subscriptionStore.DocumentElement.RemoveChild(subscription);
break;
}
}
subscriptionStore.Save(subscriptionStorePath);
}
次の手順
変更が加えられたことを SharePoint に通知するには、このほか、データ ソースに変更を照会するサービスを作成し、通知のすべての購読者に通知を送信する必要があります。