1.6 SharePoint 解决方案开发
上一节里我们通过一个HelloWorld控制台程序展示了如何调用SharePoint服务器端对象模型,这一节将介绍真正的SharePoint解决方案的开发方式。
1.6.1 什么是SharePoint解决方案
通常我们将要部署到生产环境的一系列文件的集合称之为一个解决方案,这个解决方案里面可能会包含诸如Web部件、工作流、列表定义等各种功能。SharePoint最终发布到生产环境部署的通常是一个以wsp为后缀的安装包,这个wsp包可以直接通过管理中心上传并部署,也可以通过命令行以及PowerShell的方式来发布。这样做得好处是我们只需要在一台Web前端服务器做部署,SharePoint会将包内的内容自动分发到需要部署的其他前端服务器以及应用程序服务器上。
SharePoint的WSP解决方案包实际上是一个CAB文件,将文件后缀从.wsp改为.cab后,我们可以直接单击进去查看包内的详细内容。
1.6.2 了解SharePoint系统根目录结构
在访问SharePoint画面的时候,我们经常会发现很多页面都位于一个叫做_layouts的根目录下面,比如站点集设置页面在http://siteURL/_layouts/settings.aspx,查看网站所有内容的页面在http://siteURL/_layouts/viewlsts.aspx,这个_layouts文件夹到底为何物,细心点的开发人员可能会去IIS管理器查看,如图1-28所示,发现里面确实存在一个_layouts的快捷方式,如果查看其属性会发现这个文件夹位于C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\template\layouts。
图1-28 IIS根目录示例
实际上不仅是Layouts,SharePoint的绝大多数系统文件、资源都部署在一个称之为根目录的地方:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14
我们稍后会接触到可视化Web部件开发等产生的中间文件,比如用户自定义控件(.ascx)文件、Feature定义文件等都会部署在这个文件夹下的某个子文件夹里。而对其中的一些系统文件,比如Layouts下的settings.aspx系统页面的修改都会在整个服务器场范围内产生影响。因此,一方面对这个文件夹下面已经存在的文件修改一定要非常谨慎,要考虑到今后微软推出的补丁或者SP有可能会去更改这些页面和我们的修改,也因而存在冲突的可能;另一方面,我们在部署自定义的文件时,比如用户控件、图片、自定义字段、Feature等,要按照SharePoint的方式部署在相应的文件夹下。
更多信息:如果某个大型应用的Web应用程序要修改系统文件,但是在同一个服务器场中存在其他的Web应用程序的情况下,结合实际情况可以考虑把14文件夹单独复制一份后通过修改IIS设置使相关链接指向复制出来的新文件夹,但一定要注意向后兼容性的问题。
SharePoint根目录下相关重要文件夹说明一览如表1-3所示。
表1-3 SharePoint根目录详解
1.6.3 手动创建Feature
要了解SharePoint的解决方案包,很重要的一点是要理解Feature,Feature可以理解为“功能”,我们将需要发布给用户使用的工作流、Web部件等都封装在Feature里,用户可以通过激活该Feature来获得对新功能的使用,也可以通过停用来停止对新功能的使用。
在安装了SharePoint Foundation后,在C:\Program Files\Common Files\Microsoft Shared\Web extensions\14\TEMPLATES\Features下会罗列出SharePoint已经安装的所有Feature。注意,图1-29是笔者安装的企业版截图,如果安装的是SharePoint Foundation,这个文件夹下大概会有54个文件夹。
图1-29 Feature一览
其中每个文件夹都对应一个Feature,每个文件夹里通常包含一个Feature.xml文件,此文件是Feature的清单文件,用来定义此Feature并指定其程序集、文件、依赖管理或属性。让我们从零开始建立一个非常简单的Feature。
首先我们在\14\TEMPLATES\Features文件夹下创建一个叫做FirstFeature的文件夹。
进入FirstFeature文件夹,创建Feature.xml文件,请注意其中的ID部分使用的内容是GUID,如果使用Visual Studio 2010来生成GUID,需要进行额外的配置,这里我们可以使用Windows PowerShell来生成GUID。虽然我们还没有介绍Windows PowerShell的使用,但你只需要简单地将下面的代码复制到PowerShell运行窗口,回车后就可以得到运行结果:
$guid=[System.Guid]::NewGuid() $guid
将生成的GUID复制到下面程序清单的ID处:
<?xml version="1.0" encoding="utf-8" ?> <Feature Id="19b62ea8-a530-4613-936b-8a5a635df27e" Title="FirstFeature" Version=”1.0.0.0” Scope=”Web” Hidden=”False” ImgUrl=”FirstFeature/logo.gif” Description="First Feature for test purpose." xmlns="http://schemas.microsoft.com/sharepoint/"> <ElementManifests> <ElementManifest Location="Elements.xml" /> </ElementManifests> </Feature>
对上面清单各个元素的说明请参照表1-4。
表1-4 Feature元素说明
在SharePoint根路径\TEMPLATES\IMAGES文件夹下创建FirstFeature文件夹,并将准备好的logo.gif文件放到下面。
创建Element.xml文件,Element文件包含以CAML定义的元素,SharePoint Fundation会检测其中的定义元素,并在目标站点上创建相应的对象。Element清单文件必须以Elements顶层元素开头,之后可以添加元素的定义。下例中我们将使用CustomAction来给文档库视图增加一个到站点设置页面的链接。
<?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <CustomAction Id="ListViewCustomization" Location="CommandUI.Ribbon.ListView" RegistrationId="101" RegistrationType="List" Title="List View Ribbon Customization"> <CommandUIExtension> <CommandUIDefinitions> <CommandUIDefinition Location="Ribbon.Documents.Share.Controls._children"> <Button Id="ListViewButton" Command="ListViewButtonCommand" Description="Go to Settings" Image32by32="/_layouts/images/firstfeature/logo.gif" LabelText="Site Settings" TemplateAlias="o2" Sequence="93"/> </CommandUIDefinition> </CommandUIDefinitions> <CommandUIHandlers> <CommandUIHandler Command="ListViewButtonCommand" CommandAction="/_layouts/settings.aspx" /> </CommandUIHandlers> </CommandUIExtension> </CustomAction> </Elements>
这个站点文件里只有CustomAction一个定义元素,但可以根据需要添加更多的元素,也可以把元素存储在不同的Element清单文件里,一个Feature定义文件允许包含多个Element清单文件。上面的CustomAction中,通过Location指定了元素将被呈现的位置是在Riboon的ListView中,并且针对的对象是101也即文档库,CommandUIExtensions里说明了在ListView里面会添加的对象,这个例子里我们添加了一个按钮对象,而CommandUIExtension里的Location,进一步地指出这个按钮将位于Ribbon的Documents这个Tab下的Share,如图1-30所示。
图1-30 文档库Ribbon一览
Button的Command属性和CommandUIHandler的Command属性相匹配,指定了按钮事件触发时的处理器,而CommandUIHandler的CommandAction则包含了按钮事件触发时会被调用的脚本,在这里我们只是给了一个简单的到站点设置画面的链接,里面还可以包含JS脚本代码以进行更复杂的处理。
表1-5是在Element文件里经常会使用到的元素类别,在之后的开发过程中我们会渐渐熟悉它们的使用方法。
表1-5 Element常见元素一览
到这一步,我们需要创建和部署在服务器上的内容已经准备好了,下一步就要通过创建解决方案包进行发布了。
1.6.4 手动创建解决方案包
解决方案包的部署通常分为两步:第一步是将wsp包加载到配置数据库;第二步是将解决方案部署到相应的Web应用程序,这个过程中SharePoint会创建一个TimerJob,并通过这个Job来在不同的服务器中分发。下面我们开始创建解决方案包。
创建一个文件夹CustomLinkWSP,将FirstFeature文件夹复制至其下,创建IMAGES文件夹,再在IMAGES文件夹下面创建FirstFeature文件夹,最后将我们用到的logo.gif文件复制至其下。
接着在CustomLinkWSP文件夹下创建一个manifest.xml文件,manifest.xml用来描述解决方案包的内容清单,且名字必须为manifest.xml。内容清单将会列出需要复制到SharePoint根目录下的文件,也会说明需要部署到GAC的DLL或者需要安装到服务器场的Feature,安装Feature除了复制文件到SharePoint根目录下的相关目录外,还要更新配置数据库。
<?xml version="1.0" encoding="utf-8"?> <Solution SolutionId="5e9b0e9c-d8de-456d-a5d5-d511706d1f48" Title="Custom Link Wsp" DeploymentServerType="WebFrontEnd" ResetWebServer="True" xmlns="http://schemas.microsoft.com/sharepoint/"> <FeatureManifests> <FeatureManifest Location="FirstFeature\feature.xml" /> </FeatureManifests> <TemplateFiles> <TemplateFile Location="Images\FirstFeature\logo.gif" /> </TemplateFiles> </Solution>
SolutionID为GUID,可以用前面我们介绍到的方式通过Windows PowerShell获得,Title用来描述解决方案包,DeploymentServerType指定了部署的对象是Web前端服务器,ResetWebServer指定是否需要在部署后进行IISRESET。
上述解决方案文件清单文件包含了两个节:FeatureManifests节包含了Feature文件的部署位置;TemplateFiles节包含了要部署到SharePoint根目录\Template\Images\FirstFeature文件夹下的logo.gif文件位置描述。
此时CustomLinkWSP文件夹下的结构如图1-31所示。
图1-31 WSP文件夹结构
现在我们可以准备创建WSP解决方案包了,我们之前提壶WSP文件,其本质上是CAB文件,我们可以通过makecab命令来构建WSP包。首先,与CustomLinkWSP文件夹并行,我们创建一个input文件夹,在其下创建一个BuildSolution.ddf文件,这个文件将告诉makecab怎样来创建wsp文件。
; .OPTION EXPLICIT ;指定WSP方案包名字 .Set CabinetNameTemplate=CustomLinkWSP.wsp ;WSP方案包生成地址 .set DiskDirectory1=output ;将文件添加到解决方案包 CustomLinkWSP\manifest.xml manifest.xml ;前面是生成方案包前文件所在相对位置,后面是文件在方案包里的预定位置 CustomLinkWSP\FirstFeature\element.xml \FirstFeature\element.xml CustomLinkWSP\FirstFeature\feature.xml \FirstFeature\feature.xml CustomLinkWSP\Images\FirstFeature\logo.gif \Images\FirstFeature\logo.gif
习惯使用命令行窗口的开发人员可以使用makecab.exe命令来生成方案包,这里采用的方式是Windows PowerShell。
$ProjectName="CustomLinkWSP" $ProjectDeploymentFilesDirectory="G:\Workfolder\SP2010\MakeWSP\" $DiamondDefinitionFilePath=$ProjectDeploymentFilesDirectory+'input\BuildSolution.ddf' Set-Location $ProjectDeploymentFilesDirectory $MAKECAB="C:\Windows\SysWOW64\MAKECAB.EXE" & $MAKECAB /V1 /F $DiamondDefinitionFilePath
G:\Workfolder\SP2010\MakeWSP是笔者的工作目录,CustomLinkWSP就在这个文件夹下。此脚本运行后我们将会在MakeWSP文件夹下的output子文件夹下方发现生成了CustomLinkWSP.wsp解决方案包。
运行stsadm命令安装部署解决方案包:
stsadm -o addsolution -filename G:\Workfolder\SP2010\MakeWSP\output\CustomLinkWSP.wsp stsadm -o deploysolution -name CustomLinkWSP.wsp -allowcaspolicies -immediate –force
如前所述,此时会生成部署此解决方案包的TimerJob,可以运行stsadm命令使此Job立即运行:
stsadm -o execadmsvcjobs
此时我们打开站点集,然后进入到站点级别的Feature管理页面会发现我们部署的Feature已经出现在那里,单击“激活(Activate)”按钮激活此Feature,如图1-32所示。
图1-32 First Feature效果
激活后查看某个共享文档库,我们会发现添加的“Site Settings”链接,如图1-33所示。
图1-33 Ribbon新链接