如何使用 c# 导入 SPWeb 以具有与 PowerShell 相同的行为?
How to import an SPWeb using c# to have the same behavior than PowerShell?
我sharepoint.deployment.spimport的举止有问题。
我想像这样在同一个网站集中复制一个网站:
myserver/mysitecoll/website1
myserver/mysitecoll/website2
当我使用PowerShell命令执行这个时,它完美地完成了,website2与website1相同
Export-SPWeb -Identity http://myserver/mysitecoll/website1 -Path D:\mybackups\mytestsave\mybackup.bak
和
Import-SPWeb -Identity http://myserver/mysitecoll/website2 -Path D:\mybackups\mytestsave\mybackup.bak
但我需要对我使用的 c# 做同样的事情
private void ExportSpWeb()
{
SPSite mySite = SPContext.Current.Site;
SPWeb myWeb = SPContext.Current.Web;
SPExportObject exportObject = new SPExportObject();
exportObject.Id = myWeb.ID;
exportObject.ParentId = mySite.ID;
exportObject.Type = SPDeploymentObjectType.Web;
SPExportSettings settings = new SPExportSettings();
settings.SiteUrl = mySite.Url;
settings.ExportMethod = SPExportMethodType.ExportAll;
settings.FileLocation = "D:\mybackups\mytestsave";
settings.BaseFileName = "test.cab";
settings.FileCompression = true;
settings.ExcludeDependencies = true;
settings.CommandLineVerbose = true;
settings.ExportObjects.Add(exportObject);
SPExport export = new SPExport(settings);
export.Run();
}
private void importSpWeb()
{
SPSite mySite = SPContext.Current.Site;
SPWeb myDestWeb = mySite.AllWebs["website2"];
SPImportSettings impsettings = new SPImportSettings();
impsettings.SiteUrl = mySite.Url;
impsettings.LogFilePath = "D:\mybackups\mytestsave\test.log";
impsettings.WebUrl = myDestWeb.ServerRelativeUrl;
impsettings.FileLocation = "D:\mybackups\mytestsave";
impsettings.FileCompression = true;
impsettings.BaseFileName = "test.cab";
impsettings.RetainObjectIdentity = false;
SPImport import = new SPImport(impsettings);
import.Run();
}
但该组件与 PowerShell 不同:它不是使用指定的 WebUrl 设置创建的 (http://myserver/mysitecoll/website2),
导入的网站创建为具有路径的新子网站
http://myserver/mysitecoll/website2/website1
我应该如何编辑我的代码以获得与 PowerShell 相同的结果?
这个问题让我思考得很深,因为我和你一样碰壁,但这让我想出了一个问题:
所以知道 Import-SPWeb
又名 SPCmdletImportWeb
在 Microsoft.SharePoint.PowerShell.dll
中的位置,我检查了它是如何完成的。
棘手的部分是,出于某种原因 SPImportWeb
有一些奇怪的逻辑来修改 WebUrl 属性 并总是在末尾添加 /
。所以在 SPCmdletImportWeb
他们使用 SPImport
class Created
事件来重置一些属性。
对于您的情况,当您导出和导入一个 SPWeb 对象时,您需要将下面的代码添加到您的导入对象中:
string webUrl = "website2";
// your stuff
SPImport import = new SPImport(impsettings);
import.Started += delegate(object sender, SPDeploymentEventArgs args)
{
SPImportObjectCollection rootObjects = args.RootObjects;
if (rootObjects[0].Type == SPDeploymentObjectType.Web)
{
rootObjects[0].TargetParentUrl = site.Url;
rootObjects[0].TargetName = webUrl;
return;
}
};
要查找 SPCmdletImportWeb
的完整代码,请获取 ILSpy 并按照我在第一个 url 中的迷你教程进行操作。
完整测试代码:
[TestMethod]
public void Test_ExportSpWeb()
{
ExportSpWeb("http://lab/sites/custom-dev", "website1", @"C:\temp\bak\bak2.bak");
}
[TestMethod]
public void Test_ImportSpWeb()
{
ImportSpWeb("http://lab/sites/custom-dev", "website2", @"C:\temp\bak\bak2.bak");
}
private void ImportSpWeb(string siteUrl, string webUrl, string path)
{
using (SPSite site = new SPSite(siteUrl))
using (SPWeb web = site.OpenWeb(webUrl))
{
SPImportSettings impsettings = new SPImportSettings();
impsettings.SiteUrl = site.Url;
impsettings.LogFilePath = path + ".log";
impsettings.WebUrl = web.ServerRelativeUrl + "/" + webUrl;
impsettings.FileLocation = Path.GetDirectoryName(path);
impsettings.FileCompression = true;
impsettings.CommandLineVerbose = true;
impsettings.BaseFileName = Path.GetFileName(path);
impsettings.RetainObjectIdentity = false;
SPImport import = new SPImport(impsettings);
import.Started += delegate(object sender, SPDeploymentEventArgs args)
{
SPImportObjectCollection rootObjects = args.RootObjects;
if (rootObjects[0].Type == SPDeploymentObjectType.Web)
{
rootObjects[0].TargetParentUrl = site.Url;
rootObjects[0].TargetName = webUrl;
return;
}
};
import.Run();
}
}
private void ExportSpWeb(string siteUrl, string webUrl, string path)
{
using (SPSite site = new SPSite(siteUrl))
using (SPWeb web = site.OpenWeb(webUrl))
{
SPExportObject exportObject = new SPExportObject();
exportObject.Id = web.ID;
exportObject.ParentId = site.ID;
exportObject.Type = SPDeploymentObjectType.Web;
SPExportSettings settings = new SPExportSettings();
settings.SiteUrl = site.Url;
settings.ExportMethod = SPExportMethodType.ExportAll;
settings.FileLocation = Path.GetDirectoryName(path);
settings.BaseFileName = Path.GetFileName(path);
settings.LogFilePath = path + ".log";
settings.FileCompression = true;
settings.ExcludeDependencies = true;
settings.CommandLineVerbose = true;
settings.ExportObjects.Add(exportObject);
SPExport export = new SPExport(settings);
export.Run();
}
}
我sharepoint.deployment.spimport的举止有问题。
我想像这样在同一个网站集中复制一个网站:
myserver/mysitecoll/website1
myserver/mysitecoll/website2
当我使用PowerShell命令执行这个时,它完美地完成了,website2与website1相同
Export-SPWeb -Identity http://myserver/mysitecoll/website1 -Path D:\mybackups\mytestsave\mybackup.bak
和
Import-SPWeb -Identity http://myserver/mysitecoll/website2 -Path D:\mybackups\mytestsave\mybackup.bak
但我需要对我使用的 c# 做同样的事情
private void ExportSpWeb()
{
SPSite mySite = SPContext.Current.Site;
SPWeb myWeb = SPContext.Current.Web;
SPExportObject exportObject = new SPExportObject();
exportObject.Id = myWeb.ID;
exportObject.ParentId = mySite.ID;
exportObject.Type = SPDeploymentObjectType.Web;
SPExportSettings settings = new SPExportSettings();
settings.SiteUrl = mySite.Url;
settings.ExportMethod = SPExportMethodType.ExportAll;
settings.FileLocation = "D:\mybackups\mytestsave";
settings.BaseFileName = "test.cab";
settings.FileCompression = true;
settings.ExcludeDependencies = true;
settings.CommandLineVerbose = true;
settings.ExportObjects.Add(exportObject);
SPExport export = new SPExport(settings);
export.Run();
}
private void importSpWeb()
{
SPSite mySite = SPContext.Current.Site;
SPWeb myDestWeb = mySite.AllWebs["website2"];
SPImportSettings impsettings = new SPImportSettings();
impsettings.SiteUrl = mySite.Url;
impsettings.LogFilePath = "D:\mybackups\mytestsave\test.log";
impsettings.WebUrl = myDestWeb.ServerRelativeUrl;
impsettings.FileLocation = "D:\mybackups\mytestsave";
impsettings.FileCompression = true;
impsettings.BaseFileName = "test.cab";
impsettings.RetainObjectIdentity = false;
SPImport import = new SPImport(impsettings);
import.Run();
}
但该组件与 PowerShell 不同:它不是使用指定的 WebUrl 设置创建的 (http://myserver/mysitecoll/website2), 导入的网站创建为具有路径的新子网站 http://myserver/mysitecoll/website2/website1
我应该如何编辑我的代码以获得与 PowerShell 相同的结果?
这个问题让我思考得很深,因为我和你一样碰壁,但这让我想出了一个问题:
所以知道 Import-SPWeb
又名 SPCmdletImportWeb
在 Microsoft.SharePoint.PowerShell.dll
中的位置,我检查了它是如何完成的。
棘手的部分是,出于某种原因 SPImportWeb
有一些奇怪的逻辑来修改 WebUrl 属性 并总是在末尾添加 /
。所以在 SPCmdletImportWeb
他们使用 SPImport
class Created
事件来重置一些属性。
对于您的情况,当您导出和导入一个 SPWeb 对象时,您需要将下面的代码添加到您的导入对象中:
string webUrl = "website2";
// your stuff
SPImport import = new SPImport(impsettings);
import.Started += delegate(object sender, SPDeploymentEventArgs args)
{
SPImportObjectCollection rootObjects = args.RootObjects;
if (rootObjects[0].Type == SPDeploymentObjectType.Web)
{
rootObjects[0].TargetParentUrl = site.Url;
rootObjects[0].TargetName = webUrl;
return;
}
};
要查找 SPCmdletImportWeb
的完整代码,请获取 ILSpy 并按照我在第一个 url 中的迷你教程进行操作。
完整测试代码:
[TestMethod]
public void Test_ExportSpWeb()
{
ExportSpWeb("http://lab/sites/custom-dev", "website1", @"C:\temp\bak\bak2.bak");
}
[TestMethod]
public void Test_ImportSpWeb()
{
ImportSpWeb("http://lab/sites/custom-dev", "website2", @"C:\temp\bak\bak2.bak");
}
private void ImportSpWeb(string siteUrl, string webUrl, string path)
{
using (SPSite site = new SPSite(siteUrl))
using (SPWeb web = site.OpenWeb(webUrl))
{
SPImportSettings impsettings = new SPImportSettings();
impsettings.SiteUrl = site.Url;
impsettings.LogFilePath = path + ".log";
impsettings.WebUrl = web.ServerRelativeUrl + "/" + webUrl;
impsettings.FileLocation = Path.GetDirectoryName(path);
impsettings.FileCompression = true;
impsettings.CommandLineVerbose = true;
impsettings.BaseFileName = Path.GetFileName(path);
impsettings.RetainObjectIdentity = false;
SPImport import = new SPImport(impsettings);
import.Started += delegate(object sender, SPDeploymentEventArgs args)
{
SPImportObjectCollection rootObjects = args.RootObjects;
if (rootObjects[0].Type == SPDeploymentObjectType.Web)
{
rootObjects[0].TargetParentUrl = site.Url;
rootObjects[0].TargetName = webUrl;
return;
}
};
import.Run();
}
}
private void ExportSpWeb(string siteUrl, string webUrl, string path)
{
using (SPSite site = new SPSite(siteUrl))
using (SPWeb web = site.OpenWeb(webUrl))
{
SPExportObject exportObject = new SPExportObject();
exportObject.Id = web.ID;
exportObject.ParentId = site.ID;
exportObject.Type = SPDeploymentObjectType.Web;
SPExportSettings settings = new SPExportSettings();
settings.SiteUrl = site.Url;
settings.ExportMethod = SPExportMethodType.ExportAll;
settings.FileLocation = Path.GetDirectoryName(path);
settings.BaseFileName = Path.GetFileName(path);
settings.LogFilePath = path + ".log";
settings.FileCompression = true;
settings.ExcludeDependencies = true;
settings.CommandLineVerbose = true;
settings.ExportObjects.Add(exportObject);
SPExport export = new SPExport(settings);
export.Run();
}
}