- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Azure 上托管一个长时间运行的工作流服务,但我遇到了关联问题。
我已将 timeToUnload 和 timeToPersist 设置为 0,并且在工作流程中勾选了“发送前保留” - 这不是持久性问题,而是与实例键的计算方式有关。
当一台 Web 服务器启动工作流,而另一台 Web 服务器尝试对该工作流执行另一操作时,它会失败并显示
System.ServiceModel.FaultException: The execution of an InstancePersistenceCommand was interrupted because the instance key '12e0b449-7a71-812d-977a-ab89864a272f' was not associated to an instance. This can occur because the instance or key has been cleaned up, or because the key is invalid. The key may be invalid if the message it was generated from was sent at the wrong time or contained incorrect correlation data.
我使用wcf服务诊断来深入研究这个问题,我发现这是因为实例 key 的计算包括网站实例名称,因此给定的工作流实例只能从实例化它的同一台计算机(因为 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 >
重要的一行是:
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'.
此特定工作流实例的 Guid 为 10013d62-286e-4a8f-aeb2-70582591cd7f
,因此工作流引擎根据 496e3207-fe9d-919f- 计算“实例 key ” b1df-f329c5a64934
。我可以在 [System.Activities.DurableInstancing].[InstancesTable]
中看到带有 guid 的工作流实例,并且可以在 [System.Activities.DurableInstancing].[KeysTable] 中看到实例 key
。到目前为止,一切都很好,如果同一台服务器稍后调用同一工作流程,一切都会正常。但是,如果不同服务器尝试访问工作流程,我会收到上面提到的相关错误。再次查看诊断跟踪,我可以看到:
<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 >
重要的一行是
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'.
正如您所看到的,传入的是相同的 Guid,但系统在计算实例 key 时包含了网站实例的名称,因此最终得到了完全不同的实例 key 。
我创建了一个全新的项目来测试这个问题,并发现了完全相同的问题。我觉得我一定是做了一些非常简单的错误,因为我找不到其他人有同样的问题。
最佳答案
几个月后,我找到了解决这个问题的方法。根本问题是 Azure 在每个角色实例上为网站命名不同;该网站不是“默认网站”,而是类似 NewOrbit.ExVerifier.Web_IN_0_Web
的名称(为您的 Web 项目指定了 NewOrbit.ExVerifier.Web 的命名空间)。工作流使用网站名称作为用于计算实例 key 的算法的一部分,因此出现了问题。
解决方案非常简单,在角色启动期间重命名网站,以便在所有实例上调用相同的名称。解决根本问题而不是处理后果,如此明显,我第一次从未见过它。
以下是您可以执行此操作的方法(大致基于此:http://blogs.msdn.com/b/tomholl/archive/2011/06/28/hosting-services-with-was-and-iis-on-windows-azure.aspx)
在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
在ServiceDefinition.csdef
中添加以下内容:
<ServiceDefinition name="WasInAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRole name="WebRole1">
...
<Runtime executionContext="elevated" />
</WebRole>
</ServiceDefinition>
创建一个setup\RoleStart.ps1
文件:
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 替换为您希望在所有服务器上调用该网站的任何内容)。
在网站项目的根目录中创建或编辑 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 连接到它们,您现在应该能够看到该网站在所有实例上的调用方式相同,因此工作流持久性有效。
关于azure - Windows Workflow 4 关联查询在实例 key 计算中包含网站实例名称并失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10536983/
我有一个类似于以下的结构。 class A { string title; List bItem; } class B { int pric
本地流 和 远程流 两者都是“媒体流列表 ”。 本地流 包含“本地媒体流 ” 对象 但是,远程流 包含“媒体流 ” 对象 为什么差别这么大? 当我使用“本地流 “- 这个对我有用: localVide
我正在尝试将 8 列虚拟变量转换为 8 级排名的一列。 我试图用这个公式来做到这一点: =IF(OR(A1="1");"1";IF(OR(B1="1");"2";IF(OR(C1="1");"3";I
我正在使用面向对象编程在 Python 中创建一个有点复杂的棋盘游戏的实现。 我的问题是,许多这些对象应该能够与其他对象交互,即使它们不包含在其中。 例如Game是一个对象,其中包含PointTrac
有没有办法获取与 contains 语句匹配的最深元素? 基本上,如果我有嵌套的 div,我想要最后一个元素而不是父元素: Needle $("div:contains('Needle')")
出于某种原因,我无法在 Google 上找到答案!但是使用 SQL contains 函数我怎么能告诉它从字符串的开头开始,即我正在寻找等同于的全文 喜欢 'some_term%'。 我知道我可以使用
我正在尝试创建一个正则表达式来匹配具有 3 个或更多元音的字符串。 我试过这个: [aeiou]{3,} 但它仅在元音按顺序排列时才有效。有什么建议吗? 例如: 塞缪尔 -> 有效 琼 -> 无效 S
嘿所以我遇到了这样的情况,我从数据库中拉回一个客户,并通过包含的方式包含所有案例研究 return (from c in db.Clients.Include("CaseStudies")
如果关键字是子字符串,我无法弄清楚为什么这个函数不返回结果。 const string = 'cake'; const substring = 'cak'; console.log(string.in
我正在尝试将包含特定文本字符串的任何元素更改为红色。在我的示例中,我可以将子元素变为蓝色,但是我编写“替换我”行的方式有些不正确;红色不会发生变化。我注意到“contains”方法通常写为 :cont
我想问一下我是否可以要求/包含一个语法错误的文件,如果不能,则require/include返回一个值,这样我就知道所需/包含的文件存在语法错误并且不能被要求/包含? file.php语法错误 inc
我想为所有包含youtube链接的链接添加一个rel。 这就是我正在使用的东西-但它没有用。有任何想法吗? $('a [href:contains(“youtube.com”)]')。attr('re
我正在尝试在 Elasticsearch 中查询。除搜索中出现“/”外,此功能均正常运行。查询如下所示 GET styling_rules/product_line_filters/_search {
我正在开发名为eBookRepository的ASP.NET MVC应用程序,其中包含在线图书。 电子书具有自己的标题,作者等。因此,现在我正在尝试实现搜索机制。我必须使用Elasticsearch作
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
我的问题是我可以给出条件[ 'BookTitleMaster.id' => $xtitid, ] 如下所示 $bbookinfs = $this->BookStockin->BookIssue->fi
我需要能够使用 | 检查模式在他们中。例如,对于像“dtest|test”这样的字符串,像 d*|*t 这样的表达式应该返回 true。 我不是正则表达式英雄,所以我只是尝试了一些事情,例如: Reg
我想创建一个正则表达式来不匹配某些单词... 我的字符:var test = "é123rr;and;ià456;or;456543" 我的正则表达式:test.match(\((?!and)(?!o
我在 XSLT 中有一个名为 variable_name 的变量,如果相关产品具有名称为 A 或 B 或两者均为 A & 的属性,我将尝试将其设置为 1 B.
您好,我想让接待员和经理能够查看工作类型和费率并随后进行更新。但是技术人员只能查看不能更新。该图是否有效? 我读到扩展用例是由发起基本用例的参与者发起的。我应该如何区分技术人员只能启动基本案例而不能启
我是一名优秀的程序员,十分优秀!