Windows Workflow 4 关联查询在实例密钥计算中包含网站实例名称并失败

2023-12-12

我正在尝试在 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 >

重要的一行是这样的:

计算的相关密钥'496E3207-FE9D-919F-B1DF-F329C5A64934'使用值'key1:10013d62-286e-4a8f-4a8f-aeb2-70582591cd7f,in Carent Scope' 1.XAMLX '。

这个特定工作流实例的 Guid 是10013d62-286e-4a8f-aeb2-70582591cd7f因此工作流引擎计算出一个“实例键”496e3207-fe9d-919f-b1df-f329c5a64934。 我可以看到带有 guid 的工作流实例[System.Activities.DurableInstancing].[InstancesTable]我可以看到实例键[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 >

重要的一行是

计算相关密钥'12E0B449-7A71-812D-977A-AB89864A272F'使用值'key1:10013d62-286e-4a8f-4a8f-aeb2-aeb2-70582591cd7f efault1.xamlx '。

正如您所看到的,传入的是相同的 Guid,但系统在计算实例密钥时包含了网站实例的名称,因此最终得到了完全不同的实例密钥。

我创建了一个全新的项目来测试这个问题,并发现了完全相同的问题。我觉得我一定是做了一些非常简单的错误,因为我找不到其他人有同样的问题。


几个月后,我找到了解决这个问题的方法。根本问题是 Azure 在每个角色实例上为网站命名不同;该网站的名称不是“默认网站”,而是类似NewOrbit.ExVerifier.Web_IN_0_Web(为您的 Web 项目指定一个名称空间 NewOrbit.ExVerifier.Web)。工作流使用网站名称作为用于计算实例密钥的算法的一部分,因此出现了问题。

解决方案很简单,就是在角色启动期间重命名网站,以便在所有实例上都调用相同的名称。解决根本问题而不是处理后果,如此明显,我第一次从未见过它。

以下是您可以执行此操作的方法(大致基于此:http://blogs.msdn.com/b/tomholl/archive/2011/06/28/hosting-services-with-was-and-iis-on-windows-azure.aspx)

配置 powershell 以具有提升的访问权限,以便您可以在配置 IIS 后进行更改:

In ServiceDefinition.csdef添加启动任务:

<ServiceDefinition name="WasInAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRole1">
      ...
      <Startup>
          <Task commandLine="setup\startup.cmd" executionContext="elevated" />
      </Startup>
  </WebRole>
</ServiceDefinition>

Setup\Startup.cmd应该有这样的内容:

powershell -command "set-executionpolicy Unrestricted" >> out.txt

配置 OnStar 角色以具有管理员权限

In ServiceDefinition.csdef添加这个:

<ServiceDefinition name="WasInAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRole1">
  ...
    <Runtime executionContext="elevated" />
  </WebRole>
</ServiceDefinition>

创建 powershell 脚本来重命名网站

创建一个setup\RoleStart.ps1 file:

write-host "Begin RoleStart.ps1"
import-module WebAdministration
$siteName = "*" + $args[0] + "*"
Get-WebSite $siteName | Foreach-Object { 
    $site = $_;
    $siteref = "IIS:/Sites/" + $site.Name;
    try {
        Rename-Item $siteref 'MyWebSite'
        write-host $siteName + " was renamed"
    }
    catch
    {
       write-host "Failed to rename " + $siteName + " : " + $error[0]
    }
}
write-host "End RoleStart.ps1"

(将 MyWebSite 替换为您希望在所有服务器上调用该网站的任何内容)。

在角色启动时运行 RoleStart.ps1:

在网站项目的根目录中创建或编辑 WebRole.cs 并添加以下代码:

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        var startInfo = new ProcessStartInfo()
        {
            FileName = "powershell.exe",
            Arguments = @".\setup\rolestart.ps1",
            RedirectStandardOutput = true,
            UseShellExecute=false,
        };
        var writer = new StreamWriter("out.txt");
        var process = Process.Start(startInfo);
        process.WaitForExit();
        writer.Write(process.StandardOutput.ReadToEnd());
        writer.Close();
        return base.OnStart();
    }
}

应该就是这样。如果您启动多个 Web 角色实例并使用 RDP 连接到它们,您现在应该能够看到该网站在所有实例上的调用方式相同,因此工作流持久性有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows Workflow 4 关联查询在实例密钥计算中包含网站实例名称并失败 的相关文章

