1

みなさん、こんにちは。

私はここでかなり奇妙な状況を扱っています。ステート マシン ワークフローを開発しましたが、今日まで問題なく機能していました。現在、Sql Workflow Persistence Service はワークフローの状態を保存しません。状態を保存しないだけで、例外はありません。フローは正常にイベント ドリブン アクティビティに進みます。これは、この記事のリンクをたどることで、ワークフローの状態を保存する必要がある場合の条件の 1 つです (以前は問題なく実行されていました)。

Sql Workflow Persistence Service の構成は次のようになります。

     <workflowRuntime name="WorkfolwServiceHostRuntime" validateOnCreate="true"
        enablePerformanceCounters="true">
        <services>
          <add 
            type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, 
                System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, 
                PublicKeyToken=31bf3856ad364e35" 
             connectionString="Data Source=svr; 
               Initial Catalog=WorkflowPersistence; user id=User;password=Pass; 
               Trusted_Connection=False" LoadIntervalSeconds="1" 
               UnLoadOnIdle="true"/>
          
        </services>
      </workflowRuntime>

おそらく問題は、ワークフロー ランタイムをホストし、同じワークフロー永続化データベースを使用するアプリケーションがもう 1 つあるためです。これが許可されているかどうかについては、情報が見つかりませんでした。

これが起こっている理由が他に見当たらないので、何か提案をいただければ幸いです。

ありがとう

4

3 に答える 3

2

通常、ワークフローはアイドル状態になっても持続します。持続するまでの時間は、ポーリング間隔(作成SQLPersistenceServiceしてランタイムにアタッチするときに指定したもの)などの要因によっても異なります。また、ワークフローで使用されるすべてのもの、特に。ExternalDataEvent引数とイベントは。としてマークする必要がありますSerializable

例外の処理に関しては、ワークフローにFaultHandlersActivityを追加する必要があります。キャッチされた例外は、FaultHandlersActivityとともに公開されるFaultプロパティに保存されます。

お役に立てば幸いです。

于 2009-03-29T22:09:02.173 に答える
0

OK、ついに、何が問題なのかがわかりました。最初の投稿で、最初はすべてが魅力的に機能したが、ワークフローの永続化に影響を与えないように少し変更した後、SQLワークフロー永続化サービスはデータベースに状態を保存できなかったと書きました。

ワークフローをWCFサービスとして公開したことについては触れませんでしたが、この問題を解決するために非常に重要であることがわかりました。情報不足でこの問題を解決しようとした皆さん、お詫び申し上げます。

メソッドWCFサービスコントラクトをポイントしたReceiveActivityを使用しました。そのメソッドには、複合型の戻り値がありました。

[DataContract]
public class ServiceCallInfo
{
    int code;
    [DataMember]
    public int Code
    {
        get { return code; }
        set { code = value; }
    }
    string message;

    [DataMember]
    public string Message
    {
        get { return message; }
        set { message = value; }
    }
}

その戻り値をワークフローの新しいプロパティにバインドしました。

public static DependencyProperty ReturnInfoProperty = DependencyProperty.Register("ReturnInfo", typeof(my.mynamespace.ServiceCallInfo), typeof(my.mynamespace.StandardContractingWorkflow));

    [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
    [BrowsableAttribute(true)]
    [CategoryAttribute("Parameters")]
    public my.mynamespace.ServiceCallInfo ReturnInfo
    {
        get
        {
            return ((my.mynamespace.ServiceCallInfo)(base.GetValue(my.mynamespace.ReturnInfoProperty)));
        }
        set
        {
            base.SetValue(my.mynamespace.ReturnInfoProperty, value);
        }
    }

ワークフローのコードのどこかでこのプロパティをインスタンス化するだけの場合、ワークフローランタイムは状態の保存に失敗し、そうしないと、その状態は適切に保存されます。このプロパティが原因で、何らかの理由で、ワークフローランタイムがワークフロー状態をシリアル化(またはSQLワークフロー永続性サービスを使用して状態を保存するために行うこと)できなかったと思います。

ServiceCallInfoクラスの定義によるものかもしれませんし、何か別のものかもしれません...より多くの知識と経験を持った人が本当の理由を言うことができることを願っています...

ただし、この問題は解決されています。

于 2009-03-20T15:30:07.667 に答える
0

実際には、これらの変数を削除する必要はありません。NonSerialized 属性を配置するだけで済みます。

于 2009-05-07T05:43:18.443 に答える