Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Sql工作流持久性服务不保存工作流状态_.net_Persistence_Workflow Foundation - Fatal编程技术网

.net Sql工作流持久性服务不保存工作流状态

.net Sql工作流持久性服务不保存工作流状态,.net,persistence,workflow-foundation,.net,Persistence,Workflow Foundation,大家好 我正在处理一个非常奇怪的情况。我已经开发了一个状态机工作流程,直到今天它还运行得很好。 现在,Sql工作流持久性服务不会保存工作流状态。没有任何例外,只是它不保存状态。流程通常会转到事件驱动的活动,这是必须保存工作流状态的条件之一(之前它做得很好) Sql工作流持久性服务的配置如下所示: <workflowRuntime name="WorkfolwServiceHostRuntime" validateOnCreate="true"

大家好

我正在处理一个非常奇怪的情况。我已经开发了一个状态机工作流程,直到今天它还运行得很好。 现在,Sql工作流持久性服务不会保存工作流状态。没有任何例外,只是它不保存状态。流程通常会转到事件驱动的活动,这是必须保存工作流状态的条件之一(之前它做得很好)

Sql工作流持久性服务的配置如下所示:

     <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>

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

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


谢谢

好的,我终于发现了问题所在。 在第一篇文章中,我写道,起初一切都很顺利,但在做了一些小改动之后,这不应该影响工作流的持久化,Sql工作流持久化服务无法将状态保存到数据库中

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

我使用了Receive活动,该活动指向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);
        }
    }
如果我只在工作流代码中的某个地方实例化此属性,工作流运行时将无法保存状态,如果我不这样做,状态将正确保存! 我假设,由于某种原因,工作流运行时无法序列化(或使用Sql工作流持久性服务保存状态所做的任何操作)工作流状态,因为此属性

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


但是,此问题已得到解决。

通常,当工作流变为空闲时,它将被持久化。它被持久化的速度还取决于轮询间隔(您在创建
SQLPersistenceService
并将其附加到运行时时会提供轮询间隔)等因素。此外,工作流使用的所有内容,尤其是ExternalDataEvent参数和事件都应标记为可序列化的

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


希望这会有帮助。

实际上,您不需要删除这些变量,只需在其

WorkfolwServiceHostRuntime上添加非序列化属性即可。不,看起来像一个,但不是..我将ServiceCallInfo标记为可序列化,它可以正常工作。显然,用DataContract属性标记类是不够的,还需要Serializable属性。谢谢你,苏格拉底,这是问题的真正解决办法。当做