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

最終更新日: 2010年4月8日

適用対象: SharePoint Foundation 2010

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

注意

Microsoft SharePoint 2010 Software Development Kit (SDK) のほとんどのサンプル コードが、ブラウザーでホストされるアプリケーション用に記述されているので、コンソールまたは Windows ベースのアプリケーションに対して記述する場合は、コードを変更する必要があります。これを行うためのガイダンスについては、このトピックの「コンソール アプリケーションと Windows アプリケーション: オブジェクト コンストラクターの使用」を参照してください。

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

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

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

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

注意

この記事のすべての例で、Microsoft.SharePoint 名前空間の using ディレクティブ (Microsoft 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(HttpContext) メソッドを使用して、現在の Web サイトへの参照を取得します。

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

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

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

注意

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

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

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

現在の最上位サーバー ファーム オブジェクトを返すには、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 プロパティと共にインデクサーを使用して、指定したサイトのコンテキストを返します。

注意注意

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

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

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

最後に、サーバー ファームまたは現在の物理サーバーへの参照を取得するには、静的プロパティ 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 アプリケーション : オブジェクト コンストラクタの使用

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

注意

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

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" を常に使用することがマイクロソフトによって推奨されています。この理由は、コンソール アプリケーションはローカル コンピューター上でのみ動作するからです。サーバー名を "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"))
{
...
}

SPSite または SPWeb への参照がコードに既に含まれる場合は、それを使用して、その親オブジェクトへの参照を取得できます。この方法を次の行に示します。ここでは、mySiteCollection が SPSite オブジェクトで、oWebSite が SPWeb オブジェクトです。

Dim parentSiteCollection As SPSite = oWebSite.Site;
Dim content As SPContentDatabase = mySiteCollection.CurrentDatabase;
Dim webApplication As SPWebApplication = mySiteCollection.WebApplication;
Dim farm As SPFarm = mySiteCollection.WebApplication.Farm;
SPSite parentSiteCollection = oWebSite.Site;
SPContentDatabase content = mySiteCollection.CurrentDatabase;
SPWebApplication webApplication = mySiteCollection.WebApplication;
SPFarm farm = mySiteCollection.WebApplication.Farm;

ただし、親オブジェクトへの参照を取得するためだけに、SPSite オブジェクトまたは SPWeb オブジェクトを作成することは避けてください。これらのオブジェクトは大量のメモリを消費します。代わりに、Web アプリケーションへの参照を取得するために、静的な Lookup(Uri) メソッドを取得し、Web アプリケーションの URI で作成された SystemUri オブジェクトに渡します。その後、Web アプリケーション オブジェクトの Farm プロパティを使用すると、ファームへの参照を取得できます (リモート ファームへの参照を取得するには、静的な Open(String) メソッドを使用します)。Web アプリケーション オブジェクトの ContentDatabases プロパティには、Web アプリケーションのコンテンツ データベース コレクションが含まれています。コレクション内の対象のコンテンツ データベースのインデックスがわかっている場合は、このプロパティを使用してコンテンツ データベースへの参照を取得できます。詳細については、SPContentDatabaseCollection クラスに関する参照トピックを参照してください。次の行は、この点をいくつか示しています。

SPWebApplication webApplication = Lookup(new Uri("https://localhost/");
SPFarm farm = webApplication.Farm;
SPContentDatabase content = webApplication.ContentDatabases[0];

関連項目

参照

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

概念

オブジェクトの破棄

SharePoint 開発タスク - トピック集

その他の技術情報

基本的なオブジェクト モデルのタスク