SharePoint Online

SharePoint Online とのクラウドベースのグループ作業

Chris Mayo

コード サンプルのダウンロード

マイクロソフトは、Microsoft Online Services の次期バージョンとして Office 365 をリリースします。これは、SharePoint 2010、Exchange 2010、Lync Server 2010 を基盤とする、クラウドベースのグループ作業および通信のサービスです。Office 365 (現時点はベータ版) は、サブスクリプションベースの Software as a Service (SaaS) 提供物として、SharePoint、Exchange、Lync を使用可能にします。SaaS の提供物は、マイクロソフトが管理するクラウド データセンターでホストされます。

SharePoint Online は SharePoint 2010 のクラウドベースのバージョンです。SharePoint Online は、SharePoint 2010 と同等の機能を数多くユーザーに提供しますが、グループ作業ソリューションを拡張可能かつ安全にするために必要なハードウェアやソフトウェアを企業が管理する必要をなくしています。この記事では、SharePoint Online 開発と SharePoint 2010 開発の類似点と相違点の概要を SharePoint Online で運用するソリューションを構築しながら説明します。

次期リリースの SharePoint Online により、SharePoint の開発者は、これまで SharePoint 2010 の開発に使用してきたスキルやツール (Visual Studio 2010、SharePoint Designer 2010、C#、Visual Basic、SharePoint API、SharePoint SDK など) をそのまま活用して、グループ作業ソリューションを開発できます。社内に導入して使用する SharePoint とクラウド上で使用する SharePoint には類似点がたくさんありますが、ソリューションの構築方法に影響をもたらす大きな相違点もあります。

こうした相違点を把握しておくことで、SharePoint Online での実行を目的に作成可能なソリューションと、そのようなソリューションを開発する方法を理解できるようになります。

SharePoint Online でのカスタマイズにおける類似点

SharePoint 2010 の開発では、ブラウザーと SharePoint Designer 2010 を使用するか、Visual Studio 2010 を使用してソリューションを構築することで、SharePoint をカスタマイズできました。SharePoint Online の開発で、ブラウザーと SharePoint Designer 2010 を使用するカスタマイズは、次に説明する機能の違いさえ踏まえておけば、SharePoint 2010 とほぼ同じです。Visual Studio 2010 を使用する SharePoint Online ソリューションの開発も、ほぼ同じです。Visual Studio 2010 での開発は、SharePoint 2010 のローカル インスタンスに対して行います。このローカル インスタンスが、Windows 7 や Windows Server 2008 R2 でローカルに実行されているか、仮想マシンで実行されているかは問いません。反復的な開発には、統合デバッグ機能を利用します。開発が完了したら、SharePoint 2010 と同じソリューション ギャラリーを使用して、ソリューションを SharePoint Online にアップロードします。

SharePoint Online でのカスタマイズにおける主な相違点

SharePoint Online は SharePoint 2010 を基盤としていますが、SharePoint Online で実行するソリューションを開発する際に留意すべき重要な違いがいくつかあります。まず、SharePoint Online は、サイトを対象範囲とするソリューションと、Web を対象範囲とするソリューションのみをサポートします。SharePoint Online は、複数のテナントが共有データセンターのインフラストラクチャで実行される、マルチテナント クラウドで実行されるため、機能がファーム全体に対してアクティブ化される、ファームを対象範囲とするソリューションはサポートしません。同様に、SharePoint Online では、SharePoint テナントへの最高アクセス レベルがサイトコレクション レベルになるため、機能が Web アプリケーション内のすべての Web サイトで実行される、WebApplication を対象範囲とする機能もサポートしません。

次に、SharePoint Online では、部分的に信頼されるソリューションのみをサポートします。完全信頼のソリューションは、サイトコレクション レベルを超えてソリューションにアクセスできたり、ファーム上で管理者レベルの特権を使って実行する権限がソリューションに付与されたりするため、サポートしません。

最後に、SharePoint Online は SharePoint 2010 を基盤としますが、社内設置型の SharePoint とまったく同じ機能を備えているわけではありません。SharePoint 2010 と SharePoint Online を機能単位につ完全に比較するには、「Office 365 ベータ サービスの説明」(bit.ly/bBckol、英語) ダウンロード ページから、Microsoft SharePoint Online ベータ サービスを説明するドキュメントをダウンロードしてお読みください。

機能単位の一覧を見ると、SharePoint のカスタマイズ機能の大部分がサポートされていることがわかります。しかし、Business Connectivity Services (BCS)、外部リスト、SharePoint Online 外部の Web サービスを呼び出す機能 (部分信頼のソリューションではサポートされません) などがサポートされていないことは、SharePoint Online で実行するソリューションを構築するうえで非常に大きな影響をもたらします。ただし BCS は、今後のリリースでのサポートが予定されています。

こうした類似点と相違点を念頭に置き、サンドボックス ソリューションや SharePoint クライアント オブジェクト モデル (OM) など、SharePoint Online で実行するために構築できるソリューションの種類をいくつか見てみましょう。宣言型ワークフロー ソリューションによるビジネス プロセスの自動化など、その他の種類のソリューションについては今後の記事で取り上げる予定です。

サンドボックス ソリューションによる SharePoint Online 向けの開発

前述のように、SharePoint Online ソリューションは、サイトまたは Web の機能を対象範囲とし、サイト コレクションのデータに制限され、完全信頼ではなく部分信頼を必要とします。サンドボックス ソリューションとして実行されるソリューションを開発すれば、これらの条件をすべて満たしながらも、SharePoint Online 管理者がソリューション ギャラリーに直接アップロードすることでソリューションを簡単に配置できるようになります。

Visual Studio 2010 では、プロジェクト テンプレートおよびプロジェクト アイテム テンプレートのサポート、サンドボックス ソリューションとして新しいプロジェクトを作成するための SharePoint カスタマイズ ウィザード、サイト コレクションを対象範囲とする SharePoint API の IntelliSense のサポート、デバッグとパッケージ化のサポートなど、サンドボックス ソリューションに対して大きなサポートが提供されます。SharePoint Online 向けのソリューションの構築に着手するには、ソリューションを SharePoint 2010 に対してローカルに開発およびデバッグします。SharePoint 2010 と Visual Studio 2010 に加えて、64 ビットの Windows 7、または Windows Server 2008 R2 のいずれかがインストールされている必要があります。また、仮想化された SharePoint 2010 開発環境を提供する、2010 Information Worker Demonstration and Evaluation Virtual Machine (RTM) を使用して開発を始めることもできます。2010 Information Worker Demonstration and Evaluation Virtual Machine (RTM) は、bit.ly/ezfe2Y (英語) からダウンロードできます。また、サンドボックスと、サンドボックス化された視覚的 Web パーツ プロジェクト アイテム テンプレートをコンパイル時にサポートする、Visual Studio 2010 SharePoint Power Tools (bit.ly/azq882、英語) を使用することもお勧めします。

今回の記事の例では、架空の Contoso 社の従業員が、同社の調達システムではサポートされていない購入依頼を行えるようにするという、簡単なシナリオを使用してソリューションを構築します。まず、社内設置型の SharePoint 2010 開発環境にサイト コレクションとサイトを作成します。ここでは仮想マシンを使用するため、http://o365dpe.contoso.com/sites/spomsdnmag/purchasing を作成しています。最初のソリューションは、非標準の購入の追跡に使用するリストを配置します。Visual Studio 2010 を開き、[ファイル] をクリックして [新規作成] をポイントし、[プロジェクト] をクリックして、[新しいプロジェクト] ダイアログ ボックスで [空の SharePoint プロジェクト] を選択し、プロジェクト名を「PurchasingMgr」と入力します。

[SharePoint カスタマイズ ウィザード] ダイアログ ボックスの [デバッグに使用するローカル サイト] で、サイトの URL を「http://o365dpe.contoso.com/sites/spomsdnmag/Purchasing/」と入力して、[サンドボックス ソリューションとして配置する] を選択し、[完了] をクリックします (図 1 参照)。

image: Specify the Site and Trust Level for PurchasingMgr

図 1 PurchasingMgr へのサイトと信頼レベルの指定

次に、ソリューション エクスプローラーで [PurchasingMgr] プロジェクトを右クリックし、[追加] をポイントして [新しい項目] をクリックします。[新しい項目の追加] ダイアログ ボックスで、サンドボックス ソリューションでサポートされる SharePoint アイテム テンプレートを選択するため、[インストールされたテンプレート] 下で [SharePoint]、[2010] を順にクリックします。これらのテンプレートは、すべてがサンドボックス ソリューションでサポートされているわけではありません。したがって、SharePoint Online でサポートされないテンプレートもあります。図 2 に、サンドボックス ソリューションでサポートされているアイテム テンプレートを示します。

図 2 サンドボックス ソリューションでサポートされているアイテム テンプレート

アイテム テンプレート サンドボックス ソリューションでのサポート 備考
視覚的 Web パーツ × SharePoint サーバーに ASCX ファイルのインストールが必要
視覚的 Web パーツ (サンドボックス化) Visual Studio 2010 SharePoint Power Tools のインストールによって提供
Web パーツ  
シーケンシャル ワークフロー × ファーム ソリューションとしてのワークフロー ソリューションの配置が必要
ステート マシンのワークフロー × ファーム ソリューションとしてのワークフロー ソリューションの配置が必要
ビジネス データ接続モデル × 完全信頼ソリューションとしての BCS ソリューションの配置が必要。この機能は SharePoint Online ではサポートされない
アプリケーション ページ × SharePoint Server への ASPX ページの配置が必要
イベント レシーバー  
モジュール  
コンテンツ タイプ  
コンテンツ タイプからのリスト定義  
リスト定義  
リスト インスタンス  
空の要素  
ユーザー コントロール × SharePoint サーバーに ASCX ファイルのインストールが必要

リストを構築するには、[コンテンツ タイプ] アイテム テンプレートを選択し、名前に「NonStandBusPurchaseRequestsCT」と入力して、リストのサイト列とコンテンツ タイプを定義します。[追加] をクリックします。

[コンテンツ タイプ設定の選択] ダイアログ ボックスで、基本コンテンツ タイプとして [アイテム] を選択して [完了] をクリックします。コンテンツ タイプには、Title 列、Description 列、および Price 列があります。これらは、作成された Elements.xml のコンテンツを図 3 に示す XML に置き換え、宣言によって定義します。

図 3 Elements.xml での NonStandBusPurchaseRequestsCT 定義

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">

  <Field SourceID="https://schemas.microsoft.com/sharepoint/v3"
    ID="{A74E67E5-8905-4280-90C9-DEBFFC30D43D}"
    Name="RequestDescription"
    DisplayName="Description"
    Group="Purchasing Manager Custom Columns"
    Type="Note"
    DisplaceOnUpgrade="TRUE" />
  <Field SourceID="https://schemas.microsoft.com/sharepoint/v3"
    ID="{CB5054F5-0C60-4DBE-94D2-CEFBFB793C7F}"
    Name="Price"
    DisplayName="Price"
    Group="Purchasing Manager Custom Columns"
    Type="Currency"
    DisplaceOnUpgrade="TRUE" />

  <!-- Parent ContentType: Item (0x01) -->
  <ContentType ID="0x010078a81c8413f54917856495e56e7c09ed"
    Name="Purchasing Manager - Non-Standard Business Purchase Requests Content Type"
    Group="Purchasing Manager Content Types"
    Description=
      "Non-Standard Business Purchase Requests Content Type 
       for the Purchasing Manager Solution"
    Inherits="TRUE"
    Version="0">
    <FieldRefs>
      <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title"    
        DisplayName="Title" />
      <FieldRef ID="{A74E67E5-8905-4280-90C9-DEBFFC30D43D}" 
        Name="RequestDescription"  
        Required="TRUE" />
      <FieldRef ID="{CB5054F5-0C60-4DBE-94D2-CEFBFB793C7F}" Name="Price" 
        Required="TRUE" />
    </FieldRefs>
  </ContentType>
</Elements>

次に、そのコンテンツ タイプに基づくリストを定義するため、ソリューション エクスプローラーで [PurchasingMgr] を右クリックして [追加] をポイントし、[新しい項目] をクリックします。[コンテンツ タイプからのリスト定義] アイテム テンプレートを選択し、リスト定義名を「NonStandBusPurchaseRequestsListDefn」と入力して [追加] をクリックします。

リスト定義の設定の選択ウィザードで、先ほど作成したコンテンツ タイプを選択して、[このリスト定義のリスト インスタンスを追加する] チェック ボックスをオンにします。図 4 は、NonStandBusPurchaseRequestsListDefn 用に作成する Elements.xml です。

図 4 Elements.xml での NonStandBusPurchaseRequestsListDefn 定義

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <!-- Do not change the value of the Name attribute below. 
    If it does not match the folder name of the List Definition project item,
    an error will occur when the project is run. -->
    <ListTemplate
      Name="NonStandBusPurchaseRequestsListDefn"
      Type="10051"
      BaseType="0"
      OnQuickLaunch="TRUE"
      SecurityBits="11"
      Sequence="410"
      DisplayName="Purchasing Manager – 
        Non-Standard Business Purchase Requests List Definition"
      Description=
        "Non-Standard Business Purchase Requests List Definition 
         for the Purchasing Manager Solution"
      Image="/_layouts/images/itgen.png"/>
</Elements>

ここでの機能の各リスト定義は、(SharePoint によって定義されるリストとの競合を避けるため) 10,000 より大きい一意の Type 値によって識別する必要があることと、その定義に基づいてリスト インスタンスを定義するのに Type 値を使用することに注意してください。

リスト ビューにカスタム列を追加するには、作成された Schema.xml を開いて、図 5 のように、既定のビューに FieldRef 要素を追加します。

図 5 NonStandBusPurchaseRequestsListDefn という既定のビューへのカスタム列の追加

<View BaseViewID="1" Type="HTML" WebPartZoneID="Main"  
  DisplayName="$Resources:core,objectiv_schema_mwsidcamlidC24;" 
  DefaultView="TRUE" MobileView="TRUE" MobileDefaultView="TRUE" 
  SetupPath="pages\viewpage.aspx" ImageUrl="/_layouts/images/generic.png" 
  Url="AllItems.aspx">
  <Toolbar Type="Standard" />
  <XslLink Default="TRUE">main.xsl</XslLink>
  <RowLimit Paged="TRUE">30</RowLimit>
  <ViewFields>
    <FieldRef Name="Attachments">
    </FieldRef>
    <FieldRef Name="LinkTitle">
    </FieldRef>
    <FieldRef ID="{A74E67E5-8905-4280-90C9-DEBFFC30D43D}" 
      Name="RequestDescription" />
    <FieldRef ID="{CB5054F5-0C60-4DBE-94D2-CEFBFB793C7F}" Name="Price" />
  </ViewFields>
  <Query>
    <OrderBy>
      <FieldRef Name="ID">
      </FieldRef>
    </OrderBy>
  </Query>
  <ParameterBindings>
    <ParameterBinding Name="NoAnnouncements"   
      Location="Resource(wss,noXinviewofY_LIST)" />
    <ParameterBinding Name="NoAnnouncementsHowTo"   
      Location="Resource(wss,noXinviewofY_DEFAULT)" />
  </ParameterBindings>
</View>

最後に、[NonStandBusPurchaseRequestsListDefn] 下の [ListInstance1] を選択して名前を「NonStandBusPurchaseRequestsListInstance」に変更することで、リストのインスタンスを定義します。リストがコンテンツ タイプに基づくようにするため、そしてユーザーに役立つ説明を提供するため、Elements.xml を開いて次の XML を追加します。

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <ListInstance Title="Non-Standard Business Purchase Requests"
    OnQuickLaunch="TRUE"
    TemplateType="10051"
    Url="Lists/NonStandBusPurchaseRequestsListInstance"
    Description=
      "Non-Standard Business Purchase Requests List 
       for the Purchasing Manager Solution">
  </ListInstance>
</Elements>

Visual Studio 2010 でソリューションをテストするには、[デバッグ] の [デバッグ開始] をクリックします。ソリューションは、図 6 のように、社内設置型の SharePoint サイトにパッケージ化および配置されます。

image: Debugging the PurchasingMgr Solution

図 6 PurchasingMgr ソリューションのデバッグ

PurchasingMgr ソリューションのテストが完了したら、これを SharePoint Online に配置する準備が整います。チーム サイト テンプレートを使用して、Purchasing という新しい SharePoint Online のサイト コレクションを作成します。再び Visual Studio 2010 のソリューション エクスプローラーで [PurchasingMgr] プロジェクトを右クリックして、[パッケージ] をクリックします。SharePoint Online にソリューションを配置するには、ソリューションをソリューション ギャラリーにアップロードして、サイト機能をアクティブ化するだけです (これには、サイト コレクションの管理者権限が必要です)。これを行うには、SharePoint Online にログインして、自身のサイト コレクションに移動し、[サイトの操作]、[サイトの設定]、 [ソリューション] をクリックして、ソリューション ギャラリーにアクセスします。ソリューション ギャラリーで [ソリューション] タブをクリックして、リボンの [ソリューションのアップロード] をクリックし、bin\Debug 下の PurchasingMgr.wsp ファイルを参照して [OK] をクリックしたら [アクティブ化] をクリックします。図 7 のように、ソリューション ギャラリーに、自身のソリューションが表示されます。

image: PurchasingMgr Solution Deployed to SharePoint Online

図 7 SharePoint Online に配置される PurchasingMgr ソリューション

次に、サイト列、コンテンツ タイプ、およびリストを含む機能をアクティブにするため、Purchasing サイトに移動して、[サイトの操作]、[サイトの設定]、[サイト機能の管理] を順にクリックします。コンテンツ タイプおよびリストを含む機能である [Purchasing Manager] を選択し、[アクティブ化] をクリックします。この時点で、SharePoint Online サイトに Non-Standard Business Purchase Requests リストが表示されます。

Purchasing Manager は、サンドボックス ソリューションを使って SharePoint Online で実現できる一例にすぎません。サンドボックス ソリューションと SharePoint Online がサポートする機能における制限事項に留意すれば、SharePoint 2010 または SharePoint Online で実行するソリューションを作成できます。

Silverlight によるクライアント側ソリューションの作成

同様に SharePoint 2010 に搭載されているクライアント オブジェクト モデルは、オブジェクト指向のクライアント側 API を SharePoint クライアント向けに提供します。この SharePoint クライアントは、(Silverlight と ECMAScript 対応のブラウザーを含む) リモート コンピューターで実行される、Microsoft .NET Framework、Silverlight、および (JavaScript と JScript を含む) ECMAScript を使用して構築されます。この API は、Microsoft SharePoint のサーバー側の名前空間と一貫性があるため、簡単に学ぶことができます。また API は、サポートされるどの種類のクライアントでも一貫性があるため、別のクライアント ソリューションの知識に容易に応用できます。クライアント オブジェクト モデル API は、SharePoint Online でサポートされる、クラウド開発に有益なツールです。

たとえば、クライアント オブジェクト モデルを使用すると、Silverlight 4 アプリケーションを作成し、リストにアイテムを追加して、サンドボックス化された Web パーツでアプリケーションをホストすることができます。これには、Visual Studio 2010 を開いて、[ファイル] の [新規作成] をポイントし、[プロジェクト] をクリックして、[新しいプロジェクト] ダイアログ ボックスで [空の SharePoint プロジェクト] をクリックします。プロジェクトの名前を「PurchasingMgrWP」と入力して [OK] をクリックします。ここでも、ソリューションをサンドボックス ソリューションとして作成して、社内設置型の Purchasing サイトでそのソリューションを指します。Silverlight 4 アプリケーションを作成するには、PurchasingMgrWP ソリューションを右クリックして、[インストールされたテンプレート] 下で [Silverlight] をクリックし、[Silverlight アプリケーション] をクリックして、ソリューション名を「NonStandBusPur-chaseReqsSLOM」と入力します。[新しい Silverlight アプリケーション] ダイアログ ボックスで、[Silverlight アプリケーションを新しい Web サイトでホストする] チェック ボックスをオフにして (アプリケーションを SharePoint でホストすることでテストするためです)、[Silverlight バージョン] を [Silverlight 4] に設定します。

Silverlight クライアント オブジェクト モデル API を参照するには、C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin にある、Microsoft.SharePoint.Client.Silverlight.dll および Microsoft.SharePoint.Client.Silverlight.Runtime.dll への参照を追加します。次に、MainPage.xaml を開いて、XAML を図 8 のコードに 置き換え、Silverlight の UI を作成します。

図 8 NonStandBusPurchaseReqsSLOM の MainPage.xaml

<UserControl xmlns:sdk="https://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
  x:Class="NonStandBusPurchaseReqsSLOM.MainPage"
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d"
  d:DesignHeight="300" d:DesignWidth="400">

  <Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
      </Grid.RowDefinitions>
        
      <sdk:Label Content="Title:" Grid.Column="0" Grid.Row="0" Margin="3"/>
      <sdk:Label Content="Description:" Grid.Column="0" Grid.Row="1" Margin="3"/>
      <sdk:Label Content="Price:" Grid.Column="0" Grid.Row="2" Margin="3"/>
        
      <TextBox Name="Title" Grid.Column="1" Grid.Row="0" Margin="3"/>
      <TextBox Name="Description" Grid.Column="1" Grid.Row="1" Margin="3"/>
      <TextBox Name="Price" Grid.Column="1" Grid.Row="2" Margin="3"/>
        
      <Button Content="Add" Grid.Column="1" Grid.Row="3" Margin="3"     
        Name="addNonStanPurchaseReq" HorizontalAlignment="Right" 
        Height="25" Width="100" Click="addNonStanPurchaseReq_Click" />
  </Grid>
</UserControl>

図 8 の XAML は、リストに追加する情報を集めるための、テキスト ボックスとボタンを定義します (図 9 参照)。

image: MainPage.xaml in Designer

図 9 デザイナーでの MainPage.xaml

デザイナーでボタンをダブルクリックしてクラスを開き、図 10 のコードに置き換えます。

図 10 addNonStanPurchaseReq_Click

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using Microsoft.SharePoint.Client;

namespace NonStandBusPurchaseReqsSLOM
{
  public partial class MainPage : UserControl
  {
    private string webUrl;

    public MainPage(string url)
    {
      webUrl = url;

      InitializeComponent();
    }

    private void addNonStanPurchaseReq_Click(object sender, RoutedEventArgs e)
    {   
      ClientContext clientContext = new ClientContext(webUrl);

      Web webSite = clientContext.Web;
      ListCollection webLists = webSite.Lists;

      List nonStandBusPurList = 
        clientContext.Web.Lists.GetByTitle(
        "Non-Standard Business Purchase Requests");

      ListItem newListItem = 
        nonStandBusPurList.AddItem(new ListItemCreationInformation());
        newListItem["Title"] = Title.Text;
        newListItem["RequestDescription"] = Description.Text;
        newListItem["Price"] = Price.Text;
                        
        newListItem.Update();

        clientContext.Load(nonStandBusPurList, list => list.Title);

        clientContext.ExecuteQueryAsync(onQuerySucceeded, onQueryFailed);
    }

    private void onQuerySucceeded(
      object sender, ClientRequestSucceededEventArgs args)
    {
      Dispatcher.BeginInvoke(() =>
      {
        MessageBox.Show("New item added.");
      });
    }


    private void onQueryFailed(object sender, 
      ClientRequestFailedEventArgs args)
    {
      Dispatcher.BeginInvoke(() =>
      {
        MessageBox.Show("Request failed. " + args.Message + "\n" + 
          args.StackTrace);
      });
    }
  }
}

図 10 のコードは、クライアント オブジェクト モデル コードでの共通のパターンに従います。まず、(SPContext クラスと同等の) ClientContext クラスを通じてクライアント コンテキストにアクセスします。次に、Web クラス、ListCollection クラス、および List クラスそれぞれを通じて、サイトとリストにアクセスします。SPWeb クラス、SPListCollection クラス、および SPList クラスとの類似性に注目してください。最後に、List.AddItem メソッドを呼び出して ListItem を作成し、UI データを設定して、ListItem.Update メソッドを呼び出します。ListItem は、実際には、クエリを実行するために ClientContext.Load メソッドおよび ClientContext.ExecuteQueryAsync メソッドが呼び出されるまで作成されません。ClientContext.Load を通じて複数のクエリを読み込み、ClientContext.ExecuteQueryAsync メソッドを呼び出すことで、サーバーへのラウンドトリップを節約することができます。

Silverlight 4 アプリケーションを配置するには、モジュールを追加して今回の Web パーツ プロジェクトを備えたアプリケーションを配置します。ソリューション エクスプローラーで [PurchasingMgrWP] を右クリックして、[追加] をポイントして [新しい項目] をクリックしたら、[モジュール] をクリックして、モジュール名を「ClientBin」と入力します。作成される Elements.xml のコンテンツを次の XML に置き換えます。

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <Module Name="ClientBin">
    <File Path="ClientBin\NonStandBusPurchaseReqsSLOM.xap"  
      Url="ClientBin/NonStandBusPurchaseReqsSLOM.xap" />
  </Module>
</Elements>

この XML は、今回の SharePoint サイトの ClientBin フォルダーに NonStandBusPurchaseReqsSLOM.xap ファイルを配置します。

ClientBin モジュールを含む NonStandBusPurchaseReqsSLOM プロジェクトの出力を配置するには、ソリューション エクスプローラーで [ClientBin] モジュールを選択して、プロパティを表示し、[プロジェクト出力参照] プロパティをクリックして [プロジェクト出力参照] ダイアログ ボックスを開きます。[追加] をクリックし、[プロジェクト名] で [NonStandBusPurchaseReqsSLOM] を選択して、[展開の種類] を [ElementFile] にします。

次に、Silverlight 4 アプリケーションをホストする SharePoint ソリューションにカスタム Web パーツを追加します。ソリューション エクスプローラーで [PurchasingMgrWP] を右クリックして [追加] をポイントし、[新しい項目] をクリックして [Web パーツ] をクリックしたら、Web パーツの名前を「NonStandBusPur-chaseReqsWP」と入力します。Silverlight 4 アプリケーションに、ClientContext を作成するために使用するサイトの URL などのパラメーターを渡すために、カスタム Web パーツを使用します。このために、SilverlightObjectTagControl.cs というヘルパー クラスを追加して、そのクラスの本体を図 11 のコードに置き換えます。

図 11 SilverlightObjectTagControl.cs ヘルパー クラスの追加

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace PurchasingMgrWP
{
  class SilverlightObjectTagControl : WebControl
  {
    public string Source { get; set; }
    public string InitParameters { get; set; }

    protected override void CreateChildControls()
    {
      base.CreateChildControls();

      if (Source != null && Source != "")
      {
        string width = (this.Width == Unit.Empty) ? "400" : 
          this.Width.ToString();
        string height = (this.Height == Unit.Empty) ? "300" : 
          this.Height.ToString();

        this.Controls.Add(new LiteralControl(
          "  <div>" +
          "  <object data=\"data:application/x-silverlight-2,\" +
          "  type=\"application/x-silverlight-2\" width=\"" + width +         
          "  "\" height=\"" + height + "\">" +
          "  <param name=\"source\" value=\"" + Source + "\"/>" +
          "  <param name=\"onerror\" value=\"onSilverlightError\" />" +
          "  <param name=\"background\" value=\"white\" />" +
          "  <param name=\"minRuntimeVersion\" value=\"4.0.50826.0\" />" +
          "  <param name=\"autoUpgrade\" value=\"true\" />" +
          "  <param name=\"initparams\" value=\"" + InitParameters + "\" />" +
          "  <a href=\"https://go.microsoft.com/fwlink/?LinkID=" +
          "  149156&v=4.0.50826.0\" +
          "  style=\"text-decoration: none;\">" +
          "  <img src=\"https://go.microsoft.com/fwlink/?LinkId=161376\" +
          "  alt=\"Get Microsoft Silverlight\" style=\"border-style: none\"/>" +
          "  </a>" +
          "  </object>" +
          "  <iframe id=\"_sl_historyFrame\" +
          "  style=.visibility:hidden;height:0;width:0;border:0px.></iframe>" +
          "  </div>"
          ));

      }
    }
  }
}

図 11 の SilverlightObjectTagControl クラスには、2 つのプロパティがあります。Source は、Web パーツで読み込む Silverlight アプリケーションの URL を渡すのに使用し、InitParameters は、Silverlight 4 アプリケーションに初期化パラメーターを渡すのに使用します。これらのプロパティは、CreateChildControls メソッド内の Silverlight アプリケーションに <object /> タグを構築するのに使用されます。SilverlightObjectTagControl クラスを使用するには、NonStandBusPurchaseReqsWP.cs を開いて、このクラスのコードを図 12 のコードに置き換えます。

図 12 NonStandBusPurchaseReqsWP.cs

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;

namespace PurchasingMgrWP.NonStandBusPurchaseReqsWP
{
  [ToolboxItemAttribute(false)]
  public class NonStandBusPurchaseReqsWP : WebPart
  {
    protected override void CreateChildControls()
    {
      base.CreateChildControls();

      SilverlightObjectTagControl slhc = 
        new SilverlightObjectTagControl();
      slhc.Source = SPContext.Current.Site.Url + 
        "/ClientBin/NonStandBusPurchaseReqsSLOM.xap";
      slhc.InitParameters = "url=" + SPContext.Current.Web.Url;

        this.Controls.Add(slhc);
    }
  }
}

図 12 のコードは、SilverlightObjectTagControl のインスタンスを作成して、Source プロパティを ClientBin の Silverlight アプリケーションの URL に設定し、(Non-Standard Business Purchase Requests リストがある) 現在のサイトのURL を保持するために InitParameters プロパティを設定します。NonStand-BusPurchaseReqsSLOM の MainPage クラスのコンストラクターに URL を渡すには、App.xaml.cs を開いて、Application_Startup イベントに次のコードを追加します。

private void Application_Startup(object sender, 
    StartupEventArgs e)
  {
    string url = e.InitParams["url"];

    this.RootVisual = new MainPage(url);
  }

Web パーツをテストするには、Non-Standard Business Purchase 
Requests リストを配置するために (このリストは、先ほどのデバッグ セッションが終了したとき削除されました)、社内設置型 SharePoint の Purchasing サイトに PurchasingMgr.wsp パッケージを配置して、Visual Studio 2010 から PurchasingMgrWP ソリューションをデバッグします。Web パーツを \Purchasing\Home.aspx に追加すると、Silverlight からリストに直接アイテムを追加できるようになります (図 13 および図 14 参照)。

image: The NonStandBusPurchaseReqsWP in Action

図 13 動作中の NonStandBusPurchaseReqsWP

image: The Updated Non-Standard Business Purchase Requests List

図 14 更新した Non-Standard Business Purchase Requests リスト

社内設置型の SharePoint サイトに対して開発およびデバッグすることで、ソリューションのテストが完全に完了するまで、SharePoint と Silverlight 4 コードの両方のデバッグに Visual Studio 2010 を使用できます。テストが完了したら、SharePoint Online のソリューション ギャラリーに PurchasingMgrWP.wsp をアップロードします。

SharePoint クライアント オブジェクト モデルは、SharePoint Online のリストとライブラリにアクセスするために、使い慣れた、一貫性のあるオブジェクト指向の API を提供します。この API は、Microsoft.SharePoint API のサブセットで、サイト コレクション以下の対象範囲に使用でき、SharePoint Online での開発に完全に適合します。

クラウドでの SharePoint のソリューション

まとめると、SharePoint 開発者は、SharePoint Online を使用する場合でも、これまでのスキルとツールを使ってクラウド用に SharePoint ソリューションを構築することができます。SharePoint Online のカスタマイズ機能 (サポートする機能とサポートしない機能など)、サンドボックス ソリューション、SharePoint クライアント オブジェクト モデル、および SharePoint Designer 2010 を使用した宣言型のワークフロー構築を理解すれば、SharePoint Online を使ってクラウド上で実行される SharePoint ソリューションを構築できます。ベータ プロセス全体にわたって、SharePoint Online 開発の最新情報を入手するには、SharePoint Online 開発者向けリソース センター (msdn.microsoft.com/ja-JP/sharepoint/gg153540.aspx) を参照してください。

Chris Mayo は、Office 365 および SharePoint Online に特化したテクノロジ スペシャリストです。ライターとしての経験も、小さなグループから何千人もの聴衆に技術コンテンツを解説する講演者としての経験もあります。そして、『Programming for Unified Communications with Microsoft Office Communications Server 2007 R2』(Microsoft Press、2009 年) の共著者でもあります。マイクロソフトに 10 年勤務しており、マイクロソフトに勤める前は、小売業界や金融業界の一流企業の IT 部門で、開発者およびアーキテクトとして働いていました。最新情報については、彼のブログ (blogs.msdn.com/cmayo、英語) を参照してください。

この記事のレビューに協力してくれた技術スタッフの George DurziSteve FoxAJ May、および Christina Storm に心より感謝いたします。