Sql Workflow Persistence Service不保存工作流状态

时间:2009-03-18 17:05:05

标签: .net persistence workflow-foundation

大家好,

我正在处理一个非常奇怪的情况。我已经开发了一个状态机工作流程,它工作得很好,直到今天。 现在,Sql Workflow Persistence Service不会保存工作流状态。没有任何例外,只是它没有保存状态。流程通常是事件驱动的活动,通过遵循本文link,必须保存工作流状态的条件之一(它之前做得很好)。

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>

也许问题是因为还有一个应用程序承载工作流运行时并使用相同的工作流持久性数据库。如果允许或不允许,我找不到任何信息。

我无法看到任何其他原因导致这种情况发生,所以我将不胜感激任何建议。

由于

3 个答案:

答案 0 :(得分:2)

通常,工作流在空闲时保持不变。它持续多久还取决于诸如轮询间隔(您在创建SQLPersistenceService时将提供并将其附加到运行时)等因素。)此外,工作流使用的所有内容,尤其是。 ExternalDataEvent args和事件应标记为Serializable

关于处理异常,您应该将FaultHandlersActivity添加到工作流中,并且捕获的异常将保存在与FaultHandlersActivity一起公开的Fault属性中。

希望这有帮助。

答案 1 :(得分:0)

好的,最后,我发现了问题所在。 在第一篇文章中,我写道,起初所有工作都很有吸引力,但经过一些小的改动后,这不应该影响工作流的持久性,Sql Workflow Persistence Service无法将状态保存在数据库中。

我没有提到我公开的工作流作为WCF服务,事实证明这对解决这个问题至关重要。我向所有试图解决这种缺乏信息的人道歉。

我使用了我指向WCF服务合同方法的Receive Activity。该方法具有复杂类型的返回值:

[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);
        }
    }

如果我只在工作流代码中的某处实例化此属性,则Workflow Runtime无法保存状态,如果我不这样做,则状态保存正确! 我认为,出于某种原因,由于此属性,Workflow Runtime无法序列化(或使用Sql Workflow Persistence Service保存状态的任何工作)。

也许是因为ServiceCallInfo类的定义,也许是其他的...... 我希望有更多知识和经验的人能说出真正的原因......

然而,这个问题已经解决了。

答案 2 :(得分:0)

实际上你不需要删除那些变量,只需要在其上放置NonSerialized属性