我正在尝试在 Azure 上托管一个长时间运行的工作流服务,但我遇到了相关问题。
我已经将 timeToUnload 和 timeToPersist 设置为 0,并且我在工作流中勾选了“发送前的持久性” - 这不是持久性的问题,它与实例键的计算方式有关。
当一个 Web 服务器启动一个工作流,而另一个 Web 服务器尝试对该工作流执行另一个操作时,它会失败并显示
System.ServiceModel.FaultException:InstancePersistenceCommand 的执行被中断,因为实例键“12e0b449-7a71-812d-977a-ab89864a272f”未与实例关联。这可能是因为实例或密钥已被清理,或者因为密钥无效。如果生成密钥的消息在错误的时间发送或包含不正确的相关数据,则密钥可能无效。
我使用 wcf 服务诊断对此进行了深入研究,发现这是因为实例密钥的计算包括网站实例名称,因此给定的工作流实例只能从实例化它的同一台机器回调(因为 Azure 设置每个角色实例上的不同网站实例名称)。
解释一下,当我创建工作流的新实例时,我有一个活动,它获取工作流实例 Guid,然后返回该 guid,并且还使用相关初始化程序来设置相关句柄。
我在 web.config 中启用了服务跟踪,因此在服务跟踪查看器中,当我实例化工作流的新实例时,我可以看到以下情况;
<ApplicationData >
<TraceData >
<DataItem >
<TraceRecord Severity ="Information" Channel="Analytic " xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord ">
<TraceIdentifier >225</ TraceIdentifier>
<Description >Calculated correlation key '496e3207-fe9d-919f-b1df-f329c5a64934' using values 'key1:10013d62-286e-4a8f-aeb2-70582591cd7f,' in parent scope '{/NewOrbit.ExVerifier.Web_IN_2_Web/Workflow/Application/}Application_default1.xamlx'.</Description >
<AppDomain >/LM/W3SVC/1273337584/ROOT-1-129811251826070757</AppDomain >
</TraceRecord >
</DataItem >
</TraceData >
</ApplicationData >
重要的一行是这样的:
使用父范围“{/NewOrbit.ExVerifier.Web_IN_2_Web/Workflow/Application/}Application_default1.xamlx”中的值“key1:10013d62-286e-4a8f-aeb2-70582591cd7f”计算相关键“496e3207-fe9d-919f-b1df-f329c5a64934” '。
这个特定工作流实例的 Guid 是10013d62-286e-4a8f-aeb2-70582591cd7f
这样的,工作流引擎从496e3207-fe9d-919f-b1df-f329c5a64934
. 我可以看到带有 guid 的工作流实例,[System.Activities.DurableInstancing].[InstancesTable]
我可以看到 .in 中的实例键[System.Activities.DurableInstancing].[KeysTable]
。到目前为止,一切都很好,如果同一台服务器稍后调用相同的工作流程,一切正常。但是,如果其他服务器尝试访问工作流,我会收到上面提到的相关错误。再次查看诊断跟踪,我可以看到:
<TraceData >
<DataItem >
<TraceRecord Severity ="Information" Channel="Analytic " xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord ">
<TraceIdentifier >225</ TraceIdentifier>
<Description >Calculated correlation key '12e0b449-7a71-812d-977a-ab89864a272f' using values 'key1:10013d62-286e-4a8f-aeb2-70582591cd7f,' in parent scope '{/NewOrbit.ExVerifier.Web_IN_5_Web/Workflow/Application/}Application_default1.xamlx'. </Description >
<AppDomain >/LM/W3SVC/1273337584/ROOT-1-129811251818669004</AppDomain >
</TraceRecord >
</DataItem >
</TraceData >
重要的线是
使用父范围“{/NewOrbit.ExVerifier.Web_IN_5_Web/Workflow/Application/}Application_default1.xamlx”中的值“key1:10013d62-286e-4a8f-aeb2-70582591cd7f”计算相关键“12e0b449-7a71-812d-977a-ab89864a272f” '。
如您所见,传入的是同一个 Guid,但系统在计算 Instance key 时包含了网站实例的名称,因此最终会得到一个完全不同的实例 key。
我创建了一个全新的项目来测试它并发现了完全相同的问题。我觉得我必须做一些非常简单的错误,因为我找不到其他人有同样的问题。