我们都知道,通过Visual Studio开发SharePoint项目的话,Visual Studio默认是将编译后的DLL文件部署到GAC,为了下文描述方便暂称之为GAC部署。
这种模式很简单,不需要额外的配置,只需右键点击项目选择Deploy就可以将代码部署到SharePoint环境,Visual Studio会自动将DLL复制到GAC。
但是,SharePoint为了提高性能,从GAC里加载代码后,会将之缓存到内存里,以避免频繁加载。当我们准备将下一个版本的代码部署到GAC时,必须回收应用程序池或者重启IIS来清除之前的缓存,让SharePoint从GAC里加载最新的代码版本。
Visual Studio会自动帮我们回收或重启IIS,问题在于,我们的开发环境性能通常都很一般,不论是公司还是私人的电脑,预算都有限,不可能为了一台开发用的机器投入太多的金钱,而且开发机器上总是有杂七杂八的东西,这就导致了回收/重启时间会很长,以笔者机器为例,8G内存,双核处理器,重启时间是2分钟到4分钟不等,虽然我们可以利用这等闲暇去上个厕所或者喝杯茶,但是经常为了几个小小的代码改动而接二连三的重启、等待,浪费的总时间是非常非常影响工作效率的。
下面笔者介绍另一种部署,简称之为Bin部署吧,其实就是我们开发asp.net 项目时的默认部署方式。这种部署需要先配置下Visual Studio的SharePoint模板以及站点下的web.config,不需要回收、重启IIS,编译代码后,只需要刷新SharePoint页面,仅仅只需5秒钟左右即可看到最新的结果。
在应用这种部署之前一些你必须知道的事情:
- Bin部署应该仅仅用于开发环境,为了安全考虑,在QC、UAT、Production环境中我们还是需要将程序集部署到GAC,所以当我们在开发机上完成开发后,还是需要将程序集部署到GAC上进行测试。
- Bin部署只能保留一个代码版本,但是GAC部署可以保留多个。
- Bin部署不需要强命名的程序集,但是GAC部署必须要,所以最好还是给每个用到的程序集加上强命名。
- Bin部署是部分信任级别,GAC是完全信任级别,所以Bin部署的代码的执行权限有限制,下文会提到如何将之提升到完全信任级别,同样再强调一下,仅仅只能在开发机上进行提升。
- 你可以直接将公用程序集从一个站点的Bin文件夹拷贝到另一个站点的Bin文件夹,以实现代码重用。
- Bin部署不能用于Time Job,Service application, Event Receivers,Workflow等部署,只有运行在IIS work process的代码才能采用Bin部署。
详细的配置步骤:
1. 打开Visual Studio,在项目的属性窗口,将Assemby Deployment Target改成WebApplication。
2. 将Outout 路径改成目标SharePoint站点的Bin文件夹的路径。
3. 将下面图片里的部分添加到Package.Template.xml,注意修改对应的程序集以及命名空间的名称。
上面是图片,下面贴文字,方便复制。
<?xml version="1.0" encoding="utf-8"?>
<Solution xmlns="http://schemas.microsoft.com/sharepoint/">
<Assemblies>
<Assembly Location="xxx.dll"
DeploymentTarget="WebApplication">
<SafeControls>
<SafeControl
Assembly="$SharePoint.Project.AssemblyFullName$"
Namespace="xxx"
TypeName="*" Safe="True"/>
</SafeControls>
</Assembly>
</Assemblies>
</Solution>
4. 将下面的一段加到站点的web.config里
<securityPolicy>
[...]
<trustLevel name=”Full” policyFile=”internal”/>
</securityPolicy>
5. 在web.config里注释掉默认的权限级别,然后添加新的权限级别
<!--<trust level="WSS_Minimal" originUrl="" />-->
<trust level="Full" originUrl="" />
6. 第一次部署的时候需要选择Deploy,之后进行修改就不需要了,见下两步。
7. 如果只是修改前台页面的内容,右击项目,选择Quick Deploy,选择Copy to SharePoint Root (需要先安装CKSDEV),刷新页面,检查最新的结果。
8. 如果只是修改了code behind 文件,右击项目,选择Rebuild,刷新页面,检查最新的结果。
如果你想要将Bin部署切换到GAC部署,只需要将第一步的Assembly Deployment Target 改成GlobalAssemblyCache,以及第三步里的DeploymentTarget改成GlobalAssemblyCache即可。