您的位置:首页 > 运维架构 > 网站架构

使用SPExport和SPImport复制或移动SharePoint网站

2011-08-22 10:59 441 查看
在Microsoft.SharePoint.Deployment命名空间下,我们找到SPExport和SPImport类,其中包含了最基本的备份和还原一个网站集,网站,列表或SharePoint中的其他对象的方法,这些方法也正是SharePoint Designer所使用的。为了能够使用SPExport和SPImport,我们首先需要通过相应的设置类配置整个过程中涉及的细节信息。
1
SPExportSettings
settings =
new
SPExportSettings();
2
settings.FileLocation
=
"C:\SPBackup"
;
3
settings.SiteUrl
= http:
//server/mySite
4
settings.FileCompression
=
true
;
5
settings.OverwriteExistingDataFile
=
true
;
6
settings.BaseFileName
=
"export"
;
7
SPExport
export =
new
SPExport(settings);
8
export.Run();
此代码将创建一个存档文件,名为export.cmp,其中包含了网站集http://server/MySite中的所有信息,最后存放在文件夹C:\SPBackup下。设置FileCompression = true会产生一个CAB压缩包。 OverwriteExistingDataFile = true告诉SPExport覆盖任何现有文件。如果将其设置为false,并且export.cmp文件已存在,则将抛出一个异常。反方向的操作如下:
1
SPImportSettings
settings =
new
SPImportSettings();
2
settings.FileLocation
=
"C:\SPBackup"
;
3
settings.BaseFileName
=
"export"
;
4
SPImport
import =
new
SPImport(settings);
5
import.Run();
其中比较有趣的一点是,当在Settings对象中设置CommandLineVerbose = true时,会将输出信息写入到一个控制台窗口中,我们就可以方便的看到导入导出期间经历的详细过程。虽然SPExport和SPImport类都有一个ProgressUpdated事件,但是它不会发送此类信息。它只会发送相关对象的总数和已被处理的数量。这仅仅是一些基本的设置。现在让我们更详细的研究一下这一过程,看看如何用它来复制或移动一个网站。

复制/移动网站

我们可以创建一个类,为复制或移动网站提供一个简单的接口。
1
SPWeb
web =
new
SPWeb(
"http://server/shenzhen/Division8"
,
"http://server/beijing"
);
2
web.Copy();
第一个参数是被复制网站的网址。第二个参数是目标URL。在本例中,我们是将http://server/shenzhen/Division8复制到http://server/beijin/Division8。

验证源网站

第一件必须做的事情是验证源网站的存在。
01
private
void
ValidateSource()
02
{
03
try
04
{
05
Uriuri = 
new
Uri(SourceURL);
06
07
SourceSite= 
new
Microsoft.SharePoint.SPSite(SourceURL);
08
if
(SourceSite!= 
null
)
09
{
10
SourceWeb= SourceSite.OpenWeb(uri.LocalPath);
11
if
(!SourceWeb.Exists)
12
{
13
SourceWeb.Dispose();
14
SourceWeb= 
null
;
15
throw
new
ArgumentException(
"源网站无效"
);
16
}
17
}
18
}
19
catch
(System.IO.FileNotFoundException)
20
{
21
//找不到指定的网站
22
throw
new
ArgumentException(
"SourceURLis invalid"
);
23
}
24
}
这里一个有趣的地方是,如果我们调用OpenWeb时没有传递想要打开的网站的相对路径,像下面这样,则会返回根网站,当然,SPWeb.Exists将返回true。
1
SourceWeb= SourceSite.OpenWeb();
一个繁琐但可行的方法是搜索SPWebCollection以匹配名称。使用StringComparer.CurrentCultureIgnoreCase很必要,因为名字和URL不见得大小写相同。:这样的方法对中文标题的网站无效,因为通常中文的标题和url名称往往不同,相同的内容也要decode后才能比较,不是简单的大小写的问题了。
1
string
web = SourceURL.Replace(SourceSite.Url, 
""
).Remove(0,1);
2
if
(SourceSite.AllWebs.Names.Contains(uri.LocalPath,
3
StringComparer.CurrentCultureIgnoreCase))
4
{
5
SourceWeb= SourceSite.OpenWeb();
6
}

验证目标网站

