1

Azure で実行時間の長いワークフロー サービスをホストしようとしていますが、関連付けに問題があります。
timeToUnload と timeToPersist を 0 に設定し、ワークフローで「送信前に保持」にチェックを入れました。これは永続性の問題ではなく、インスタンス キーの計算方法に関係しています。

ある Web サーバーがワークフローを開始し、別の Web サーバーがワークフローで別のアクションを実行しようとすると、次のエラーで失敗します。

System.ServiceModel.FaultException: インスタンス キー '12e0b449-7a71-812d-977a-ab89864a272f' がインスタンスに関連付けられていなかったため、InstancePersistenceCommand の実行が中断されました。これは、インスタンスまたはキーがクリーンアップされたか、キーが無効であるために発生する可能性があります。キーが生成されたメッセージが間違った時間に送信された場合、または誤った相関データが含まれていた場合、キーが無効である可能性があります。

wcf サービス診断を使用してこれを詳しく調べたところ、インスタンス キーの計算にWeb サイト インスタンス名が含まれているため、特定のワークフロー インスタンスは、それをインスタンス化したのと同じマシンからのみ呼び出すことができることがわかりました ( Azure が設定したため)。役割インスタンスごとに異なる Web サイト インスタンス名)。

説明すると、ワークフローの新しいインスタンスを作成するときに、ワークフロー インスタンス 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]が表示され、インスタンス キーが に表示され[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 が渡されますが、システムはインスタンス キーの計算に Web サイト インスタンスの名前を含めるため、完全に異なるインスタンス キーになります。

これをテストするためにまったく新しいプロジェクトを作成しましたが、まったく同じ問題が見つかりました。同じ問題を抱えている人を他に見つけることができないので、私は非常に単純な間違ったことをしているに違いないと感じています。

4

5 に答える 5

4

数か月後、この問題の解決策を見つけました。根本的な問題は、Azure が Web サイトにロール インスタンスごとに異なる名前を付けていることです。NewOrbit.ExVerifier.Web_IN_0_Web「既定の Web サイト」ではなく、Web サイトは(NewOrbit.ExVerifier.Web の Web プロジェクトの名前空間を指定して) のように呼ばれます。ワークフローは、インスタンス キーの計算に使用されるアルゴリズムの一部として Web サイト名を使用するため、問題が発生します。

解決策は非常に単純で、ロールの起動時に Web サイトの名前を変更して、すべてのインスタンスで同じものと呼ばれるようにすることです。結果を処理するのではなく、根本的な問題を修正するので、最初は見たことがありませんでした。

これを行う方法は次のとおりです(これに基づいています:http://blogs.msdn.com/b/tomholl/archive/2011/06/28/hosting-services-with-was-and-iis-on-windows -azure.aspx )

IIS の構成後に変更を加えることができるように、powershell を構成してアクセス権を昇格させます。

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

Role OnStart を管理者権限を持つように構成する

これServiceDefinition.csdefを追加します:

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

Web サイトの名前を変更するための PowerShell スクリプトを作成する

ファイルを作成し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 を、すべてのサーバーで Web サイトを呼び出したいものに置き換えます)。

ロールの開始時に RoleStart.ps1 を実行します。

Web サイト プロジェクトのルートで 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 でそれらに接続すると、Web サイトがすべてのインスタンスで同じように呼び出され、ワー​​クフローの永続性が機能していることがわかります。

于 2012-08-19T20:50:16.027 に答える
1

これは、Web ロールでワークフロー サービスを実行する際の問題のようです。回避策は、同じ問題を抱えていないワーカー ロールでワークフロー サービスを実行することです。

于 2012-05-13T18:13:04.860 に答える
0

ワークフローの永続化についてよく知りません。しかし、他の人は、SQL Azure を WF 永続化で正常に動作させたと報告しています 。http://social.msdn.microsoft.com/Forums/en-US/ssdsgetstarted/thread/2dac9194-0067- 4e16-8e95-c15a72cb0069/およびhttp://www.theworkflowelement.com/2011/05/wf-persistence-on-sql-azure.htmlが役立つかどうかを確認してください。

よろしくお願いします、

明徐。

于 2012-05-11T08:46:29.937 に答える
0

WF と WCF は初めてですが、独自のインスタンス ストアを構築できるかどうか疑問に思っていました。

これにより、InstanceKey をオーバーライドして、独自に計算できるようになります。

インターネット上にはかなりの数の例があります。

于 2012-05-15T21:25:51.563 に答える