SharePoint アドイン製品一覧
SharePoint 2010 開発のステップ・バイ・ステップ
Windows Azure 入門
Windows Azure How-To 集
WCF / WF 入門
環境 :SharePoint Online (Office 365)Visual Studio 2010Windows Azure Tools for Visual Studio 2010 v1.5 (September 2011)SharePoint Designer 2010
こんにちは。
今日は、SharePoint Conference 2011 でも発表された SharePoint Online の外部リスト接続 (BCS の利用) について、具体的な使い方を見てみましょう。(すみません、まだ、前回までの連載が終わっていないのですが . . .)
今回の SharePoint Online のアップデートで、SharePoint の BCS (Business Connectivity Services) を使って、クラウド上の SQL Azure と、クラウド上にホストされた WCF サービス (または、Web Services) に接続可能です。(これまでは、SharePoint Online の BCS から、SharePoint Online のテナントの外に接続すること自体、不可能でした。)今回は、Windows Azure 上にホストされている WCF サービスに接続することで、実際の使い方を見ていきましょう。
補足 : 残念ながら、SharePoint 2010 の BCS から Restful サービスには接続できないため、WCF でエンドポイントを作成する際は、一般のプログラムから接続可能な REST 用のエンドポイントと、BCS 用の SOAP のエンドポイントを構成しておくと良いでしょう。
なお、ご存じの通り、BCS では、外部への接続設定をおこなうユーザー (管理者)、外部サービスを使ったリストを作成するユーザー (管理者)、作成されたリストを使用するユーザーなど、さまざまな役割を想定して機能が提供されています。このため、下記の通り、やや手続きが長くなりますが、ご辛抱ください。
WCF サービスの構築と配置 (準備)
まず、Windows Azure 上にホストする WCF サービス (Web Role) を作成します。
Visual Studio で、[Windows Azure Project] のプロジェクトを新規作成し、[WCF Service Web Role] を追加します。
作成された IService1.cs に、下記の通り、インターフェイスを実装してみましょう。
. . .[ServiceContract]public interface IService1{ [OperationContract] List<Product> GetAllProducts(); [OperationContract] Product GetProductById(int id);}[DataContract]public class Product{ [DataMember] public int Id { get; set; } [DataMember] public string Name { get; set; } [DataMember] public int Price { get; set; }}. . .
つぎに、Service1.svc.cs を開いて、以下の通り実装します。
. . .public class Service1 : IService1{ private List<Product> products = new List<Product>(); public Service1() { products.Add(new Product() { Id = 1, Name = "Prod1", Price = 100 }); products.Add(new Product() { Id = 2, Name = "Prod2", Price = 200 }); products.Add(new Product() { Id = 3, Name = "Prod3", Price = 300 }); } public List<Product> GetAllProducts() { return products; } public Product GetProductById(int id) { return (from p in products where p.Id == id select p).FirstOrDefault<Product>(); }}. . .
現実の開発では、認証方法については、充分な設計をおこなっておきましょう。今回は、サンプルとして、Basic 認証を使った簡単な WCF サービスを構築し、これを Office 365 の BCS から使用します。
補足 : BCS で接続する WCF サービスでは、この他に、Digest Authentication、Claim Base Authentication (CBA) なども使用できます。
クラウド (Windows Azure) 上で使用する Basic 認証なので、もちろん、Windows Identity は使用しません。クラウド上のカスタムな Identity Store として、今回は、以前のサンプルで紹介した ASP.NET の Membership Database を使用してみます。まず、「Custom Basic 認証による WCF REST サービスをクラウド (Windows Azure) に配置する」で紹介した手順で、以下を実施してください。(ここでは、手順詳細は省略します。)
今回は、http (Non-SSL) のカスタム Basic 認証のため、Web.config は下記 (太字) の通りになります。(下記の AAAAAAAAAA, testuser, XXXXXXXX, testapplication, BCSTestService.MyBasicAuthModule は、内容にあわせて、適宜変更しておいてください。)
<?xml version="1.0"?><configuration> <configSections> </configSections> <connectionStrings> <add name="SqlConn" connectionString="Data Source=AAAAAAAAAA.database.windows.net;Initial Catalog=aspnetdb;User Id=testuser@AAAAAAAAAA;Password=XXXXXXXX" providerName="System.Data.SqlClient"/> </connectionStrings> <system.diagnostics> . . . </system.diagnostics> <system.web> <compilation debug="true" targetFramework="4.0" /> <membership defaultProvider="SqlAzureMemProvider" userIsOnlineTimeWindow="15"> <providers> <clear /> <add name="SqlAzureMemProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="SqlConn" applicationName="testapplication" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" /> </providers> </membership> </system.web> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="MyBasicAuthModule" type="BCSTestService.MyBasicAuthModule" /> </modules> </system.webServer></configuration>
補足 : なお、以前 こちら に記載したように、WCF サービスのセキュリティ構成を使って Basic 認証を設定すると、IIS 上の Windows Identity を使用した Basic 認証が参照されるので、上述の通り、WCF 側では、このセキュリティ設定をおこなっていません。(このため、メタデータにも、セキュリティ設定はおこなわれません。)このため、クライアント プログラムなどから使用する際には、構成ファイル (.config) に、下記の通り、個別にセキュリティ設定を追加してください。(今回は、クライアントが BCS のため、不要です。)<security mode="TransportCredentialOnly"> <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" /></security>
以上で構築完了です。ビルドをおこなって、作成されたプロジェクトを Windows Azure のホステッド サービスに配置します。
Secure Store Service の設定 (SharePoint Online)
では、SharePoint Online 側を設定します。まず、WCF の接続で使用する認証情報などを アプリケーション ID として設定します。
補足 : なお、以降で説明する内容については、下記に注意点などが記載されていますので、詳細は下記を参考にしてください。SharePoint Online : Secure Store Service の管理http://office.microsoft.com/ja-jp/sharepoint-online-enterprise-help/HA102677932.aspxSharePoint Online : Business Connectivity Services アプリケーションの管理http://office.microsoft.com/ja-jp/sharepoint-online-enterprise-help/HA102677933.aspx
Office 365 管理ポータル (https://portal.microsoftonline.com/Default.aspx) にログインして、SharePoint Online の [管理] のリンクをクリックすると、下図の通り表示されます。ここで、[Secure Store Service の管理] をクリックします。
表示される画面で [新規作成] ボタンを押し、表示される画面 (下図) に、アプリケーション ID や、使用する資格情報を定義します。
つぎに、作成されたターゲット アプリケーション ID を選択して [資格情報の設定] を選択し、表示される画面 (下図) に、WCF に接続する際のユーザー ID とパスワードを設定します。
Business Data Connectivity Services メタデータ権限の設定 (SharePoint Online)
つぎに、BCS のメタデータへの権限設定をおこないます。(この設定をおこなったユーザーが、BCS の各メタデータを参照できます。)
今度は、上図の [Business Data Connectivity の管理] をクリックして、表示される画面で、[Metadata Store 権限の設定] をクリックします。表示される画面 (下図) で、ユーザーと、使用できる権限を適当に設定してください。
なお、今回は、上図の通り、[BDC Metadata Store 内のすべての BDC モデル、外部システム、および外部コンテンツタイプにアクセス許可を伝達する] をチェックしておきます。この設定により、BCS の外部コンテンツ タイプが作成されるたびに、毎回 権限設定をおこなう必要がなくなります。
外部コンテンツ タイプの作成 (SharePoint Online)
以上で準備完了です。
以降では、SharePoint Designer を使用して、外部コンテンツ タイプと外部リストを作成します。まずは、作成する外部リスト インスタンスのひな形となる外部コンテンツ タイプを作成します。
Office 365 の SharePoint Online のサイトを表示し、[サイトの操作] - [SharePoint Designer で編集] を選択します。
補足 : この際、上記で設定した権限のあるユーザー (テナント内のユーザー) でログインしてください。
SharePoint Designer が起動するので、左のナビゲーションから [外部コンテンツ タイプ] を選択し、リボンの [外部コンテンツ タイプ] をクリックして、新しい外部コンテンツ タイプを新規作成する画面 (下図) を表示します。
上図の画面で、[ここをクリックして、外部データソースの検出と操作の定義を行います] をクリックします。
表示される画面で [接続の追加] ボタンを押し、表示されるダイアログ ボックス (下図) で、[データ ソース タイプ] として [WCF サービス] を選択します。
つぎに、表示されるダイアログ ボックスで、下図の通り、WCF の接続情報 (WCF サービスのメタデータのアドレス、エンドポイントのアドレス、など) を入力します。この際、下図の通り、Secure Store アプリケーション ID として、上記で設定したアプリケーション ID を設定します。
以上で、WCF サービスのメタデータに接続がおこなわれ、SharePoint Designer には下図の通り表示されます。
つぎに、WCF サービスの各メソッドと、SharePoint Online 上での操作 (リスト一覧の取得、項目の取得、作成、削除など) を関連付けます。上図で GetAllProducts を右クリックして、下図の通り、[リストの読み取り操作の新規作成] を選択します。これにより、リストの項目一覧を取得する際に、この GetAllProducts メソッドが呼び出されます。
表示されるウィザードに従って、操作名などを 適宜 設定しますが、この際、識別子は必須となるので、下図の通り、Product の Id を識別子として設定しておきます。(また、今回、Name を [ピッカーに表示] に設定しました。)
同様に、上図の GetProductById を右クリックして、今度は、[項目の読み取り操作の新規作成] を選択します。上図同様、表示されるウィザードで、Product の Id の [識別子へのマップ] をチェックします。
SharePoint Designer の [ファイル] - [上書き保存] で、ここまでの設定を保存します。
外部リストの作成 (SharePoint Online)
つぎに、ブラウザーを使って SharePoint Online のサイトを表示し、[サイトの操作] - [その他のオプション] を選択して、リストなどのオブジェクトの新規作成画面を表示します。
表示される画面で、[外部リスト] を選択して [作成] ボタンを押します。(下図)
表示される画面で作成するリストの名前などを指定します。この際、[データソースの構成] 欄に、上記で作成したコンテンツ タイプを設定してください。(下図)
以上で、外部サービスに接続するリスト インスタンスが作成され、SharePoint 上に表示されます。
動作確認
作成されたリストを参照すると、3 つの Product 一覧が表示されます。また、項目を選択して [アイテムの表示] を選択すると、下図の通り、単一の項目の詳細が参照できます。(今回、作成、更新、削除のメソッドは定義していないため、下図で、[アイテムの編集] ボタンは押せないようになっています。)
さらなる応用
あとは、SharePoint 2010 の BCS と同様の応用ができます。
例えば、上記は読み取り操作しか使用していませんが、編集 (作成、更新、削除) 操作を作成したり、さらに、入力フォーム (InfoPath フォームなど) をカスタマイズして、クラウド上のデータの管理 UI として SharePoint Online を使用できます。また、通常の SharePoint 上のリストと同様、このリストの内容をルックアップ列として他のリストから使用したり、あるいは、外部データどうしの関連付け (Association) を設定してナビゲーションをおこなうこともできます。さらに、この設定をエクスポートして別環境にインポート (移行) するなどのポータブルな使用も可能です。また、今回、Windows Azure 上の WCF サービスに接続しましたが、同様の手順で SQL Azure のテーブルに (データベース ユーザーを使用して) 接続することもできます。
これまで、SharePoint Online では、SharePoint Online の中の閉じた世界で利用していた方も多いと思いますが、この機能により、外部で提供されているサービスなどを、エンドユーザーが組み合わせて使用できるようになります。
※ [2011/11/30 追記] Office 365 SharePoint Online の Novermber 2011 Update 全体の内容については、SharePoint チーム ブログ に掲載されましたのでご参照ください。
※ Office 365 に関するディスカッションや最新技術に関する FAQ などは、「Office 365 コミュニティ」をご参照ください。
Please see here using a browser comaptible with iframe . . .