サイト、Web アプリケーション、およびその他の主要オブジェクトへの参照を取得する

Windows SharePoint Services の展開を操作するには、Web サイト、サイト コレクション、Web アプリケーションなど、操作するオブジェクトへの参照を最初にコードで取得する必要があります。取得方法は 2 つあります。一方の方法は、コードをコンソールまたは Windows ベースのアプリケーションで使用する場合に適用されます。もう一方の方法は、Microsoft Visual Studio プロジェクトの種類として "Web サイト" を選択したときなど、ブラウザにホストされているアプリケーションでコードが使用される場合に適用されます。

注意

Windows SharePoint Services SDK のほとんどのサンプル コードでは 2 番目の方法を使用するため、コンソールまたは Windows ベースのアプリケーションに対して記述する場合はコードを変更する必要があります。コード変更のガイダンスについては、このトピックの「コンソール アプリケーションと Windows アプリケーション : オブジェクト コンストラクタの使用」を参照してください。

ブラウザにホストされているアプリケーション : サイトのコンテキストの確立

ブラウザにホストされているアプリケーションを使用して Windows SharePoint Services の展開を操作するには、まずコードで、サーバーへの要求に対するサイトのコンテキストまたはサイト コレクションのコンテキストを確立する必要があります。

コード内で要求の HTTP コンテキストを取得する必要があります。その際には、Microsoft.SharePoint.SPContext クラスとそのメンバを使用することをお勧めします。次に、いくつかの例を示します。

現在のサイトのコレクションを返すには、[SPContext.Current.Site] プロパティを使用できます。

注意

この記事のすべての例には、Microsoft.SharePoint 名前空間の using ディレクティブ (Visual Basic の Imports) が必要です。

Dim oSiteCollection As SPSite = SPContext.Current.Site
SPSite oSiteCollection = SPContext.Current.Site;

現在の要求の Web サイトを返すには、SPContext.Current.Web を使用できます。

Dim oWebSite As SPWeb = SPContext.Current.Web
SPWeb oWebSite = SPContext.Current.Web;

また、コードが .aspx ファイルに含まれている場合、または .aspx.cs file に含まれる分離コードである場合、SPControl オブジェクトのメソッドと共に Page.Context プロパティをパラメータとして使用できます。たとえば、GetContextWeb() メソッドを使用して、現在の Web サイトへの参照を取得します。

Dim oWebSite As SPWeb = SPControl.GetContextWeb(Context)
SPWeb oWebSite = SPControl.GetContextWeb(Context);

最後に, .aspx ページが [System.Web.UI.Page] ではなく LayoutsPageBase を継承している場合は、後者のクラスの Site() プロパティまたは Web() プロパティを使用して、現在のサイト コレクションまたは Web サイトへの参照をそれぞれ取得することができます。また、LayoutsPageBaseContext() プロパティを GetContextWeb() メソッドおよび GetContextSite() メソッドのパラメータとして使用することもできます。LayoutsPageBase では、SharePoint 指向の追加機能の一部を使用することができます。この機能は、主に、[System.Web.UI.Page] ではアクセスできないページにおけるユーザー権限の管理に関連しています。

たとえば、LayoutsPageBase を継承している .aspx ページで次のコードを実行すると、またはページの背後でコードを実行すると、現在の Web サイトへの参照が取得されます。

注意

この例では、Microsoft.SharePoint.WebControls 名前空間に using ディレクティブ (Visual Basic の Imports) が必要です。

Dim oWebSite As SPWeb = this.Web
SPWeb oWebSite = this.Web;

警告

上記のメソッドによって取得される SPSite オブジェクトまたは SPWeb オブジェクトを破棄しないでください。ページの完了後、Windows SharePoint Services 3.0 ランタイムによって、これらが破棄されます。これらのオブジェクトの Dispose メソッドまたは Close メソッドを呼び出すと、予期しない動作が生じることがあります。この動作は、コンストラクタを使用してこれらの種類のオブジェクトへの参照を取得する動作とまったく異なります。コンストラクタを使用する方法については、以下の「コンソール アプリケーションと Windows アプリケーション : オブジェクト コンストラクタの使用」で説明しています。 オブジェクトを破棄する必要があるときとそうでないときのベスト プラクティスには、いくつかの相違点があります。「ベスト プラクティス: 破棄可能な Windows SharePoint Services オブジェクトの使用」を注意深くお読みください。

現在の最上位サーバー ファーム オブジェクトを返すには、SPContext.Current.Site.WebApplication.Farm を使用します。

Dim oFarm As SPFarm = SPContext.Current.Site.WebApplication.Farm
SPFarm myFarm = SPContext.Current.Site.WebApplication.Farm;

現在のサイト コレクションの最上位 Web サイトを返すには、RootWeb プロパティを使用します。

Dim oTopSite As SPWeb = SPContext.Current.Site.RootWeb
SPWeb oTopSite = SPContext.Current.Site.RootWeb;

SPContext クラスは、特定の型の現在のオブジェクトの取得を制限しません。たとえば、SPSite.AllWebs プロパティを使用して、現在の Web サイト以外の Web サイトへの参照を取得できます。次の行は、AllWebs プロパティと共にインデクサを使用して、指定されたサイトのコンテキストを返します。

Dim oWebSite As SPWeb = 
    SPContext.Current.Site.AllWebs("myOtherSite")