目标网站同样需要验证。如果同名的网站已经存在,我们必须检查器类型。如果和源网站不同,在导入过程中会抛出一个异常。因此必须首先将其删除。不必提前创建好一个新网站,因为在导入过程中会自动创建。如果网站的类型相同,在导入过程中目标网站会被覆盖。
01
private
void
ValidateDestination()
02
{
03
try
04
{
05
Uriuri = 
new
Uri(DestinationURL);
06
07
DestinationSite= 
new
Microsoft.SharePoint.SPSite(DestinationURL);
08
if
(DestinationSite!= 
null
)
09
{
10
DestinationWeb= DestinationSite.OpenWeb(uri.LocalPath);
11
if
(DestinationWeb.Exists)
12
{
13
CompareTemplates();
14
}
15
else
16
{
17
throw
new
ArgumentException(
"目标网站无效"
);
18
}
19
}
20
}
21
catch
(System.IO.FileNotFoundException)
22
{
23
//找不到指定网站
24
throw
new
ArgumentException(
"目标网站无效"
);
25
}
26
}
27
28
private
void
CompareTemplates()
29
{
30
uint
localID = Convert.ToUInt16(SourceWeb.Locale.LCID);
31
32
string
templateName =
33
GetTemplateName(SourceSite.ContentDatabase.DatabaseConnectionString,
34
SourceWeb.ID,SourceWeb.WebTemplate);
35
36
SPWebTemplatesourceTemplate =
37
SourceSite.GetWebTemplates(localID)[templateName];
38
39
templateName=
40
GetTemplateName(DestinationSite.ContentDatabase.DatabaseConnectionString,
41
DestinationWeb.ID,DestinationWeb.WebTemplate);
42
43
SPWebTemplatedestTemplate =
44
DestinationSite.GetWebTemplates(localID)[templateName];
45
46
//如果模板不同,则需要先删除目标网站
47
if
(sourceTemplate.Name!= destTemplate.Name)
48
{
49
RecursivelyDeleteWeb(DestinationWeb);
50
DestinationWeb.Dispose();
51
DestinationWeb= 
null
;
52
}
53
}

查看SPWebTemplate

当对网站的SPWebTemplate进行比较时,着眼点首先会放在WebTemplate属性上。然而,该属性并不能为准确的比较提供足够的信息。比如,对于使用基本会议工作区模板创建的一个网站来说,SPWeb.WebTemplate会返回MPS。对于使用空白网站模板创建的一个网站,会返回STS。而准确的模板名称分别应该是MPS#1和STS#1。这些特定的配置信息在哪儿呢?很不幸,SPWeb对象上貌似找不到。唯一可以找到该信息的地方是WSS_Content内容数据库。
01
private
string
GetTemplateName(
string
connString, Guid id, 
string
webTemplate)
02
{
03
string
cmdText = 
string
.Format(
"SELECTProvisionConfig FROM "
+
04
"dbo.WebsWHERE Id = '{0}'"
,id.ToString());
05
int
provisionConfig = 0;
06
using
(SqlConnectionconn = 
new
SqlConnection(connString))
07
{
08
using
(SqlCommandcmd = 
new
SqlCommand(cmdText, conn))
09
{
10
conn.Open();
11
provisionConfig= Convert.ToInt32(cmd.ExecuteScalar());
12
}
13
}
14
15
return
string
.Format(
"{0}#{1}"
,webTemplate, provisionConfig);
16
}
这里,我们通过SPSite对象获取连接字符串,然后再Webs表中查找相应的值。当然,仍然要提醒一句,直接访问数据库是不推荐的。但是,像我们这种情况,在API中实在找不到,因此没得选。

导出网站

正如上面提到的,导出过程的配置需要一个settings类,这里是SPExportSettings。
01
SPExportSettings
settings =
new
SPExportSettings();
02
settings.FileLocation
=ExportPath;
03
settings.BaseFileName
=EXPORT_FILENAME;
04
settings.SiteUrl= SourceSite.Url;
05
06
settings.ExportMethod= SPExportMethodType.ExportAll;
07
settings.FileCompression
=
true
;
08
settings.IncludeVersions= SPIncludeVersions.All;
09
settings.IncludeSecurity= SPIncludeSecurity.All;
10
settings.ExcludeDependencies= 
false
;
11
settings.ExportFrontEndFileStreams= 
true
;
12
settings.OverwriteExistingDataFile
=
true
;
13
14
SPExport
export =
new
SPExport(settings);
15
export.Run();
运行上面的代码会发生什么呢?是不是整个网站集都被导出了?整个SharePoint网站集是指通过SiteURL指定的站点的根网站及其下的所有子站点。然而,我们只是要其中的一个。若要导出一个网站,需要将其添加到ExportedObjects集合中。SPExport会使用该集合来标识哪些内容需要导出。如果该集合为空,就会导出所有内容。
1
SPExportObjectexpObj = 
new
SPExportObject();
2
expObj.IncludeDescendants= SPIncludeDescendants.All;
3
expObj.Id= SourceWeb.ID;
4
expObj.Type= SPDeploymentObjectType.Web;
5
settings.ExportObjects.Add(expObj);
我们指定了SourceWeb的ID,同时将Type设置为Web。在SPDeploymentObjectType枚举中包括了一系列的成员分别用于标识:Site,Web,List,ListItem,File和Folder。

导入网站

viewsourceprint?
01
private
void
Import()
02
{
03
if
(DestinationSite== 
null
)
04
throw
new
ApplicationException(
"目标网站为空"
);
05
06
SPImportSettings
settings =
new
SPImportSettings();
07
08
settings.FileLocation
=ExportPath;
09
settings.BaseFileName
=EXPORT_FILENAME;
10
settings.IncludeSecurity= SPIncludeSecurity.All;
11
settings.UpdateVersions= SPUpdateVersions.Overwrite;
12
settings.RetainObjectIdentity= 
false
;
13
settings.SiteUrl= DestinationSite.Url;
14
settings.WebUrl= DestinationURL;
15
16
SPImport
import =
new
SPImport(settings);
17
import.Run();
18
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