特定のWSSデータベースからコンテンツを取得して読み取るCMPエクスポートを作成する特定のSharePointAPIにアクセスできるWebサービスの作成に取り組んでいます。プログラムがSharePointサーバー上でファーム管理者アカウントの下で実行されている限り、通常のWindowsフォームアプリケーションを使用してC#でプログラムでこれを行うことができました。ただし、ASP.NET Webサービスからまったく同じコードを実行しようとすると、問題が発生します。Webサービスで発生するエラーは、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」です。System.NullReferenceExceptionを使用します。
以下のコードを参照してください。
[WebMethod]
public bool SPRetreiveCMPTest()
{
try
{
SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder("Data Source=sql1\\sharepoint;Initial Catalog=WSS_Content_Sales_Test;Integrated Security=SSPI");
SPContentDatabase spcd = SPContentDatabase.CreateUnattachedContentDatabase(scsb); // <-- ERROR OCCURS HERE!!
SPExportObject speo = new SPExportObject();
speo.Url = "http://sharepoint/sites/sales/productmgmt/Product Management";
speo.IncludeDescendants = SPIncludeDescendants.All;
speo.Type = SPDeploymentObjectType.List;
SPExportSettings spes = new SPExportSettings();
spes.UnattachedContentDatabase = spcd;
spes.SiteUrl = "http://sharepoint1:8080/sites/sales";
spes.FileLocation = "C:\\users\\sp_farm\\test_restore";
spes.LogFilePath = "C:\\users\\sp_farm\\test_restore\\test.log";
spes.BaseFileName = "testout";
spes.ExportObjects.Add(speo);
spes.IncludeVersions = SPIncludeVersions.All;
spes.LogExportObjectsTable = false;
spes.IncludeSecurity = SPIncludeSecurity.All;
using (SPExport spe = new SPExport(spes))
spe.Run();
}
catch (Exception e) { return false; }
return true;
}
Webサービスが実行されているアプリケーションプールがファーム管理者アカウントを使用していることを確認しました。このエラーが発生している理由について何か考えはありますか?
編集:
修正しました!以下のスタックトレースをたどり始めましたが、2つの部分からなる修正であることがわかりました。
最初のスタックトレース:
at Microsoft.SharePoint.Utilities.SPUtility.ValidateFormDigest()
at Microsoft.SharePoint.Administration.SPPersistedObject.BaseUpdate()
at Microsoft.SharePoint.Administration.SPPersistedChildCollection`1.Add(T newObj, Boolean ensure)
at Microsoft.SharePoint.Administration.SPPersistedChildCollection`1.Ensure(T newObj)
at Microsoft.SharePoint.Administration.SPContentDatabase.CreateUnattachedContentDatabase(String databaseInstanceServer, String databaseName, String username, String password)
at PHSSPWebService.PHSSPWebServiceClass.SPRetreiveCMPTest() in D:\\My Documents\\Visual Studio 2008\\Projects\\PHS\\PHSSPWebService\\PHSSPWebService\\PHSSPWebService.asmx.cs:line 100"
1.)WebサービスWebサイトのIISでフォーム認証を有効にする必要があり、新しい例外(InvalidOperationException)とスタックトレースが表示されました。
2番目のスタックトレース:
at Microsoft.SharePoint.WebControls.SPControl.SPWebEnsureSPControl(HttpContext context)
at Microsoft.SharePoint.Utilities.SPUtility.ValidateFormDigest()
at Microsoft.SharePoint.Administration.SPPersistedObject.BaseUpdate()
at Microsoft.SharePoint.Administration.SPPersistedChildCollection`1.Add(T newObj, Boolean ensure)
at Microsoft.SharePoint.Administration.SPPersistedChildCollection`1.Ensure(T newObj)
at Microsoft.SharePoint.Administration.SPContentDatabase.CreateUnattachedContentDatabase(String databaseInstanceServer, String databaseName, String username, String password)
at PHSSPWebService.PHSSPWebServiceClass.SPRetreiveCMPTest() in D:\\My Documents\\Visual Studio 2008\\Projects\\PHS\\PHSSPWebService\\PHSSPWebService\\PHSSPWebService.asmx.cs:line 100"
2.)修正は、コードの先頭SPWebEnsureSPControl(HttpContext context)
に設定することでしたが、うまくいきました。HttpContext.Current = null
詳細については、こちらをご覧ください:http: //johnatjornata.wordpress.com/2012/01/23/runwithelevatedprivileges-operation-is-not-valid-due-to-the-current-state-of-the-object-error-説明/