<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>『听风且吟』技术版 &#187; SharePoint工作流开发点滴</title>
	<atom:link href="http://coding.windstyle.cn/category/sharepoint/sharepoint-workflow-tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://coding.windstyle.cn</link>
	<description>Windie Chai&#039;s technique blog</description>
	<lastBuildDate>Tue, 07 Sep 2010 06:10:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>SharePoint工作流开发点滴(7) &#8211; 用代码完成任务</title>
		<link>http://coding.windstyle.cn/2009/05/11/sharepoint-workflow-development-tips-7-completing-task-using-code/</link>
		<comments>http://coding.windstyle.cn/2009/05/11/sharepoint-workflow-development-tips-7-completing-task-using-code/#comments</comments>
		<pubDate>Mon, 11 May 2009 00:29:22 +0000</pubDate>
		<dc:creator>windie</dc:creator>
				<category><![CDATA[SharePoint工作流开发点滴]]></category>
		<category><![CDATA[Workflow]]></category>
		<category><![CDATA[AlterTask]]></category>
		<category><![CDATA[SPWorkflowTask]]></category>
		<category><![CDATA[SPWorkflowTaskCollection]]></category>
		<category><![CDATA[任务]]></category>

		<guid isPermaLink="false">http://coding.windstyle.cn/?p=142</guid>
		<description><![CDATA[我们知道，SharePoint的工作流是通过任务来驱动的，在真实场景中，我们可能会希望工作流的任务处理方式能够更加灵活，比如批量处理、通过Office Communicator等IM软件处理任务等等，这时候我们就需要以编程的方式在外部完成任务。 按照正常的想法，SharePoint的任务列表也是一个SPList，所以我们会这样尝试： SPSite site = new SPSite(&#34;http://windstyle&#34;); SPWeb web = site.OpenWeb(); web.AllowUnsafeUpdates = true; SPList taskList = web.Lists[&#34;任务&#34;]; SPListItem task = taskList.Items[0]; task[&#34;状态&#34;] = &#34;已完成&#34;; task[&#34;Completed&#34;] = true; task.Update(); web.AllowUnsafeUpdates = false; 执行之后，发现任务确实已经被设置为已完成状态，但工作流却没有继续执行，也就是说，工作流的OnTaskChanged活动并没有捕捉到任务被更改的事件。 其实SharePoint对象模型提供了更改工作流任务属性的方法，即SPWorkflowTask.AlterTask，此方法不仅能够更改工作流任务的属性，还会将这一更改通知相应的工作流，使得相应的工作流能够继续执行。 此方法的用法也很简单： SPSite site = new SPSite(&#34;http://windstyle&#34;); SPWeb web = site.OpenWeb(); SPList doclib = web.Lists[&#34;共享文档&#34;]; SPListItem doc = doclib.Items[0]; SPWorkflowTaskCollection tasks = doc.Workflows[doc.Workflows.Count-1].Tasks; //找到具体的SPWorkflowTask Hashtable ht = new Hashtable(); ht.Add(SPBuiltInFieldId.FormData, SPWorkflowStatus.Completed); ht.Add(SPBuiltInFieldId.Completed, true); //将任务设置为完成状态 ht.Add(SPBuiltInFieldId.TaskStatus, &#34;已完成&#34;);//将任务在任务列表中的显示状态设置为“已完成” ht.Add(SPBuiltInFieldId.PercentComplete, 1); //将任务在任务列表中的完成百分比设置为“100%” ht.Add(SPBuiltInFieldId.WorkflowOutcome, &#34;Some output infomation&#34;); //设置任务的输出消息，等同于使用Visual Studio设计工作流 时，CompleteWorkflow活动的TaskOutput属性 SPWorkflowTask.AlterTask(tasks[0], ht, true); 从上段代码可以看出，以编程的方式来完成任务并不困难，其中比较麻烦的是如何找到正确的工作流任务。因为SPListItem.Workflows可能包含不止一个SPWorkflow，这些 SPWorkflow可能源于同一个SPWorkflowTemplate，也可能源于不同的SPWorkflowTemplate。而且还可能包含源于同一个SPWorkflowTemplate的多个SPWorkflow，当然，我们知道，同一个工作流模板在同一个SPListItem上只能启动一个工作流实例，所以这些SPWorkflow中只有一个的IsCompleted属性为true。 所以在编写代码来完成工作流任务时，注意获取到正确的工作流任务，然后就可以轻松的完成任务了。 Related posts [...]]]></description>
			<content:encoded><![CDATA[<p>我们知道，SharePoint的工作流是通过任务来驱动的，在真实场景中，我们可能会希望工作流的任务处理方式能够更加灵活，比如批量处理、通过Office Communicator等IM软件处理任务等等，这时候我们就需要以编程的方式在外部完成任务。<span id="more-142"></span></p>
<p>按照正常的想法，SharePoint的任务列表也是一个SPList，所以我们会这样尝试：</p>
<pre class="brush: csharp;">
SPSite site = new SPSite(&quot;http://windstyle&quot;);
SPWeb web = site.OpenWeb();
web.AllowUnsafeUpdates = true;
SPList taskList = web.Lists[&quot;任务&quot;];
SPListItem task = taskList.Items[0];
task[&quot;状态&quot;] = &quot;已完成&quot;;
task[&quot;Completed&quot;] = true;
task.Update();
web.AllowUnsafeUpdates = false;
</pre>
<p>执行之后，发现任务确实已经被设置为已完成状态，但工作流却没有继续执行，也就是说，工作流的OnTaskChanged活动并没有捕捉到任务被更改的事件。</p>
<p>其实SharePoint对象模型提供了更改工作流任务属性的方法，即SPWorkflowTask.AlterTask，此方法不仅能够更改工作流任务的属性，还会将这一更改通知相应的工作流，使得相应的工作流能够继续执行。</p>
<p>此方法的用法也很简单：</p>
<pre class="brush: csharp;">SPSite site = new SPSite(&quot;http://windstyle&quot;);
SPWeb web = site.OpenWeb();
SPList doclib = web.Lists[&quot;共享文档&quot;];
SPListItem doc = doclib.Items[0];
SPWorkflowTaskCollection tasks = doc.Workflows[doc.Workflows.Count-1].Tasks; //找到具体的SPWorkflowTask
Hashtable ht = new Hashtable();
ht.Add(SPBuiltInFieldId.FormData, SPWorkflowStatus.Completed);
ht.Add(SPBuiltInFieldId.Completed, true); //将任务设置为完成状态
ht.Add(SPBuiltInFieldId.TaskStatus, &quot;已完成&quot;);//将任务在任务列表中的显示状态设置为“已完成”
ht.Add(SPBuiltInFieldId.PercentComplete, 1); //将任务在任务列表中的完成百分比设置为“100%”
ht.Add(SPBuiltInFieldId.WorkflowOutcome, &quot;Some output infomation&quot;); //设置任务的输出消息，等同于使用Visual Studio设计工作流 时，CompleteWorkflow活动的TaskOutput属性
SPWorkflowTask.AlterTask(tasks[0], ht, true);</pre>
<p>从上段代码可以看出，以编程的方式来完成任务并不困难，其中比较麻烦的是如何找到正确的工作流任务。因为SPListItem.Workflows可能包含不止一个SPWorkflow，这些 SPWorkflow可能源于同一个SPWorkflowTemplate，也可能源于不同的SPWorkflowTemplate。而且还可能包含源于同一个SPWorkflowTemplate的多个SPWorkflow，当然，我们知道，同一个工作流模板在同一个SPListItem上只能启动一个工作流实例，所以这些SPWorkflow中只有一个的IsCompleted属性为true。</p>
<p>所以在编写代码来完成工作流任务时，注意获取到正确的工作流任务，然后就可以轻松的完成任务了。</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://coding.windstyle.cn/2007/08/01/moss-multi-level-approval-workflow-sequential-and-conditionedactivitygroup-edition/" title="MOSS多级审批工作流【Sequential+ConditionedActivityGroup版】v1.1 (2007-08-01)">MOSS多级审批工作流【Sequential+ConditionedActivityGroup版】v1.1</a> (31)</li>
	<li><a href="http://coding.windstyle.cn/2007/03/21/developing-loopable-workflow-using-sharepoint-designer/" title="利用SharePoint Designer开发可循环工作流 (2007-03-21)">利用SharePoint Designer开发可循环工作流</a> (24)</li>
	<li><a href="http://coding.windstyle.cn/2007/08/20/sharepoint-workflow-tips-6-you-cannot-edit-my-task/" title="SharePoint工作流开发点滴(6) -“我的任务不给你看” (2007-08-20)">SharePoint工作流开发点滴(6) -“我的任务不给你看”</a> (61)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2009/05/11/sharepoint-workflow-development-tips-7-completing-task-using-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SharePoint工作流开发点滴(6) -“我的任务不给你看”</title>
		<link>http://coding.windstyle.cn/2007/08/20/sharepoint-workflow-tips-6-you-cannot-edit-my-task/</link>
		<comments>http://coding.windstyle.cn/2007/08/20/sharepoint-workflow-tips-6-you-cannot-edit-my-task/#comments</comments>
		<pubDate>Mon, 20 Aug 2007 09:38:00 +0000</pubDate>
		<dc:creator>windie</dc:creator>
				<category><![CDATA[SharePoint工作流开发点滴]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Workflow]]></category>
		<category><![CDATA[任务]]></category>
		<category><![CDATA[工作流]]></category>
		<category><![CDATA[权限]]></category>

		<guid isPermaLink="false">http://863388</guid>
		<description><![CDATA[一直以来都被MOSS的工作流权限问题所困扰. 我们虽然将任务分配给了某人,但事实上,所有在任务列表中有编辑权限的用户都可以编辑该任务. 而我们并不希望用户能够看到不属于自己的任务. 我曾经尝试过采用以下两种方法解决这一问题,未果. 1.更改任务列表的视图. 通常我们会把工作流任务分配给某人或者某组,所以我的想法是将任务列表的&#8221;我的任务&#8221;视图和&#8221;按我的用户组&#8221;视图合并为一个新的&#8221;所有我的任务&#8221;视图; 设置&#8221;所有我的任务&#8221;视图为默认视图; 删除其余视图; 取消用户创建视图的权限; 看起来不错,但是我连第一步都没能实现. 2.定制一个EventHandler 记得园子里的一个朋友写过一篇通过开发EventHandler来控制工作流权限的文章. 思路是为任务列表定制一个EventHandler,使任务列表在增加项目时可以自动更改该项目的权限. 通过定制EventHandler确实可以实现任务的权限分配,但是会引发另外的问题,譬如说,我的工作流中用OnTaskChanged活动来捕捉任务的变更.但是因为在任务创建之后EventHandler马上对其进行权限修改,所以导致工作流会发生一个小小的错误. 不过奇怪的是,虽然在文档库中显示该工作流发生了错误,但事实上流转还是正常的. 我一直固执的认为任务列表的权限应该是在MOSS中配置,而不应该在工作流内部做判断,后来,我终于发现我错了. 我们使用CreateTask活动来创建任务,CreateTask活动有一个HybridDictionary类型的属性叫做SpecialPermissions. 这个属性表示该任务的&#8221;特别权限&#8221;,如果指定了&#8221;特别权限&#8221;,那么创建的任务就不再继承任务列表的权限了.所以我们可以在创建任务之前为其指定这个&#8221;特别权限&#8221;. 1.新建一个全局的Contact对象用来存储分配对象 Contact assignee = default(Contact); 2.在onWorkflowActivated的Invoked事件中从初始化表单中获取assignee对象 assignee = Contact.FromName(init.contact[0].DisplayName, workflowProperties.Web); 3.在属性面板中将createTask的SpecialPermissions属性绑定到新的specialPermissions对象 4.编写createTask的MethodInvoking方法 private void createTask1_MethodInvoking(object sender, EventArgs e) { &#160; &#160; taskId = Guid.NewGuid(); &#160; &#160; taskProperties.AssignedTo = assignee.LoginName; &#160; &#160; //判断分配对象是否用户 &#160; &#160; if (assignee.IsSPUser) &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>一直以来都被MOSS的工作流权限问题所困扰.</p>
<p>我们虽然将任务分配给了某人,但事实上,所有在任务列表中有编辑权限的用户都可以编辑该任务.</p>
<p>而我们并不希望用户能够看到不属于自己的任务.<span id="more-717"></span></p>
<p>我曾经尝试过采用以下两种方法解决这一问题,未果.</p>
<h4>1.更改任务列表的视图.</h4>
<ol>
<li>通常我们会把工作流任务分配给某人或者某组,所以我的想法是将任务列表的&#8221;我的任务&#8221;视图和&#8221;按我的用户组&#8221;视图合并为一个新的&#8221;所有我的任务&#8221;视图;</li>
<li>设置&#8221;所有我的任务&#8221;视图为默认视图;</li>
<li>删除其余视图;</li>
<li>取消用户创建视图的权限;</li>
</ol>
<p>看起来不错,但是我连第一步都没能实现.</p>
<h4>2.定制一个EventHandler</h4>
<p>记得园子里的一个朋友写过一篇通过开发EventHandler来控制工作流权限的文章.</p>
<p>思路是为任务列表定制一个EventHandler,使任务列表在增加项目时可以自动更改该项目的权限.</p>
<p>通过定制EventHandler确实可以实现任务的权限分配,但是会引发另外的问题,譬如说,我的工作流中用OnTaskChanged活动来捕捉任务的变更.但是因为在任务创建之后EventHandler马上对其进行权限修改,所以导致工作流会发生一个小小的错误.</p>
<p>不过奇怪的是,虽然在文档库中显示该工作流发生了错误,但事实上流转还是正常的.</p>
<p>我一直固执的认为任务列表的权限应该是在MOSS中配置,而不应该在工作流内部做判断,后来,我终于发现我错了.</p>
<p>我们使用<strong>CreateTask</strong>活动来创建任务,CreateTask活动有一个<strong>HybridDictionary</strong>类型的属性叫做<strong>SpecialPermissions</strong>.</p>
<p>这个属性表示该任务的&#8221;特别权限&#8221;,如果指定了&#8221;特别权限&#8221;,那么创建的任务就不再继承任务列表的权限了.所以我们可以在创建任务之前为其指定这个&#8221;特别权限&#8221;.</p>
<h3>1.新建一个全局的Contact对象用来存储分配对象</h3>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Contact assignee = default(Contact);</div></div>
<h3>2.在onWorkflowActivated的Invoked事件中从初始化表单中获取assignee对象</h3>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">assignee = Contact.FromName(init.contact[0].DisplayName, workflowProperties.Web);</div></div>
<h3>3.在属性面板中将createTask的SpecialPermissions属性绑定到新的specialPermissions对象</h3>
<h3>4.编写createTask的MethodInvoking方法</h3>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">private void createTask1_MethodInvoking(object sender, EventArgs e)<br />
{<br />
&nbsp; &nbsp; taskId = Guid.NewGuid();<br />
&nbsp; &nbsp; taskProperties.AssignedTo = assignee.LoginName;<br />
&nbsp; &nbsp; //判断分配对象是否用户<br />
&nbsp; &nbsp; if (assignee.IsSPUser)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; //为其添加&quot;参与讨论&quot;的权限.<br />
&nbsp; &nbsp; &nbsp; &nbsp; specialPermissions.Add(assignee.LoginName, SPRoleType.Contributor);<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; //判断分配对象是否用户组<br />
&nbsp; &nbsp; if(assignee.IsCollection)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SPGroup group = workflowProperties.Web.Groups[assignee.DisplayName];<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //为组内每一个用户添加&quot;参与讨论&quot;的权限.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (SPUser user in group.Users)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; specialPermissions.Add(user.LoginName, SPRoleType.Contributor);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; catch { }<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>因为默认的&#8221;参与讨论&#8221;权限就可以编辑工作流任务,所以为任务指定了&#8221;特别权限&#8221;之后,该任务将对不在SpecialPermissions中的用户不可见,这正是我们所需要的.</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://coding.windstyle.cn/2007/07/20/programming-wf-22-basic-activities-codeactivity/" title="《WF编程》系列之22 &#8211; 基本活动:CodeActivity (2007-07-20)">《WF编程》系列之22 &#8211; 基本活动:CodeActivity</a> (4)</li>
	<li><a href="http://coding.windstyle.cn/2007/03/24/programming-wf-1-helloworkflow-and-create-workflow-solution/" title="《WF编程》系列之1 &#8211; Hello,Workflow &amp; 创建工作流解决方案 (2007-03-24)">《WF编程》系列之1 &#8211; Hello,Workflow &amp; 创建工作流解决方案</a> (15)</li>
	<li><a href="http://coding.windstyle.cn/2009/02/12/workflow-scalability-and-performance-in-windows-sharepoint-services-3-0-paper-released/" title="Workflow Scalability and Performance in Windows SharePoint Services 3.0 白皮书发布 (2009-02-12)">Workflow Scalability and Performance in Windows SharePoint Services 3.0 白皮书发布</a> (0)</li>
	<li><a href="http://coding.windstyle.cn/2008/01/30/programming-wf-38-dependency-property/" title="《WF编程》系列之38 &#8211; 依赖属性 (2008-01-30)">《WF编程》系列之38 &#8211; 依赖属性</a> (6)</li>
	<li><a href="http://coding.windstyle.cn/2007/01/08/sharepoint-workflow-tips-2-attention-of-first-sharepoint-workflow-development/" title="SharePoint工作流开发点滴(2)：开发第一个SharePiont工作流: HelloWorldSequential 的注意事项 (2007-01-08)">SharePoint工作流开发点滴(2)：开发第一个SharePiont工作流: HelloWorldSequential 的注意事项</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2007/08/20/sharepoint-workflow-tips-6-you-cannot-edit-my-task/feed/</wfw:commentRss>
		<slash:comments>61</slash:comments>
		</item>
		<item>
		<title>SharePoint工作流开发点滴(5) &#8211; &quot;启动时失败&quot;的查错方法</title>
		<link>http://coding.windstyle.cn/2007/05/17/sharepoint-workflow-tips-5-fix-errorfaild-on-load/</link>
		<comments>http://coding.windstyle.cn/2007/05/17/sharepoint-workflow-tips-5-fix-errorfaild-on-load/#comments</comments>
		<pubDate>Wed, 16 May 2007 19:58:00 +0000</pubDate>
		<dc:creator>windie</dc:creator>
				<category><![CDATA[SharePoint工作流开发点滴]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Workflow]]></category>
		<category><![CDATA[工作流]]></category>

		<guid isPermaLink="false">http://750009</guid>
		<description><![CDATA[很多朋友在使用Visual Studio开发工作流时都遇到过工作流&#8221;启动时失败&#8221;的错误,我把我遇到这种情况时的查错方法和大家分享一下,希望对大家有所帮助,也希望大家可以告诉我更好的方法. 首先在OnWorkflowActivated方法中设置断点来调试,检查断点是否可以成功暂停,如果可以,则可以再检查一下OnWorkflowActivated中的逻辑代码. 如果断点处不停止就出现了&#8221;启动时失败&#8221;的错误,也就是说错误发生在工作流激活之前,这种情况就可以排除代码的错误,检查infopath表单和workflow.xml即可. infopath表单的配置较为麻烦,甚至连命名都是有规则的,需要多加注意. 另外,如果工作流包含关联表单(Association),那么初始化表单(Instantiation)中必须包含关联表单中定义的域. 如果还是找不出错误的来源,那么,记住工作流启动时的时间,检查SharePoint日志吧.日志的目录是:$:\Program Files\Common Files\Microsoft Shared\web server extensions\12\LOGS 最后再引用一句Kaneboy的签名: &#8220;玩SharePoint就像是魔术,你不知道它为什么工作,也不知道它为什么不工作.&#8221; Related posts 《WF编程》系列之20 &#8211; 触发事件与调用方法:宿主的实现 (15) SharePoint 2010 开发资源 (0) 《WF编程》系列之14 &#8211; 工作流编写方式:结合代码与XAML (3) WF 4.0 beta1的跟踪配置 (1) InfoPath开发实战（1）：引言 (0)]]></description>
			<content:encoded><![CDATA[<p>很多朋友在使用Visual Studio开发工作流时都遇到过工作流&#8221;启动时失败&#8221;的错误,我把我遇到这种情况时的查错方法和大家分享一下,希望对大家有所帮助,也希望大家可以告诉我更好的方法.<span id="more-740"></span></p>
<p>首先在OnWorkflowActivated方法中设置断点来调试,检查断点是否可以成功暂停,如果可以,则可以再检查一下OnWorkflowActivated中的逻辑代码.</p>
<p>如果断点处不停止就出现了&#8221;启动时失败&#8221;的错误,也就是说错误发生在工作流激活之前,这种情况就可以排除代码的错误,检查infopath表单和workflow.xml即可.</p>
<p>infopath表单的配置较为麻烦,甚至连命名都是有规则的,需要多加注意.</p>
<p>另外,如果工作流包含关联表单(Association),那么初始化表单(Instantiation)中必须包含关联表单中定义的域.</p>
<p>如果还是找不出错误的来源,那么,记住工作流启动时的时间,检查SharePoint日志吧.日志的目录是:$:\Program Files\Common Files\Microsoft Shared\web server extensions\12\LOGS</p>
<p>最后再引用一句Kaneboy的签名:</p>
<p>&#8220;玩SharePoint就像是魔术,你不知道它为什么工作,也不知道它为什么不工作.&#8221;</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://coding.windstyle.cn/2007/07/17/programming-wf-20-raise-events-and-invoke-method-implement-host/" title="《WF编程》系列之20 &#8211; 触发事件与调用方法:宿主的实现 (2007-07-17)">《WF编程》系列之20 &#8211; 触发事件与调用方法:宿主的实现</a> (15)</li>
	<li><a href="http://coding.windstyle.cn/2009/11/04/sharepoint-2010-developer-resources/" title="SharePoint 2010 开发资源 (2009-11-04)">SharePoint 2010 开发资源</a> (0)</li>
	<li><a href="http://coding.windstyle.cn/2007/04/25/programming-wf-14-workflow-authoring-mode-combile-code-and-xaml/" title="《WF编程》系列之14 &#8211; 工作流编写方式:结合代码与XAML (2007-04-25)">《WF编程》系列之14 &#8211; 工作流编写方式:结合代码与XAML</a> (3)</li>
	<li><a href="http://coding.windstyle.cn/2009/06/22/workflow-tracking-profiles-in-net-4-0-beta-1/" title="WF 4.0 beta1的跟踪配置 (2009-06-22)">WF 4.0 beta1的跟踪配置</a> (1)</li>
	<li><a href="http://coding.windstyle.cn/2009/01/16/infopath-developing-practice-1-intro/" title="InfoPath开发实战（1）：引言 (2009-01-16)">InfoPath开发实战（1）：引言</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2007/05/17/sharepoint-workflow-tips-5-fix-errorfaild-on-load/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>SharePoint工作流开发点滴(4) &#8211; 工作流中的自定义类与内部错误</title>
		<link>http://coding.windstyle.cn/2007/02/07/sharepoint-workflow-tips-4-workflow-internal-error-and-custom-class/</link>
		<comments>http://coding.windstyle.cn/2007/02/07/sharepoint-workflow-tips-4-workflow-internal-error-and-custom-class/#comments</comments>
		<pubDate>Tue, 06 Feb 2007 19:10:00 +0000</pubDate>
		<dc:creator>windie</dc:creator>
				<category><![CDATA[SharePoint工作流开发点滴]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Workflow]]></category>
		<category><![CDATA[工作流]]></category>
		<category><![CDATA[序列化]]></category>
		<category><![CDATA[持久性]]></category>
		<category><![CDATA[表单]]></category>
		<category><![CDATA[钝化]]></category>

		<guid isPermaLink="false">http://643180</guid>
		<description><![CDATA[最近在开发SharePoint工作流总是发生一个错误：工作流开始之后便显示“已完成”或者开始之后报错“内部错误”。查看当时的日志,发现下面的段落： 02/06/2007 10:31:03.92&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; w3wp.exe (0&#215;0758)&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0x0F3C&#160;&#160;&#160;&#160;&#160;&#160;&#160; Windows SharePoint Services&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Workflow Infrastructure&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 72eo&#160;&#160;&#160;&#160;&#160;&#160;&#160; Unexpected&#160;&#160;&#160;&#160;&#160;&#160; &#160; DehydrateInstance: System.Runtime.Serialization.SerializationException: 在分析完成之前就遇到流结尾。 在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() 在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream) 在 System.Workflow.ComponentModel.Activity.Load(Stream stream, Activity outerActivity, IFormatter formatter)&#8230;&#160;&#160;&#160;&#160;&#160;&#160; &#160; 02/06/2007 10:31:03.92*&#160;&#160;&#160;&#160;&#160;&#160;&#160; w3wp.exe [...]]]></description>
			<content:encoded><![CDATA[<p>最近在开发SharePoint工作流总是发生一个错误：工作流开始之后便显示“已完成”或者开始之后报错“内部错误”。<span id="more-767"></span>查看当时的日志,发现下面的段落：</p>
<blockquote><p>02/06/2007 10:31:03.92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w3wp.exe (0&#215;0758)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>0x0F3C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows SharePoint Services&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Workflow Infrastructure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 72eo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unexpected&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</p>
<p>DehydrateInstance: System.Runtime.Serialization.SerializationException: 在分析完成之前就遇到流结尾。</p>
<p>在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()</p>
<p>在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)</p>
<p>在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)</p>
<p>在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)</p>
<p>在 System.Workflow.ComponentModel.Activity.Load(Stream stream, Activity outerActivity, IFormatter formatter)&#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</p>
<p>02/06/2007 10:31:03.92*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w3wp.exe (0&#215;0758)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</p>
<p>0x0F3C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows SharePoint Services&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Workflow Infrastructure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 72eo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unexpected&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;</p>
<p>在 System.Workflow.ComponentModel.Activity.Load(Stream stream, Activity outerActivity)</p>
<p>在 System.Workflow.Runtime.Hosting.WorkflowPersistenceService.RestoreFromDefaultSerializedForm(Byte[] activityBytes, Activity outerActivity)</p>
<p>在 Microsoft.SharePoint.Workflow.SPWinOePersistenceService.LoadWorkflowInstanceState(Guid instanceId)</p>
<p>在 System.Workflow.Runtime.WorkflowRuntime.InitializeExecutor(Guid instanceId, CreationContext context, WorkflowExecutor executor, WorkflowInstance workflowInstance)</p>
<p>在 System.Workflow.Runtime.WorkflowRuntime.Load(Guid key, CreationContext context, WorkflowInstance workflowInstance) 在 System.Workflow.Runtime.WorkflowRuntime.GetWorkflow(Guid instanceId)</p>
<p>在 Microsoft.SharePoint.Workflow.SPWinOeHostServices.DehydrateInstance(SPWorkflowInstance wo&#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</p>
<p>02/06/2007 10:31:03.92*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w3wp.exe (0&#215;0758)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</p>
<p>0x0F3C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows SharePoint Services&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Workflow Infrastructure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 72eo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unexpected&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;rkflow)</p>
<p>02/06/2007 10:31:03.93&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w3wp.exe (0&#215;0758)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</p>
<p>0x0F3C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows SharePoint Services&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Workflow Infrastructure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 88xr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unexpected&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WinWF Internal Error, terminating workflow Id# 472dae03-5465-4f04-876f-d4cc4caa902a</p></blockquote>
<p>&nbsp;</p>
<p>看里边最长的一段中文描述：“在分析完成之前就遇到流结尾”，如果是SharePoint英文版,这段错误信息应该是“End of Stream encountered before parsing was completed”。</p>
<p>也就是说Workflow Runtime根本就没有完整的分析完整个流程。</p>
<p>再看这句中文之前的英文：“DehydrateInstance: System.Runtime.Serialization.SerializationException”。</p>
<p>原来工作流是在钝化实例的时候发生了序列化异常。</p>
<p>回想一下工作流的持久性，Workflow Runtime会把空闲的工作流数据序列化为XML形式，然后把工作流实例从内存中清除，等到需要的时候再将其反序列化加载到内存。</p>
<p>会不会是因为我在工作流项目中添加了自定义类，而这个类又不支持序列化，所以导致工作流序列化失败？</p>
<p>在工作流中使用InfoPath Initiation（或者Association）表单时需要为其生成一个类，观察这个类，发现这个用XSD生成的类有如下特性来修饰：</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[System.CodeDom.Compiler.GeneratedCodeAttribute(&quot;xsd&quot;, &quot;2.0.50727.42&quot;)]<br />
[System.SerializableAttribute()]<br />
[System.Diagnostics.DebuggerStepThroughAttribute()]<br />
[System.ComponentModel.DesignerCategoryAttribute(&quot;code&quot;)]<br />
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]<br />
[System.Xml.Serialization.XmlRootAttribute(Namespace=&quot;http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-30T13:00:28&quot;, IsNullable=false)]</div></div>
<p>下面来逐行分析一下:</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[System.CodeDom.Compiler.GeneratedCodeAttribute(&quot;xsd&quot;, &quot;2.0.50727.42&quot;)]</div></div>
<p>表示这个类是由XSD工具生成的.</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[System.SerializableAttribute()]</div></div>
<p>表示这个类可以被序列化，我想关键就在这里</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[System.Diagnostics.DebuggerStepThroughAttribute()]</div></div>
<p>表示调试器会自动忽略被修饰的类内部的断点</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[System.ComponentModel.DesignerCategoryAttribute(&quot;code&quot;)]</div></div>
<p>表示设计器的类别是“code”</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]</div></div>
<p>表示系列化时生成的XSD架构是匿名类型</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:500px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[System.Xml.Serialization.XmlRootAttribute(Namespace=&quot;http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-30T13:00:28&quot;, IsNullable=false)]</div></div>
<p>设置序列化时根元素的命名空间</p>
<p>删去或修改我们不需要的特性（比如第一项），将其插入到我们的自定义类中，工作流就正常了。</p>
<blockquote><p>其实只需要将自定义类标识为[Serializable]即可。</p>
<p>其实不仅是自定义类，只要是在工作流类中的类级别变量，都必须实现了ISerializable的，而方法内的局部变量则可以不支持序列化。否则工作流在 进行钝化是无法序列化某些变量，也会导致这个错误。比如在工作流累中定义了一个XmlDocument，就会发生此错误。</p>
<p>2008.12.25最后更新</p></blockquote>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://coding.windstyle.cn/2007/03/29/programming-wf-3-visual-studio-2005-extension/" title="《WF编程》系列之3 &#8211; 漫游工作流:Visual Studio 2005 扩展 (2007-03-29)">《WF编程》系列之3 &#8211; 漫游工作流:Visual Studio 2005 扩展</a> (3)</li>
	<li><a href="http://coding.windstyle.cn/2007/05/17/sharepoint-workflow-tips-5-fix-errorfaild-on-load/" title="SharePoint工作流开发点滴(5) &#8211; &quot;启动时失败&quot;的查错方法 (2007-05-17)">SharePoint工作流开发点滴(5) &#8211; &quot;启动时失败&quot;的查错方法</a> (9)</li>
	<li><a href="http://coding.windstyle.cn/2007/07/16/programming-wf-19-raise-events-and-invoke-method-implement-service-and-workflow/" title="《WF编程》系列之19 &#8211; 触发事件与调用方法:服务以及工作流的实现 (2007-07-16)">《WF编程》系列之19 &#8211; 触发事件与调用方法:服务以及工作流的实现</a> (10)</li>
	<li><a href="http://coding.windstyle.cn/2007/10/22/programming-wf-33-basic-activities-web-services/" title="《WF编程》系列之33 &#8211; 基本活动:Web Services (2007-10-22)">《WF编程》系列之33 &#8211; 基本活动:Web Services</a> (4)</li>
	<li><a href="http://coding.windstyle.cn/2007/04/24/programming-wf-13-xaml-activacation/" title="《WF编程》系列之13 &#8211; XAML激活 (2007-04-24)">《WF编程》系列之13 &#8211; XAML激活</a> (12)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2007/02/07/sharepoint-workflow-tips-4-workflow-internal-error-and-custom-class/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>SharePoint工作流开发点滴(3)：添加外部工具,方便工作流开发</title>
		<link>http://coding.windstyle.cn/2007/01/16/sharepoint-workflow-tips-3-add-external-tools-to-help-developing-workflow/</link>
		<comments>http://coding.windstyle.cn/2007/01/16/sharepoint-workflow-tips-3-add-external-tools-to-help-developing-workflow/#comments</comments>
		<pubDate>Tue, 16 Jan 2007 07:26:00 +0000</pubDate>
		<dc:creator>windie</dc:creator>
				<category><![CDATA[SharePoint工作流开发点滴]]></category>
		<category><![CDATA[GUID]]></category>
		<category><![CDATA[InfoPath]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Visual Studio 2005]]></category>
		<category><![CDATA[Workflow]]></category>
		<category><![CDATA[工作流]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[表单]]></category>
		<category><![CDATA[部署]]></category>

		<guid isPermaLink="false">http://coding.windstyle.cn/?p=269</guid>
		<description><![CDATA[在利用ECM Starter kit Beta2中的模板开发工作流的时候经常会切换到其它窗口,比如要为InfoPath表单模板生成类文件,要安装工作流等等. 可不可以把这些工作都集成到Visual Studio.net 2005 IDE中呢?答案是肯定的,利用VS.net 2005 IDE的外部工具功能,就可以轻松实现. 方法 点击工具菜单下的外部工具,将会弹出来一个非常容易理解的外部工具对话框,在这里可以进行外部工具的添加,删除和修改以及排序的工作. 下面来说明一下怎样利用外部工具更方便的开发工作流吧. 生成GUID 在配置Feature.xml和Workflow.xml的时候,需要为这两个文件配置不同的GUID ,VS.net自带了一个生成GUID的小工具GUIDGEN并默认的把它添加到外部工具中,如果你像我一样发现并没有这个外部工具的话,打开外部工具对话框,填入以下信息: 标题 生成GUID 命令 C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\GUIDGEN.exe 初始目录 C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\ *如果你再次像我一样在初始目录中没有找到GUIDGEN.exe的话,你可以到微软的下载中心去下载(为什么我如此不幸?). 生成表单模板类文件 如果你的工作流中用到了InfoPath表单模板,而且需要为此表单模板生成类文件的话(比如要获取关联表单中的值),你可以添加一个这样的外部工具: 标题 生成表单模板类文件 命令 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\xsd.exe 参数 &#8220;\myschema.xsd&#8221; /c /o:$(ProjectDir) 初始目录 $(ProjectDir) 使用输出窗口 √ 提示输入参数 √ 使用时,会弹出一个对话框,在参数栏的&#8221;\之间填入包含模板架构文件(.xsd)的目录路径即可. 如:&#8221;c:\tempdir\myschema.xsd&#8221; /c /o:$(ProjectDir) [...]]]></description>
			<content:encoded><![CDATA[<p>在利用ECM Starter kit Beta2中的模板开发工作流的时候经常会切换到其它窗口,比如要为InfoPath表单模板生成类文件,要安装工作流等等.</p>
<p>可不可以把这些工作都集成到Visual Studio.net 2005 IDE中呢?答案是肯定的,利用VS.net 2005 IDE的外部工具功能,就可以轻松实现.</p>
<p><span id="more-269"></span></p>
<h3>方法</h3>
<p>点击工具菜单下的外部工具,将会弹出来一个非常容易理解的外部工具对话框,在这里可以进行外部工具的添加,删除和修改以及排序的工作.</p>
<p>下面来说明一下怎样利用外部工具更方便的开发工作流吧.</p>
<h3>生成GUID</h3>
<p>在配置Feature.xml和Workflow.xml的时候,需要为这两个文件配置不同的GUID ,VS.net自带了一个生成GUID的小工具GUIDGEN并默认的把它添加到外部工具中,如果你像我一样发现并没有这个外部工具的话,打开外部工具对话框,填入以下信息:</p>
<table border="0">
<tbody>
<tr>
<td>标题</td>
<td>生成GUID</td>
</tr>
<tr>
<td>命令</td>
<td>C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\GUIDGEN.exe</td>
</tr>
<tr>
<td>初始目录</td>
<td>C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\</td>
</tr>
</tbody>
</table>
<p>*如果你再次像我一样在初始目录中没有找到GUIDGEN.exe的话,你可以到微软的下载中心去下载(为什么我如此不幸?).</p>
<h3>生成表单模板类文件</h3>
<p>如果你的工作流中用到了InfoPath表单模板,而且需要为此表单模板生成类文件的话(比如要获取关联表单中的值),你可以添加一个这样的外部工具:</p>
<table border="0">
<tbody>
<tr>
<td>标题</td>
<td>生成表单模板类文件</td>
</tr>
<tr>
<td>命令</td>
<td>C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\xsd.exe</td>
</tr>
<tr>
<td>参数</td>
<td>&#8220;\myschema.xsd&#8221; /c /o:$(ProjectDir)</td>
</tr>
<tr>
<td>初始目录</td>
<td>$(ProjectDir)</td>
</tr>
<tr>
<td>使用输出窗口</td>
<td>√</td>
</tr>
<tr>
<td>提示输入参数</td>
<td>√</td>
</tr>
</tbody>
</table>
<p>使用时,会弹出一个对话框,在参数栏的&#8221;\之间填入包含模板架构文件(.xsd)的目录路径即可.</p>
<p>如:&#8221;c:\tempdir\myschema.xsd&#8221; /c /o:$(ProjectDir)</p>
<p>(其中粗体字就是自己添加的目录路径)</p>
<h3>安装工作流</h3>
<table border="0">
<tbody>
<tr>
<td>标题</td>
<td>安装工作流</td>
</tr>
<tr>
<td>命令</td>
<td>$(ProjectDir)Install.bat</td>
</tr>
<tr>
<td>参数</td>
<td>&#8220;\myschema.xsd&#8221; /c /o:$(ProjectDir)</td>
</tr>
<tr>
<td>初始目录</td>
<td>$(ProjectDir)</td>
</tr>
<tr>
<td>使用输出窗口</td>
<td>√</td>
</tr>
</tbody>
</table>
<p>只要配置好了Install.bat文件,直接调用此外部工具即可完成安装,而且可以在输出窗口中查看进度信息.</p>
<p>外部工具还有很多很有帮助的应用场景,就看你能不能想得出了.</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://coding.windstyle.cn/2007/12/07/programming-wf-36-custom-activities-how-to-create-custom-activity/" title="《WF编程》系列之36 &#8211; 自定义活动:如何创建自定义活动?活动的组合 (2007-12-07)">《WF编程》系列之36 &#8211; 自定义活动:如何创建自定义活动?活动的组合</a> (9)</li>
	<li><a href="http://coding.windstyle.cn/2007/04/28/programming-wf-16-external-world-of-workflow-life-cycle-event/" title="《WF编程》系列之16 &#8211; 工作流与外部世界:生存周期事件 (2007-04-28)">《WF编程》系列之16 &#8211; 工作流与外部世界:生存周期事件</a> (7)</li>
	<li><a href="http://coding.windstyle.cn/2009/11/09/sharepoint-2010-workflow-series-2-sharepoint-designer-2010-workflow-conditions-and-actions-overview/" title="SharePoint 2010工作流系列（2）：SharePoint Designer 2010中工作流的条件和操作概览 (2009-11-09)">SharePoint 2010工作流系列（2）：SharePoint Designer 2010中工作流的条件和操作概览</a> (0)</li>
	<li><a href="http://coding.windstyle.cn/2007/03/30/programming-wf-4-windows-workflow-runtime-and-services/" title="《WF编程》系列之4 &#8211; 漫游工作流:Windows Workflow Runtime及其服务 (2007-03-30)">《WF编程》系列之4 &#8211; 漫游工作流:Windows Workflow Runtime及其服务</a> (2)</li>
	<li><a href="http://coding.windstyle.cn/2007/04/06/programming-wf-8-workflow-authoring-mode-pure-xaml/" title="《WF编程》系列之8 &#8211; 工作流编写方式:纯XAML (2007-04-06)">《WF编程》系列之8 &#8211; 工作流编写方式:纯XAML</a> (16)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2007/01/16/sharepoint-workflow-tips-3-add-external-tools-to-help-developing-workflow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SharePoint工作流开发点滴(2)：开发第一个SharePiont工作流: HelloWorldSequential 的注意事项</title>
		<link>http://coding.windstyle.cn/2007/01/08/sharepoint-workflow-tips-2-attention-of-first-sharepoint-workflow-development/</link>
		<comments>http://coding.windstyle.cn/2007/01/08/sharepoint-workflow-tips-2-attention-of-first-sharepoint-workflow-development/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 02:29:00 +0000</pubDate>
		<dc:creator>windie</dc:creator>
				<category><![CDATA[SharePoint工作流开发点滴]]></category>
		<category><![CDATA[Workflow]]></category>
		<category><![CDATA[InfoPath]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Visual Studio 2005]]></category>
		<category><![CDATA[工作流]]></category>

		<guid isPermaLink="false">http://coding.windstyle.cn/?p=265</guid>
		<description><![CDATA[HelloWorldSequential是一个入门级的SharePoint工作流,基本上照着MSDN的教程一步一步来就可以了,我写这篇文字的主要目的是将其中一些重要的步骤列举出来,这些步骤的错误处理将直接导致工作流失败. 参考资料 &#60;&#60;Walkthrough: Creating Office SharePoint Server 2007 Workflows in Visual Studio 2005 &#62;&#62; 准备 HelloWorldSequential的开发环境如下，请确保您的开发环境与此相同或相兼容: 已部署好的可用的SharePoint Server 2007 .Net Framework 3.0（下载） Visual Studio 2005 Extensions for Windows Workflow Foundation （下载） ECM starter kit for Visual Studio 2005（下载） Office InfoPath 2007 RTM 中文版 安装ECM starter kit之后如果出现项目模板丢失的情况请参考我的另外一篇文章&#60;&#60; Visual Studio.net 2005 新建项目对话框中项目模版消失的解决方案&#62;&#62; 添加SharePoint Workflow Actions到工具箱时选择Microsoft.SharePoint.WorkflowActions命名空间下的控件. Visual Studio项目 [...]]]></description>
			<content:encoded><![CDATA[<p>HelloWorldSequential是一个入门级的SharePoint工作流,基本上照着MSDN的教程一步一步来就可以了,我写这篇文字的主要目的是将其中一些重要的步骤列举出来,这些步骤的错误处理将直接导致工作流失败.</p>
<p><span id="more-265"></span></p>
<h3>参考资料</h3>
<p><a href="http://msdn2.microsoft.com/en-us/library/ms564355.aspx">&lt;&lt;Walkthrough: Creating Office SharePoint Server 2007 Workflows in Visual Studio 2005 &gt;&gt;</a></p>
<h3>准备</h3>
<ol>
<li>HelloWorldSequential的开发环境如下，请确保您的开发环境与此相同或相兼容:</li>
</ol>
<ul>
<li>已部署好的可用的SharePoint Server 2007</li>
<li>.Net Framework 3.0（<a href="http://go.microsoft.com/fwlink/?LinkId=70848">下载</a>）</li>
<li>Visual Studio 2005 Extensions for Windows Workflow Foundation （<a href="http://www.microsoft.com/downloads/details.aspx?familyid=5D61409E-1FA3-48CF-8023-E8F38E709BA6&amp;displaylang=zh-cn">下载</a>）</li>
<li>ECM starter kit for Visual Studio 2005（<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=38CA6B32-44BE-4489-8526-F09C57CD13A5&amp;displaylang=en">下载</a>）</li>
<li>Office InfoPath 2007 RTM 中文版</li>
</ul>
<ol>
<li>安装ECM starter kit之后如果出现项目模板丢失的情况请参考我的另外一篇文章<a href="http://www.cnblogs.com/xiaoshatian/archive/2006/12/14/592464.html">&lt;&lt; Visual Studio.net 2005 新建项目对话框中项目模版消失的解决方案&gt;&gt;</a></li>
<li>添加SharePoint Workflow Actions到工具箱时选择Microsoft.SharePoint.WorkflowActions命名空间下的控件.</li>
</ol>
<h3>Visual Studio项目</h3>
<ol>
<li>项目模板是SharePoint Server 下的 SharePoint Sequential Workflow Library.</li>
<li>添加并配置工作流活动时请注意所有活动都有一个Correlation Token属性,值得注意的是工作流本身(Workflow),任务(Task)和修改(Modification)需要不同的Correlation Token.</li>
<li>创建强命名的程序集,因为您的程序集是要加入GAC的.</li>
</ol>
<h3>InfoPath表单</h3>
<ol>
<li>创建空白表单模板时要勾选仅启用浏览器兼容性功能.</li>
<li>在表单选项的安全和信任中,将表单的信任级别设置为域或者完全信任.</li>
<li>用于设置接收参数的xml文件中,接受参数总是以”ows_”开头.</li>
<li>修改组的名称,组的名称默认是MyFields,如果您想要为此表单生成类文件,那么类的名字就是组的名字,所以建议修改默认的名称(尤其当您的工作流项目中包含多张需要生成类文件的表单时).</li>
<li>为简单起见,将表单发布到项目文件夹内,否则在部署时需要特别注意.</li>
<li>发布表单时将可访问路径留空,否则安装工作流时会失败</li>
</ol>
<h3>部署</h3>
<ol>
<li>Feature.xml和Workflow.xml可以用插入代码段(Snippet)的方法生成内容,如果您发现您没有相关的代码段,请参照我的另外一篇文章<a href="http://www.cnblogs.com/xiaoshatian/archive/2006/12/31/608479.html">&lt;&lt; Visual Studio 2005中代码段丢失的解决方案&gt;&gt;</a>.</li>
<li>Feature的ID和Workflow的ID是两个不同的GUID.</li>
<li>Install.bat文件中, 请用可以作为文件夹名称的字符串来替换MyFeature,最好不要包含空格,否则需要手动将Install.bat文件中的路径前后加引号.</li>
</ol>
<h3>调试</h3>
<ol>
<li>更改了Feature.xml,Workflow.xml和表单文件之后需要重新安装工作流并重启IIS.</li>
<li>如果只是更改了程序集,只需要用新的程序集替换旧的,然后重启IIS就可以了.</li>
</ol>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://coding.windstyle.cn/2007/03/21/developing-loopable-workflow-using-sharepoint-designer/" title="利用SharePoint Designer开发可循环工作流 (2007-03-21)">利用SharePoint Designer开发可循环工作流</a> (24)</li>
	<li><a href="http://coding.windstyle.cn/2009/10/16/pro-wf-windows-workflow-in-net-3-5-chinese-edition-is-on-the-market/" title="《WF高级程序设计》（《Pro WF：Windows Workflow in .NET 3.5》中文版）上市 (2009-10-16)">《WF高级程序设计》（《Pro WF：Windows Workflow in .NET 3.5》中文版）上市</a> (0)</li>
	<li><a href="http://coding.windstyle.cn/2007/03/23/programming-wf0-start-point/" title="《WF编程》系列之0 &#8211; WF笔记开始 (2007-03-23)">《WF编程》系列之0 &#8211; WF笔记开始</a> (9)</li>
	<li><a href="http://coding.windstyle.cn/2009/11/16/sharepoint-2010-workflow-series-4-visual-studio-2010-sharepoint-workflow-capabilities-first-look/" title="SharePoint 2010工作流系列（4）：初窥Visual Studio 2010的SharePoint工作流功能 (2009-11-16)">SharePoint 2010工作流系列（4）：初窥Visual Studio 2010的SharePoint工作流功能</a> (0)</li>
	<li><a href="http://coding.windstyle.cn/2007/07/19/programming-wf-21-faults/" title="《WF编程》系列之21 &#8211; 故障 Faults (2007-07-19)">《WF编程》系列之21 &#8211; 故障 Faults</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2007/01/08/sharepoint-workflow-tips-2-attention-of-first-sharepoint-workflow-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SharePoint工作流开发点滴(1)：一些概念</title>
		<link>http://coding.windstyle.cn/2007/01/04/sharepoint-workflow-tips-1-some-concept/</link>
		<comments>http://coding.windstyle.cn/2007/01/04/sharepoint-workflow-tips-1-some-concept/#comments</comments>
		<pubDate>Thu, 04 Jan 2007 01:15:00 +0000</pubDate>
		<dc:creator>windie</dc:creator>
				<category><![CDATA[SharePoint工作流开发点滴]]></category>
		<category><![CDATA[Workflow]]></category>
		<category><![CDATA[Correlation Token]]></category>
		<category><![CDATA[Initiation]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[关联]]></category>
		<category><![CDATA[实例]]></category>
		<category><![CDATA[工作流]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[表单]]></category>
		<category><![CDATA[钝化]]></category>

		<guid isPermaLink="false">http://coding.windstyle.cn/?p=264</guid>
		<description><![CDATA[本文介绍了工作流开发中会用到的一些概念，比如模板、关联、实例、以及工作流生命周期中的各个状态和需要的表单。 模板(Template),关联(Association)和实例(Instance)模板:部署到站点集中的工作流功能(Feature),用来描述该功能所包含的程序集和表单等信息.关联:将工作流模板与列表(List)或者内容类型(Content Type)联系起来,并向工作流提供初始值或参数.对应的表单叫做Association.实例:在列表或内容类型项上启动的工作流.对应的表单叫做Initiation. 也就是说,实例是基于关联的,而关联又是基于模板的.一个列表或者内容类型可以拥有许多来自相同工作流模板的关联,但同一时刻同一关联只能启动一个工作流实例. 钝化(Dehydrated)钝化指将工作流序列化(Serialized)并保存在数据库中.钝化后的工作流将从内存中清除.当工作流等待的事件发生时,工作流将反序列化(Deserialized)并被唤醒,然后继续它的流程.事务性动作(Transacted Action)和批处理动作(Batched Action)直到工作流钝化后才会提交.例如,CreateTask并没有马上创建任务,而是等到OnTaskChanged将工作流钝化之后才创建任务.所以在创建任务之后马上访问任务是错误的. Method 和 Event HandleMethod用来执行动作,例如CreateTask就是一个Method活动.Event Handle用来将工作流钝化,然后等待一定的事件被触发后唤醒工作流,例如OnTaskChanged就是一个Event Handle活动.Method的Method Invoking在Method要执行的动作之前执行,而Event Handle的Method Invoking却在Event Handle的事件触发之后执行. Correlation Token将若干相关联的活动映射到同一集合的标识符,例如给CreateTask,OnTaskChanged和CompleteTask指定相同的Correlation Token,则这几个活动被关联到同一个任务.在SharePoint Workflow Actions中,Correlation Token大致按照下表来分组指定: 工作流 任务 修改 OnWorkflowActivated&#160;&#160; OnWorkflowItemChanged OhWorkflowItemDeleted&#160; SetState SendEmail UpdateAllTasks CreateTask&#160;&#160; CreateTaskWithContentType UpdateTask DeleteTask CompleteTask RollbackTask OnTaskChanged OnTaskDeleted OnTaskCreated EnableWorkflowModification&#160;&#160; OnWorkflowModified InfoPath表单 表单类型 宿主ASPX 需要执行的动作 Event Handle 接收数据的属性 Association CstWrkflIP.aspx 建立工作流模板和列表(或者内容类型)之间的关联 无 无 [...]]]></description>
			<content:encoded><![CDATA[<p>本文介绍了工作流开发中会用到的一些概念，比如模板、关联、实例、以及工作流生命周期中的各个状态和需要的表单。<span id="more-264"></span></p>
<ol>
<li>模板(Template),关联(Association)和实例(Instance)模板:部署到站点集中的工作流功能(Feature),用来描述该功能所包含的程序集和表单等信息.关联:将工作流模板与列表(List)或者内容类型(Content Type)联系起来,并向工作流提供初始值或参数.对应的表单叫做Association.实例:在列表或内容类型项上启动的工作流.对应的表单叫做Initiation.
<p>也就是说,实例是基于关联的,而关联又是基于模板的.一个列表或者内容类型可以拥有许多来自相同工作流模板的关联,但同一时刻同一关联只能启动一个工作流实例.</li>
<li>钝化(Dehydrated)钝化指将工作流序列化(Serialized)并保存在数据库中.钝化后的工作流将从内存中清除.当工作流等待的事件发生时,工作流将反序列化(Deserialized)并被唤醒,然后继续它的流程.事务性动作(Transacted Action)和批处理动作(Batched Action)直到工作流钝化后才会提交.例如,CreateTask并没有马上创建任务,而是等到OnTaskChanged将工作流钝化之后才创建任务.所以在创建任务之后马上访问任务是错误的.</li>
<li>Method 和 Event HandleMethod用来执行动作,例如CreateTask就是一个Method活动.Event Handle用来将工作流钝化,然后等待一定的事件被触发后唤醒工作流,例如OnTaskChanged就是一个Event Handle活动.Method的Method Invoking在Method要执行的动作之前执行,而Event Handle的Method Invoking却在Event Handle的事件触发之后执行.</li>
<li>Correlation Token将若干相关联的活动映射到同一集合的标识符,例如给CreateTask,OnTaskChanged和CompleteTask指定相同的Correlation Token,则这几个活动被关联到同一个任务.在SharePoint Workflow Actions中,Correlation Token大致按照下表来分组指定:<br />
<table border="0">
<tbody>
<tr>
<td width="175">工作流</td>
<td width="202">任务</td>
<td>修改</td>
</tr>
<tr>
<td>OnWorkflowActivated&nbsp;&nbsp;</p>
<p>OnWorkflowItemChanged</p>
<p>OhWorkflowItemDeleted&nbsp;</p>
<p>SetState</p>
<p>SendEmail</p>
<p>UpdateAllTasks</td>
<td>CreateTask&nbsp;&nbsp;</p>
<p>CreateTaskWithContentType</p>
<p>UpdateTask</p>
<p>DeleteTask</p>
<p>CompleteTask</p>
<p>RollbackTask</p>
<p>OnTaskChanged</p>
<p>OnTaskDeleted</p>
<p>OnTaskCreated</td>
<td>EnableWorkflowModification&nbsp;&nbsp;</p>
<p>OnWorkflowModified</td>
</tr>
</tbody>
</table>
</li>
<li>InfoPath表单
<div>
<table border="0">
<tbody>
<tr>
<td>表单类型</td>
<td>宿主ASPX</td>
<td>需要执行的动作</td>
<td>Event Handle</td>
<td>接收数据的属性</td>
</tr>
<tr>
<td>Association</td>
<td>CstWrkflIP.aspx</td>
<td>建立工作流模板和列表(或者内容类型)之间的关联</td>
<td>无</td>
<td>无</td>
</tr>
<tr>
<td>Initiation</td>
<td>IniWrkflIP.aspx</td>
<td>启动工作流实例</td>
<td>OnWorkflow Activated</td>
<td>SPWorkflowActivationProperty.InitiationData</td>
</tr>
<tr>
<td>Task</td>
<td>WrkTaskIP.aspx</td>
<td>更改了任务</td>
<td>OnTaskChanged</td>
<td>OnTaskChanged.AfterProperties</td>
</tr>
<tr>
<td>Modification</td>
<td>ModWrkflIP.aspx</td>
<td>修改工作流</td>
<td>OnWorkflowMosified</td>
<td>OnWorkflowMosified.ContextData</td>
</tr>
</tbody>
</table>
</div>
<p>Association表单不接受数据,也不会存在相应的Event Handler,因为此时工作流实例还没有启动,便没有钝化和唤醒一说,不过Associatin中的数据却可以在SPWorkflowActivationProperty.AssociationData中获取.</li>
</ol>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://coding.windstyle.cn/2009/03/27/find-out-unfinished-surveys-in-sharepoint-server-2007/" title="揪出未完成的SharePoint Server 2007调查答复 (2009-03-27)">揪出未完成的SharePoint Server 2007调查答复</a> (0)</li>
	<li><a href="http://coding.windstyle.cn/2007/08/09/programming-wf-30-basic-activities-faults-handling/" title="《WF编程》系列之30 &#8211; 基本活动:错误处理 (2007-08-09)">《WF编程》系列之30 &#8211; 基本活动:错误处理</a> (3)</li>
	<li><a href="http://coding.windstyle.cn/2007/03/29/programming-wf-3-visual-studio-2005-extension/" title="《WF编程》系列之3 &#8211; 漫游工作流:Visual Studio 2005 扩展 (2007-03-29)">《WF编程》系列之3 &#8211; 漫游工作流:Visual Studio 2005 扩展</a> (3)</li>
	<li><a href="http://coding.windstyle.cn/2007/03/24/programming-wf-1-helloworkflow-and-create-workflow-solution/" title="《WF编程》系列之1 &#8211; Hello,Workflow &amp; 创建工作流解决方案 (2007-03-24)">《WF编程》系列之1 &#8211; Hello,Workflow &amp; 创建工作流解决方案</a> (15)</li>
	<li><a href="http://coding.windstyle.cn/2008/11/01/pdc-2008-sessions-available-for-viewing/" title="PDC 2008 Sessions Available for Viewing (2008-11-01)">PDC 2008 Sessions Available for Viewing</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2007/01/04/sharepoint-workflow-tips-1-some-concept/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
