最后,我反编译了System.Activities.DableInstancing。SqlWorkflowInstanceStore上WorkflowHostType的唯一设置程序是ExtractWorkflowHostType:
private void ExtractWorkflowHostType(IDictionary<XName, InstanceValue> commandMetadata)
{
InstanceValue instanceValue;
if (commandMetadata.TryGetValue(WorkflowNamespace.WorkflowHostType, out instanceValue))
{
XName xName = instanceValue.Value as XName;
if (xName == null)
{
throw FxTrace.Exception.AsError(new InstancePersistenceCommandException(SR.InvalidMetadataValue(WorkflowNamespace.WorkflowHostType, typeof(XName).Name)));
}
byte[] bytes = Encoding.Unicode.GetBytes(xName.ToString());
base.Store.WorkflowHostType = new Guid(HashHelper.ComputeHash(bytes));
this.fireRunnableInstancesEvent = true;
}
}
我无法清楚地理清调用代码的路径,所以我必须在运行时通过将WinDbg/SOS附加到IIS并打开HashHelper.ComputeHash来找到答案。
我能够检索进入哈希计算的XName,它的localname等于servicefile,namespace等于[sitename]/[path]/。
最后,WorkflowHostType的计算归结为:
var xName = XName.Get("Flow.xamlx.svc", "/examplesite/WorkflowService/1/");
var bytes = Encoding.Unicode.GetBytes(xName.ToString());
var WorkflowHostType = new Guid(HashHelper.ComputeHash(bytes));
底线:显然,只有当服务文件名、站点名称和路径与启动时完全相同(区分大小写)时,工作流才能重新水合