随机推荐

  • 从 TextBlock 获取 DataContext MouseDown

    ListView GridView 中的绑定列 如何在 MouseDown 事件中获取数据源
  • 为什么 Python 中元组比列表快?

    我刚刚读过 深入Python 元组比列表更快 元组是不可变的 列表是可变的 但我不太明白为什么元组更快 有人对此进行过性能测试吗 报告的 建设速度 比率仅适用于constant元组 其项目由文字表达的元组 仔细观察 并在您的计算机上重复 您
  • 使用 GIT 分支/分支

    我已经使用 Git 一段时间了 但尽管在博客和教程上花费了数小时 但我仍然无法理解某些功能 我正在与其他人一起开发一个项目 我的老板在 bitBucket 上创建了一个存储库 我在本地克隆了它 并且已经对主分支做了一些提交 并拉取了其他人的
  • 如何使用View.OnTouchListener代替onClick

    我正在为客户开发 Android 2 2 2 应用程序 他想要执行以下操作 现在我有一个带有 onClick 事件的按钮 但他不喜欢 他想检测用户何时释放按钮 我找到了View OnTouchListener我认为这是我需要使用的 但是 是
  • 附加到 numpy 数组

    我正在尝试构造一个 numpy 数组 然后向其附加整数和另一个数组 我尝试这样做 xyz list frag str split nums numpy array coords numpy array for i in range int
  • 命名空间“clr-namespace”中不存在名称“...”

    我在使用 Visual Studio 2012 NET 4 5 和 WPF 时遇到一个奇怪的问题 视图找不到对我的任何类的引用 并且我不断收到错误 命名空间 clr namespace 中不存在名称 虽然智能感知确实找到了我的任何课程 我尝
  • 使用 Apache POI 打开 .xlsx 文件会出现 NoClassDefFoundError InvalidFormatException

    我无法正确导入所有必需的 jar 文件 我的最终目标只是读取 Excel 电子表格 更具体地说是 xlsx 文件 来检查 Apache POI 的速度是否适合未来的应用程序 我的问题是为什么我会抛出错误 java lang NoClassD
  • 导出项目模板VS2012/13中的.props文件

    我正在尝试将项目导出为模板 有两个 props 文件 一个用于 Win32 配置 另一个用于 x64 配置 当我运行导出向导时 会创建一个 zip 文件 但不包含 prop 文件 但是 vcxproj 文件仍然引用 props 文件 并且使
  • Symfony2 - 需要帮助设置教义查询以查找标签

    我一直在广泛寻找 但仍然无法找到如何设置查询来查找用户从侧边栏中选择的特定 标签 的示例 而侧边栏又将显示带有该标签的所有帖子标签 我了解如何查找所有标签 但不了解如何查找用户选择的特定标签 博客库 public function getT
  • 如何离线安装 Visual Studio Code 扩展?

    我已在未连接也无法连接到 Internet 的计算机上安装了 Visual Studio Code 根据文档 如果我有的话 我可以从命令行安装扩展 vsix 但我不知道如何获得 vsix从市场上 我怎样才能下载 vsix对于托管在市场 更新
  • C# MYSQL - 重复键更新 - 相同查询不同结果

    在我的测试应用程序中 当我重复运行此查询时 即使没有发生任何变化 我也会得到正的行计数结果 insert into test k v values testkey 123 on duplicate key update v values v
  • 为什么没有输入函数

    我有以下 Jquery 自定义验证方法 save event challenge off click on click function e let btn e target jQuery validator addMethod minTi
  • 不适用于 iOS 7.0.3

    以下代码在 iOS 6 0 1 中完美运行 使用iOS虚拟键盘 我按下输入框上的 Go 按钮
  • 迭代 python 字典以仅检索所需的行

    我从外部源获取 HTML 表格格式的数据 from xml etree import ElementTree as ET s table tr th Release th th REFDB th th URL th tr tr td 3 7
  • 当当前访问令牌过期时,我如何获取新的访问令牌,google firebase auth?

    我在客户端使用 firebase 在服务器使用 firebase admin 在客户端 我使用 signInWithPopUp 使用 google 帐户登录我的网络应用程序 然后在客户端接收 accessToken expirationTi
  • MySQL查询以特定顺序返回结果,无需order by

    是否可以使 mysql 查询返回没有默认顺序的值 例如 我使用下面的查询 select id product name from sample where id product in 675 123 745 954 但它按 id produ
  • 解析 Unity 推送示例不起作用

    我正在努力在我的 Unity Android 应用程序上使用 Parse 已经工作了几天但还没有成功 无论我多么努力 我都无法为 Android 注册我的设备令牌 而这是向 Android 发送推送通知所需的 下面是我的示例代码和清单片段
  • C++ 友元类 std::vector

    是否可以便携地执行以下操作 struct structure structure private only allow container copy construct structure const structure in genera
  • Google 域 API 访问错误

    我是谷歌应用程序帐户用户 当我尝试访问 Google Plus Domains API 时 出现此错误 不允许访问 Google Domains API 因为用户已同意不兼容的范围 我要求的范围是 https www googleapis
  • Windows Workflow 4 关联查询在实例密钥计算中包含网站实例名称并失败

    我正在尝试在 Azure 上托管一个长时间运行的工作流服务 但我遇到了关联问题 我已将 timeToUnload 和 timeToPersist 设置为 0 并且在工作流程中勾选了 发送前保留 这不是持久性问题 而是与实例键的计算方式有关