SPWeb oWebSite = SPContext.Current.Site.AllWebs["myOtherSite"];

警告

AllWebs プロパティで取得されるオブジェクトへの参照を明示的に破棄する必要があります。 オブジェクトを破棄する必要があるときとそうでないときのベスト プラクティスには、いくつかの相違点があります。「ベスト プラクティス: 破棄可能な Windows SharePoint Services オブジェクトの使用」を注意深くお読みください。

最後に、サーバー ファームまたは現在の物理サーバーへの参照を取得するには、静的プロパティ SPFarm.Local および SPServer.Local を使用できます。次の行はその例です。

Dim oFarm As SPFarm = SPFarm.Local
SPFarm oFarm = SPFarm.Local;

どちらかの Local プロパティを使用するには、Microsoft.SharePoint.Administration 名前空間の using ディレクティブ (Visual Basic の Imports) を追加する必要があります。

前述の手法はすべて、Web アプリケーションや .aspx ページに限らず、カスタムの Web サービスや Web パーツでも使用できます。

重要

「Windows SharePoint Services 3.0 インフラストラクチャ更新プログラム (KB951695)」をインストールする場合、偽装が一時中断されている間に SharePoint オブジェクト モデルを呼び出すと、カスタム ソリューションが失敗することがあります。Windows 認証を使用していて、コード内で IIS ワーカー プロセスから SharePoint オブジェクト モデルを呼び出す場合、その要求は呼び出し元ユーザーの ID を偽装する必要があります。Windows SharePoint Services は呼び出し元ユーザーを自動的に偽装するように ASP.NET を構成しますが、(たとえば、Windows API の RevertToSelf 関数を呼び出すか、またはユーザー トークン パラメータの値として IntPtr.Zero を指定して System.Security.Principal.WindowsIdentity.Impersonate メソッドを呼び出すことにより) 偽装を一時中断した場合は、予想外の動作が起こったり、コードが失敗したりする可能性があります。コード内で明示的に RevertToSelf 関数を呼び出さなくても、たとえば仮想パス プロバイダを実装している場合などには、偽装が解除された後で ASP.NET によって RevertToSelf 関数が呼び出されることがあります。このようなケースでは、コードで呼び出し元ユーザーを偽装していない場合、適切に動作しない可能性があります。

コンソール アプリケーションと Windows アプリケーション : オブジェクト コンストラクタの使用

SPContext クラスは、コンソール アプリケーションまたは Windows ベースのアプリケーションで意味を持ちません。これらのいずれかの種類のアプリケーション用にコードを記述していて、特定のサイト コレクションを操作する場合は、次の例のように SPSite コンストラクタを使用して、そのサイト コレクションを表すオブジェクトをインスタンス化します。

注意

コンストラクタを使用して取得される SPSite オブジェクトまたは SPWeb オブジェクトをコードで破棄する必要があります。Windows SharePoint Services オブジェクトを破棄する必要があるときとそうでないときのベスト プラクティスには、いくつかの相違点があります。「ベスト プラクティス: 破棄可能な Windows SharePoint Services オブジェクトの使用」を注意深くお読みください。

Dim oSiteCollection As New SPSite("https://localhost")
...
oSitecollection.Dispose();
SPSite oSiteCollection = new SPSite("https://localhost");
...
oSitecollection.Dispose();

// Even better, take advantage of a "using" block to ensure
// that the object is disposed.
using (SPSite oSiteCollection = new SPSite("https://localhost"))
{
...
}

注意

"localhost" は、コードが実行されるコンピュータの Windows のエイリアスです。コンソール アプリケーションでは、実際のサーバー名ではなく "localhost" を常に使用することが Microsoft によって推奨されています。これは、コンソール アプリケーションはローカル コンピュータ上でのみ動作するためです。サーバー名を "MyServer" などにハード コードすると、コンソール アプリケーションを他のコンピュータに移植できなくなり、サーバー名が変更されるとコンソール アプリケーションが中断します。

コレクションへの参照が作成されたら、AllWebs コレクションを使用して、コレクション内の特定の Web サイトへの参照を取得できます。

Dim oWebSite As SPWeb
oWebSite = mySiteCollection.AllWebs("mySite")
...
oWebSite.Dispose();
SPWeb oWebSite = mySiteCollection.AllWebs["mySite"];
...
oWebSite.Dispose();

// Even better, take advantage of a "using" block to ensure
// that the object is disposed.
using (SPWeb oWebSite = mySiteCollection.AllWebs["mySite"])
{
...
}

また、次の行に示すように OpenWeb メソッドを使用できます。

Dim oWebSite As SPWeb
oWebSite = mySiteCollection.OpenWeb("mySite")
...
oWebSite.Dispose();
SPWeb oWebSite = mySiteCollection.OpenWeb("mySite");
...
oWebSite.Dispose();

// Even better, take advantage of a "using" block to ensure
// that the object is disposed.
using (SPWeb oWebSite = mySiteCollection.OpenWeb("mySite"))
{
...
}

See Also

参照

カスタム アプリケーションの作成場所を決定する

概念

Windows SharePoint Services に関するトピック集

Working with List Objects and Collections (英語)

その他のリソース

ベスト プラクティス: 破棄可能な Windows SharePoint Services オブジェクトの使用

サンプル オブジェクト モデルのタスク