1

大家好,

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

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>

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

我看不出发生这种情况的任何其他原因,因此我将不胜感激任何建议。

谢谢

4

3 回答 3

2

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

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

希望这会有所帮助。

于 2009-03-29T22:09:02.173 回答
0

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

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

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

[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 类的定义,也许是别的什么......我希望有更多知识和经验的人能够说出真正的原因......

然而,这个问题被解决了。

于 2009-03-20T15:30:07.667 回答
0

实际上,您不需要删除这些变量,只需将 NonSerialized 属性放在其上

于 2009-05-07T05:43:18.443 回答