2

IISでワークフローサービス(xamlx)をホストしています。これには、MethodAやMethodBなどの受信アクティビティがあります。これらのメソッドを呼び出すクライアントとしてMVCアプリケーションを作成しました。PageAでは、ユーザーがフォームを送信するとMethodAが呼び出され、ワー​​クフローはMethodBを待機しているReceiveActivityに移動します。次に、ページBで、ユーザーがフォームを送信すると、MethodBが呼び出されます。ただし、ユーザーがPageAで送信してから、PageAに戻って同じワークフローインスタンスを再度送信すると、1分待って、タイムアウト例外が発生します。

00:01:00以降、応答を待っている間に要求チャネルがタイムアウトしました。Requestの呼び出しに渡されるタイムアウト値を増やすか、BindingのSendTimeout値を増やします。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。

このエラーはWCFに起因するようですが、次のエラーが発生すると思います。

インスタンスキー「guid」がインスタンスに関連付けられていなかったため、InstancePersistenceCommandの実行が中断されました。これは、インスタンスまたはキーがクリーンアップされているか、キーが無効であるために発生する可能性があります。キーが生成されたメッセージが間違った時間に送信された場合、または誤った相関データが含まれている場合、キーは無効である可能性があります。

少し質問があります:

  1. タイムアウト例外がキャッチされるまでしばらく待つのではなく、別の例外をキャッチできるように設定できる構成はありますか?バインディングタグでより小さなタイムアウト値を設定できることは知っていますが、それは解決策ではありません。

  2. ワークフローインスタンスが正しい状態にないときにPageAが表示されないようにする方法はありますか?(これが行われたとしても、ユーザーがPageAを開いて送信する前にしばらくアイドル状態になる可能性があるため、問題1も解決する必要があります)

ありがとう。

4

2 に答える 2

3

Re:タイムアウト例外。

これはWF4の既知のバグです。これは、WF/WCFインフラストラクチャがメッセージを配信しようとするという事実の結果です。つまり、メッセージを少し待って、ワークフローがメッセージを処理できる状態になるかどうかを確認します。インフラストラクチャは、ワークフローの構造を実際には認識していません。したがって、ワークフローが、インフラストラクチャが待機する現在の状態を考えると、メッセージを処理できない状態にあることを十分に認識している場合でもです。

Re:PageAが表示されないようにします。

これは実際にはUIレイヤー次第であり、ワークフローの範囲外です。そして、あなたが指摘したように、完全に避けられないわけではありません。ただし、永続ストアのブックマーク情報を使用することに成功しました。各Receiveアクティビティは、既知の名前のブックマークを作成し、基本的にそこでブックマークをチェックしました。この情報に基づいて、UIの一部を有効/無効にします。ユーザーがページを開いて15分間そのままにしておくという問題は実際には解決されないため、サービスメソッドを呼び出すときにエラーハンドラーが必要になります。これを改善する1つの方法は、HTMLベースのUIをしばらく想定して、WebSocketまたはSignalRを使用することです。より実用的にするために、ワークフローの状態の変更をサーバーからクライアントにプッシュします。それでもエラー処理の必要性を排除することはできませんが、UIが間違った状態にあるウィンドウをはるかに小さくする必要があります。

于 2013-02-07T04:46:04.440 に答える
0

同様の問題が発生したので、モーリスの回答のタイムアウト部分について少し背景を説明したいと思います。

この情報は、このMicrosoftフォーラムスレッドに関するJimCarleyの投稿の1つからのものです。残念ながら、投稿への直接リンクはサポートされていません。「プロトコルブックマーク」を検索してください。ここで重要な部分を要約します。

バックグラウンド

  • すべてのブックマークが同じように作成されるわけではありません。受信アクティビティによって作成されたもの(「プロトコルブックマーク」)は、「非プロトコル」ブックマークとは異なる方法で処理されます。
  • Pickアクティビティは、トリガーが完了したときに再開する非プロトコルブックマークを内部的に作成します。
  • 操作のメッセージを受信し、その操作のプロトコルブックマークがない場合、ワークフローインフラストラクチャは、ワークフローインスタンスに未処理の非プロトコルブックマークがあるかどうかを確認します。

    • 存在する場合、インフラストラクチャはメッセージを保留し、タイムアウトが発生する可能性があります。
    • それ以外の場合、メッセージはすぐに拒否されます。

結論

次のアクティビティはすべて内部ブックマークを作成するため、Receiveアクティビティおよび異常なメッセージングと混合するとタイムアウトの問題が発生する可能性があります。

  • 選ぶ
  • CompensableActivity(および関連するCompensationExtension)
  • 確認
  • 遅れ

Pickの場合、潜在的な回避策は、CompletionConditionをに設定してParallelを使用することtrueです。

于 2015-04-20T14:59:51.747 に答える