我和this question有类似的情况。
我有一个自定义顺序SharePoint工作流,在Visual Studio 2008中已删除。它与提交到表单库的InfoPath表单相关联。它被配置为在创建项目时自动启动。
有时会奏效。有时候它无法启动。
就像上面链接的问题一样,我检查了调试器,问题是当工作流触发时,作为列中的列发布的InfoPath字段为空。 (我使用workflowProperties.Item["fieldName"]
访问字段。)但似乎存在竞争条件,因为这些字段实际显示在库视图中,如果我终止失败的工作流并手动重新启动它,它的工作原理很好!的
经过大量的讨论和测试后,我确定如果用户在Windows XP上运行任何版本的IE,工作流程将成功启动,但如果同一用户提交相同的表单数据,则会失败Vista或Windows 7客户端计算机。
有谁知道为什么会这样?
答案 0 :(得分:2)
我使用了另一种解决方案,它只会等到InfoPath属性可用(或最多60秒):
public SPWorkflowActivationProperties workflowProperties =
new SPWorkflowActivationProperties();
private void onOrderFormWorkflowActivated_Invoked(object sender, ExternalDataEventArgs e)
{
SPListItem workflowItem;
workflowItem = workflowProperties.List.GetItemById(workflowProperties.ItemId);
int waited = 0;
int maxWait = 60000; // Max wait time in ms
while (workflowItem["fieldName"] == null && (waited < maxWait))
{
System.Threading.Thread.Sleep(1);
waited ++;
workflowItem = workflowProperties.List.GetItemById(workflowProperties.ItemId);
}
// For testing: Write delay time in Workflow History Event
SPWorkflow.CreateHistoryEvent(
workflowProperties.Web,
workflowProperties.WorkflowId,
(int)SPWorkflowHistoryEventType.WorkflowComment,
workflowProperties.OriginatorUser, TimeSpan.Zero,
waited.ToString() + " ms", "Waiting time", "");
}
workflowProperties.Item
永远不会在上面的代码中获取InfoPath属性。
一段时间后workflowProperties.List.GetItemById(workflowProperties.ItemId)
将会出现。{/ p>
答案 1 :(得分:1)
这是因为Vista / 7通过WebDAV保存InfoPath表单,但XP使用其他协议(抱歉,当时记不起来)。 SharePoint在实际上载文件之前捕获“ItemAdded”事件(即,该项目已创建,但文件上载当前正在进行中)。
您可以为解决方法做的是添加dealay活动并等待10秒作为工作流中的第一件事(由于工作流在SPPS中构建的方式,实际上将超过10秒)。这样,当您执行读取项目时,上载已经结束。要通知用户发生了什么,您可以在延迟之前添加“logToHistoryList”活动。