用 SharePoint Server 2007和Windows Workflow Foundation开发工作流解决方案
工作流做了快一年了,都没时间去总结,看到这篇文章总结的很好,就找时间翻译了,呵呵,本人的英语不好,翻译不对的地方还请赐教。
源文章Developing Workflow Solutions with SharePoint Server 2007 and Windows Workflow Foundation
摘要:这篇文章描述用Visual Studio 在Microsoft Office SharePoint Server 2007上开发工作流实践。
作者:Daniel Odievich, 资深顾问,微软咨询服务
Alireza Etemad Mazaheri, 资深顾问,微软咨询服务
2008年4月
应用于:Microsoft Office SharePoint Server 2007, 2007 Microsoft Office System, Windows SharePoint Server 3.0, Windows Workflow Foundation
主要内容:
1. 介绍工作流开发
2. 用Windows SharePoint Services和SharePoint Server 作为开发平台
介绍工作流开发
Windows SharePoint Services 3.0和Windows Workflow Foundation为业务提供功能强大的工作流平台,可以设计既简单又任意复杂的业务流程。利用Microsoft Office SharePoint Designer 2007可以设计简单的工作流自动生成代码。有经验的开发人员可以用Visual Studio开发复杂的工作流集成到其他外部系统中。
这篇文章告诉你如何用Visual Studio创建复杂的工作流,提供了实际开发项目中的两个实例:顺序工作流和状态机工作流。
用Windows SharePoint Services和SharePoint Server 作为开发平台
Windows SharePoint Services 3.0和Microsoft Office SharePoint Server2007 常用于协作和内容发布,也可以提供简单和复杂的业务流程平台,从单个文件内容审批中审查和编辑一系列文件或交换外部在线业务(LOB)系统的信息。
用Windows SharePoint Services开发工作流宿主创建内容发送,审批和用Visual Studio开发工具开发自定义工作流。Windows Workflow Foundation提供工作流运行时,SharePoint列表和存放工作流数据的文档库列表。
你也可以使用InfoPath Form Services将自定义InfoPath 2007表单:创建工作流列表,提供工作流参数,显示工作流任务展现在浏览器中。
了解Windows Workflow Foundation
WF是编程模型,引擎和创建工作流应用程序的工具。使用WF,具体的业务流程可以采用可视化编程和具体的Activity活动来实现。WF提供了熟悉的编程方式如:If/else,并行执行,调用Web服务,发送邮件,运行代码,WF引擎提供工作流持续服务使工作流能跨过几天、几个月或者几年的长期业务流程的运转。
在Windows SharePoint Services 和SharePoint Server中使用Windows Workflow Foundation
用Windows SharePoint Services 和SharePoint Server可以让一个或多个工作流类型关联到任何的列表和文档库。工作流类型可以运行在列表和文档库中的每一项里。虽然你能关联多个工作流到一个列表或一个文档库里但是在指定的时间里你只能让每一项里运行一个实例。超过这限制,你可以提供唯一名称和更改工作流部署程序包的GUID形成不同版本的工作流程序集。参考其他文章,如Saving Workflow State and Upgrading Workflow Assemblies
手动通过SharePoint服务UI或自动创建或更改Item时注册工作流内容类型。具体的工作流关联是对于网站中的列表或文档库实例。完成工作流关联的话需要任务列表和工作流历史纪录列表(如果是用SharePoint服务UI可以自动创建)。如果你自定义站点,你可以使用下列的ListInstance元素在elementManifest.xml中定义工作流历史纪录列表:
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<ListInstance FeatureId="00bfea71-4ea5-48d4-a4ad-305cf7030140" TemplateType="140" Title="Workflow History" Url="Lists/Workflow History"/>
</Elements>
SharePoint 服务器在SharePoint Content数据库里把列表和文档库的工作流关联数据存储在
WorkflowAssociation表中,WorkflowAssociation表存储了工作流基本信息(把workflow.xml的GUID存储到BaseID列里),列表或文档库的GUID,任务列表的GUID,工作流历史纪录的GUID,网站的GUID,工作流历史纪录的自动清理日期和权限之间的关联。
通过使用稍微修改过的WF持续服务来实现Windows SharePoint Services 3.0自己的WF持续服务数据库,用二进制系列化创建了持续工作流实例,压缩以节省空间,然后存储到SharePoint Content数据库中workflow表里的InstanceData Image列中,与Metadata一起如:工作流实例ID,工作流关联ID,列表ID,列表项ID,网站ID,工作流持续的大小,最后活动日期和工作流状态。
工作流的历史纪录和任务列表是展现存储在SharePoint内容数据库里所有列表,列表项和文档的SharePoint对象规则。
定时器可以删除工作流历史纪录和60天前完成的工作流实例的相关任务列表(清理不删除完成工作的持续工作流实例),虽然你能通过SPWorkflowTemplate.AutoCleanupDays属性来调整期限,但是我们建议你不要修改它该设置,因为时间越长将导致很多事件存储在数据库中,让数据库明显变慢。
如果列表项从列表和文档库中被删除,那与它相关的列表项的所有持续工作流实例包括那些工作流和工作流历史列表项创造的任务都会被删除。
构造工作流项目
SharePoint Feature部署到SharePoint服务上的工作流模板里。任何Feature是通过创建描述Feature的xml文件将它们打包成解决方案包(.wsp 文件)部署到SharePoint服务器上。定时器可以提取文件,将工作流程序集注册到GAC里,发送其他文件到他们指定的服务器场中每台本地服务器上。
定义工作流的Feature并打包成解决方案时,创建了下列文件:
在不同文件里的GUIDs是很重要的值得注意。
注意:不要重复利用您在各种各样的嵌入Feature.xml和站点定义文件中任何SharePoint GUIDs。可以 用Guidgen.exe创建您的GUIDs。
定义在manifest.xml中的解决方案的GUID是部署.wsp解决方案包的唯一钥匙;.wsp文件的文件名是备份的唯一钥匙。Guid和文件名只能部署一次在SharePoint中。如果你没有移除以前的部署包,你是不能部署,你重新编译的项目和打包.wsp解决方案包的,当你要更新工作流的程序集时这个约束很重要。这点说明了你必须为.wsp解决方案包更改Guid和文件名。需要了解更详细信息请参照Saving Workflow State and Upgrading Workflow Assemblies 。
在Feature.xml文件中定义Feature ID 是用来控制Feature的。你可以通过Feature ID采用Stsadm.exe命令来安装,反安装,激活,反激活你的Feature或者用Onet.xml自动为自定义网站提供你的Feature。
在workflow.xml文件中定义工作流ID 是用来控制工作流的。通过工作流ID可以查看已经安装的工作流创建SPWorkflowAssociation对象自动提供或启动工作流编程实例。为了方便起见,我们建议在源文件中创建固定的GUID.
部署到SharePoint上的Feature其安装路径是(C:"Program Files"Common Files"Microsoft Shared"web server extensions"12"template),如下列例子:
你可以创建如下的工作流结构:
路径和文件 |
目的 |
"Properties AssemblyInfo.cs |
包含程序集的信息,例如:版本和版权 |
"Template "Features "MyCustomWorkflow feature.xml |
描述与workflow.xml相关的工作流的Feature |
Workflow.xml |
描述工作流;提供相关的MyCustomWorkflow.cs和强名称程序集 |
"Layouts "MyCustomWorkflow MyCustomWorkflowForm.aspx |
为工作流活动自定义asp.net页面;打包成.wsp解决方案 |
"XML "MyCustomWorkflow MyCustomWorkflowSupportingFile.xml |
工作流具体数据;也打包成.wsp解决方案 |
"Deployment manifest.xml |
描述.wsp解决方案的内容后产生的文件 |
package.ddf |
在这个项目中用Makecab.exe将源文件打包成.wsp解决方案 |
"Workflow Provisioning Handler feature.xml |
描述用SPFeatureReceiver类提供工作流的Feature |
FeatureProvisioning.cs |
SPFeatureReceiver类提供工作流的Feature的代码 |
CreateSolutionPackage.bat |
创建.wsp解决方案的批处理文件 |
MyCustomWorkflow.cs MyCustomWorkflow.designer.cs MyCustomWorkflow.layout MyCustomWorkflow.rules |
工作流的代码 |
Setup.bat |
安装.wsp解决方案的批处理文件 |
MyCustomWorkflow.snk |
强名称程序集 |
写调用Makecab.exe处理package.ddf的批处理文件,然后可以调用批处理文件处理事件;你也可以采用Stsadm.exe自动部署或重新部署该项目;或者你用vs2008开发可以直接部署。
用SharePoint对象模型创建关联工作流
工作流关联过程分三个步骤:
1、通过解决方案包将包含Workflow.xml和工作流程序集的工作流Feature部署到所有前端Web服务器上。
2、在顶级网站集,顶级网站或子网站里激活工作流Feature。
3、创建列表,文档库,内容类型和工作流Feature的关联,指定工作流初始化和更新的选项。
最后一步关联到安装了工作流的列表和文档库可以要发比较长的时间。例如,如果你使用自定义网站那么可以提供可以协作和提交复杂文档,考虑通过SPFeatureReceiver.FeatureActivated事件和下列的编程步骤提供的工作流过程:
1、创建工作流宿主的列表和文档库相关的SPList对象。
2、创建提交任务列表的SPList对象。
3、创建工作流历史纪录的SPList对象。
4、用Workflow.xml中的工作流ID创建SPWorkflowTemplated对象。
5、创建SPWorkflowAssociation对象连接SPWorkflowTemplated对象和包含任务列表、历史纪录的SPList对象。
6、在第一步的SPList对象中添加SPWorkflowAssociation对象。
相关的代码如下:
public void ProvisionWorkflow(SPWeb web)
{
using (web)
{
//Bind to lists.
SPList approvalsList = web.Lists["Your Approval List Name Goes Here"];
SPList approvalTasksList = web.Lists["Task List"];
SPList workflowHistoryList = web.Lists["Workflow History"];
//92EF6E3C-8DC1-41bc-AE1D-C5A04A06E028 is the workflow GUID
//from workflow.xml"<Elements>"<Workflow>"[ID].
SPWorkflowTemplate workflowTemplate =
web.WorkflowTemplates[new Guid("92EF6E3C-8DC1-41bc-AE1D-C5A04A06E028")];
//Create workflow association.
SPWorkflowAssociation workflowAssociation =
SPWorkflowAssociation.CreateListAssociation(workflowTemplate,
workflowTemplate.Description, approvalTasksList,
workflowHistoryList);
//Set workflow options.
workflowAssociation.AllowManual = true;
workflowAssociation.AutoStartChange = true;
workflowAssociation.AutoStartCreate = false;
//Add workflow association.
SPWorkflowAssociation workflowAssociationInList =
approvalsList.AddWorkflowAssociation(workflowAssociation);
}
return;
}
调试部署问题
如果你的部署包没有包含自定义代码,那么调试任何部署的问题就像是在分析统一日志系统(ULS)的日志。通过日志来帮助你查询,提高Feature的基础结构和布局的详细分类的操作日志级别。
如果你的工作流解决方案包里有使用SPFeatureReceiver派生类来配置它的话,在部署和移除解决方案包期间,你必须调试它。这是最简单的调试方法可以避免附加一个调试器一起将事件代码记录到所有事件日志、平台文件和ULS日志中。
然而,如果你要使用调试器,你必须附加到宿主进程运行SPFeatureReceiver对象。根据情况,宿主进程可以宿主到管理中心的W3wp.exe,你的网站的W3wp.exe,或者Stsadm.exe中。如果你通过Stsadm命令行激活Feature,那么你可以在Visual Studio项目属性中配置Stsadm.exe作为调试启动过程中适当的命令行参数。
Visual Studio 2008测试驱动开发提供了另外一些高级选项供你调试你的代码。Visaul Studio 2008测试宿主进程可以宿主到驱动SPFeatureReceiver对象的单元测试。因为SPFeatureReceiver事件需要一个专门的SPFeatureReceiverProperties对象,所以你需要将你提供的代码插入到不同的输入程序中。
namespace MOSSWFSample.Workflow.StateMachine
{
public class StateMachineWorkflowFeatureReceiver: SPFeatureReceiver
{
[SharePointPermission(SecurityAction.LinkDemand,
ObjectModel = true)]
public override void
FeatureActivated(SPFeatureReceiverProperties properties)
{
if (properties == null)
{
return;
}
this.OnActivated(properties);
}
public void OnActivated(SPFeatureReceiverProperties properties)
{
SPWeb web = (SPWeb)properties.Feature.Parent;
ProvisionWorkflow(web);
}
public void ProvisionWorkflow(SPWeb web)
{
//Provision your workflow as you see fit.
...
}
}
}
在前面的示例中,你提供的代码要求指向站点的仅一个简单的SPWeb对象。通过使用Visual Studio 2008测试管理器你可以写如下的单元测试并执行它,它将自动附加到调试器中。
namespace MOSSWFSample.Workflow.StateMachine.UnitTest
{
[TestMethod()]
public void ProvisionWorkflowTest()
{
StateMachineWorkflowFeatureReceiver target =
new StateMachineWorkflowFeatureReceiver();
SPSite site;
SPWeb web;
//Bind to the site where you are testing provisioning code.
site = new
SPSite("http://developmentserver/sites/workflowtest");
using (site)
{
web = site.RootWeb;
using (web)
{
target.ProvisionWorkflow(web);
}
}
Assert.IsTrue(true,
"ProvisionWorkflow did not throw any exceptions.");
}
}
}
调试工作流代码
调试工作流代码中,你需要增加日志级别以确保你能看到所有可适用的活动。你也应该完成地利用你的代码,然后附加到调试器中。以下部分较详细地谈论每项任务。
增加日志级别
任何SharePoint组件都是通过Windows SharePoint Services Tracing 服务(SPTrace)将WF日志写道ULS日志中。如果工作流引擎启动失败,那么错误信息将会出现在该日志中。
到管理中心配置日志,点击选项,接着点击诊断记录,选择一种日志类型:
工作流日志类型 |
目的 |
工作流Features |
记录Workflow.asmx页面的web服务活动(工作流的Soap) |
工作流基础结构 |
记录所有其他工作流服务活动(例如成功或不成功的事件交付和异常) |
当你开发工作流解决方案时,我们建议你为最小临界事件报表的跟踪日志提高日志级别,写到"详细"字段中。
导航代码
尽可能多的导航你的工作流:状态转换、事件驱动活动、创建和完成的任务、发送邮件、错误句柄等等。将事件记录到事件日志、平台文件、数据库(例如,通过Microsoft Enterprise Library)还有工作流的历史记录中。考虑记录什么日志,因为你提供越多代码如何运行的信息,在调试部署和管理产品环境时看代码就会越简单。
调试代码
调试工作流,将工作流附加到SharePoint站点的w3wp.exe进程中,(在Visual Studio 2008中,附加值选择Workflow。)
在Visual Studio 2008中如果没有触发断点,点击工具和点击选项显示选项对话框,展开调试和常规节点,并清除“要求源文件正确匹配原来版本”的选项,(调试信息里没有工作流程序集的PDB文件。)
当你调试工作流时,没必要重新部署整个工作流的Feature。只需简单地把工作流程序集重新拉到GAC中然后重启IIS后你就可以启动新的工作流示例和代码。或者你不需要改变代码结构,你可以继续运行前个版本的工作流示例。
该文章还未翻译完成,源文章Developing Workflow Solutions with SharePoint Server 2007 and Windows Workflow Foundation