Workflow 试图让持久性参与者升级到WF4中的xamlx服务

Workflow 试图让持久性参与者升级到WF4中的xamlx服务,workflow,workflow-foundation-4,Workflow,Workflow Foundation 4,我已经实施了工作流持久性参与者促销,正如Microsoft网站上所示:http://msdn.microsoft.com/en-us/library/ee364726%28VS.100%29.aspx 虽然一切看起来都很正常。我在查询时没有看到数据保存到数据库?我想我错过了一步,或者微软错过了什么 我正在使用工作流应用程序.xamlx服务,我已覆盖WorkflowServiceHost。这一切似乎都很好,所以我不确定问题出在哪里 所以我这里的问题是,有没有人有一个真正的工作示例来说明如何实现持久

我已经实施了工作流持久性参与者促销,正如Microsoft网站上所示:http://msdn.microsoft.com/en-us/library/ee364726%28VS.100%29.aspx 虽然一切看起来都很正常。我在查询时没有看到数据保存到数据库?我想我错过了一步,或者微软错过了什么

我正在使用工作流应用程序.xamlx服务,我已覆盖WorkflowServiceHost。这一切似乎都很好,所以我不确定问题出在哪里

所以我这里的问题是,有没有人有一个真正的工作示例来说明如何实现持久性参与者

我试过几种不同的方法

  • 安德鲁·朱来了
  • 微软样品
但我似乎无法让它发挥作用

仅供参考,当我更改xnamespaces以匹配时,此代码有效。多亏了莫里斯

WorkflowServiceHost代码:

public class ServiceHostFactory :WorkflowServiceHostFactory
{
    private static readonly string m_connectionString =
            "Data Source=localhost;Initial Catalog=WorkflowInstanceStore;Integrated Security=True";

    protected override WorkflowServiceHost CreateWorkflowServiceHost(Activity activity, Uri[] baseAddresses)
    {

        return base.CreateWorkflowServiceHost(activity, baseAddresses);

    }

    protected override WorkflowServiceHost CreateWorkflowServiceHost(WorkflowService service, Uri[] baseAddresses)
    {

        WorkflowServiceHost host = base.CreateWorkflowServiceHost(service, baseAddresses);
        host.DurableInstancingOptions.InstanceStore = SetupInstanceStore();

        SqlWorkflowInstanceStoreBehavior sqlWorkflowInstanceStoreBehavior = new SqlWorkflowInstanceStoreBehavior(m_connectionString);
        XNamespace xNS = XNamespace.Get("http://contoso.com/DocumentStatus");
        List<XName> variantProperties = new List<XName>() 
        { 
           xNS.GetName("UserName"), 
           xNS.GetName("ApprovalStatus"), 
           xNS.GetName("DocumentId"), 
           xNS.GetName("LastModifiedTime") 
        };
        sqlWorkflowInstanceStoreBehavior.Promote("DocumentStatus", variantProperties, null);
        host.Description.Behaviors.Add(sqlWorkflowInstanceStoreBehavior);

        //Add persistence extension here:
        host.WorkflowExtensions.Add<DocumentStatusExtension>(()=>new DocumentStatusExtension());;
        host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });            

        // Handle the UnknownMessageReceived event.
        host.UnknownMessageReceived += delegate(object sender, UnknownMessageReceivedEventArgs e)
        {
            Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "Unknow Message Recieved:{0}", e.Message));
        };


        return host;
    }

    private static SqlWorkflowInstanceStore SetupInstanceStore()
    {


        SqlWorkflowInstanceStore sqlWorkflowInstanceStore = new SqlWorkflowInstanceStore(m_connectionString)
        {
            InstanceCompletionAction = InstanceCompletionAction.DeleteAll,
            InstanceLockedExceptionAction = InstanceLockedExceptionAction.BasicRetry,
            HostLockRenewalPeriod = System.TimeSpan.Parse("00:00:05")
        };
        InstanceHandle handle = sqlWorkflowInstanceStore.CreateInstanceHandle();



        //InstanceHandle handle = sqlWorkflowInstanceStore.CreateInstanceHandle();
        //InstanceView view = sqlWorkflowInstanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
        //handle.Free();
        //sqlWorkflowInstanceStore.DefaultInstanceOwner = view.InstanceOwner;

        return sqlWorkflowInstanceStore;
    }
公共类ServiceHostFactory:WorkflowServiceHostFactory
{
私有静态只读字符串m_connectionString=
“数据源=本地主机;初始目录=WorkflowInstanceStore;集成安全性=True”;
受保护的覆盖WorkflowServiceHost CreateWorkflowServiceHost(活动活动,Uri[]基本地址)
{
返回base.CreateWorkflowServiceHost(活动,基本地址);
}
受保护的覆盖WorkflowServiceHost CreateWorkflowServiceHost(WorkflowService服务,Uri[]基本地址)
{
WorkflowServiceHost主机=base.CreateWorkflowServiceHost(服务,基本地址);
host.durableInstanceStore=SetupInstanceStore();
SqlWorkflowInstanceStoreBehavior SqlWorkflowInstanceStoreBehavior=新的SqlWorkflowInstanceStoreBehavior(m_connectionString);
XNamespace xNS=XNamespace.Get(“http://contoso.com/DocumentStatus");
列表变量属性=新列表()
{ 
xNS.GetName(“用户名”),
xNS.GetName(“ApprovalStatus”),
xNS.GetName(“DocumentId”),
xNS.GetName(“LastModifiedTime”)
};
sqlWorkflowInstanceStoreBehavior.Promote(“DocumentStatus”,variantProperties,null);
host.Description.Behaviors.Add(sqlWorkflowInstanceStoreBehavior);
//在此处添加持久性扩展:
host.WorkflowExtensions.Add(()=>newdocumentstatusextension());;
host.Description.Behaviors.Add(新ServiceMetadataBehavior(){HttpGetEnabled=true});
//处理未知消息接收事件。
host.UnknownMessageReceived+=委托(对象发送方,UnknownMessageReceivedEventArgs e)
{
WriteLine(string.Format(CultureInfo.InvariantCulture,“收到的未知消息:{0}”,e.Message));
};
返回主机;
}
私有静态SqlWorkflowInstanceStore设置InstanceStore()
{
SqlWorkflowInstanceStore SqlWorkflowInstanceStore=新SqlWorkflowInstanceStore(m_connectionString)
{
InstanceCompletionAction=InstanceCompletionAction.DeleteAll,
InstanceLockedExceptionAction=InstanceLockedExceptionAction.BasicRetry,
HostLockRenewalPeriod=System.TimeSpan.Parse(“00:00:05”)
};
InstanceHandle=sqlWorkflowInstanceStore.CreateInstanceHandle();
//InstanceHandle=sqlWorkflowInstanceStore.CreateInstanceHandle();
//InstanceView视图=sqlWorkflowInstanceStore.Execute(句柄,新建CreateWorkflowOwnerCommand(),TimeSpan.FromSeconds(30));
//handle.Free();
//sqlWorkflowInstanceStore.DefaultInstanceOwner=view.InstanceOwner;
返回sqlWorkflowInstanceStore;
}
DocumentStatusExtension代码:

        public string DocumentId;
    public string ApprovalStatus;
    public string UserName;
    public DateTime LastUpdateTime;

    private XNamespace xNS = XNamespace.Get("http://contoso.com/");

    protected override void CollectValues(out IDictionary<XName, object> readWriteValues, out IDictionary<XName, object> writeOnlyValues)
    {
        readWriteValues = new Dictionary<XName, object>();
        readWriteValues.Add(xNS.GetName("UserName"), this.UserName);
        readWriteValues.Add(xNS.GetName("ApprovalStatus"), this.ApprovalStatus);
        readWriteValues.Add(xNS.GetName("DocumentId"), this.DocumentId);
        readWriteValues.Add(xNS.GetName("LastModifiedTime"), this.LastUpdateTime);

        writeOnlyValues = null;
    }

    protected override IDictionary<XName, object> MapValues(IDictionary<XName, object> readWriteValues, IDictionary<XName, object> writeOnlyValues)
    {
        return base.MapValues(readWriteValues, writeOnlyValues);
    }
public sealed class UpdateExtension : CodeActivity
{
    // Define an activity input argument of type string
    public InArgument<string> Text { get; set; }

    // If your activity returns a value, derive from CodeActivity<TResult>
    // and return the value from the Execute method.
    protected override void Execute(CodeActivityContext context)
    {
        // Obtain the runtime value of the Text input argument
        context.GetExtension<DocumentStatusExtension>().DocumentId = Guid.NewGuid().ToString();
        context.GetExtension<DocumentStatusExtension>().UserName = "John Smith";
        context.GetExtension<DocumentStatusExtension>().ApprovalStatus = "Approved";
        context.GetExtension<DocumentStatusExtension>().LastUpdateTime = DateTime.Now;
    }
}
公共字符串DocumentId;
公共字符串批准状态;
公共字符串用户名;
公共日期时间LastUpdateTime;
私有XNamespace xNS=XNamespace.Get(“http://contoso.com/");
受保护的重写无效集合值(out IDictionary readWriteValues,out IDictionary writeOnlyValues)
{
readWriteValues=新字典();
readWriteValues.Add(xNS.GetName(“用户名”)、this.UserName);
readWriteValues.Add(xNS.GetName(“ApprovalStatus”)、this.ApprovalStatus);
readWriteValues.Add(xNS.GetName(“DocumentId”)、this.DocumentId);
readWriteValues.Add(xNS.GetName(“LastModifiedTime”)、this.LastUpdateTime);
writeOnlyValues=null;
}
受保护的重写IDictionary映射值(IDictionary readWriteValues、IDictionary writeOnlyValues)
{
返回base.MapValues(readWriteValues,writeOnlyValues);
}
UpdateExtension代码:

        public string DocumentId;
    public string ApprovalStatus;
    public string UserName;
    public DateTime LastUpdateTime;

    private XNamespace xNS = XNamespace.Get("http://contoso.com/");

    protected override void CollectValues(out IDictionary<XName, object> readWriteValues, out IDictionary<XName, object> writeOnlyValues)
    {
        readWriteValues = new Dictionary<XName, object>();
        readWriteValues.Add(xNS.GetName("UserName"), this.UserName);
        readWriteValues.Add(xNS.GetName("ApprovalStatus"), this.ApprovalStatus);
        readWriteValues.Add(xNS.GetName("DocumentId"), this.DocumentId);
        readWriteValues.Add(xNS.GetName("LastModifiedTime"), this.LastUpdateTime);

        writeOnlyValues = null;
    }

    protected override IDictionary<XName, object> MapValues(IDictionary<XName, object> readWriteValues, IDictionary<XName, object> writeOnlyValues)
    {
        return base.MapValues(readWriteValues, writeOnlyValues);
    }
public sealed class UpdateExtension : CodeActivity
{
    // Define an activity input argument of type string
    public InArgument<string> Text { get; set; }

    // If your activity returns a value, derive from CodeActivity<TResult>
    // and return the value from the Execute method.
    protected override void Execute(CodeActivityContext context)
    {
        // Obtain the runtime value of the Text input argument
        context.GetExtension<DocumentStatusExtension>().DocumentId = Guid.NewGuid().ToString();
        context.GetExtension<DocumentStatusExtension>().UserName = "John Smith";
        context.GetExtension<DocumentStatusExtension>().ApprovalStatus = "Approved";
        context.GetExtension<DocumentStatusExtension>().LastUpdateTime = DateTime.Now;
    }
}
公共密封类更新扩展:CodeActivity
{
//定义字符串类型的活动输入参数
公共非语法文本{get;set;}
//如果活动返回值,则从CodeActivity派生
//并从Execute方法返回值。
受保护的覆盖无效执行(CodeActivityContext上下文)
{
//获取文本输入参数的运行时值
context.GetExtension().DocumentId=Guid.NewGuid().ToString();
context.GetExtension().UserName=“John Smith”;
context.GetExtension().ApprovalStatus=“已批准”;
context.GetExtension().LastUpdateTime=DateTime.Now;
}
}

我已经让它们工作了,不幸的是,我现在没有可以共享的示例代码。PersistenceParticipant可能会有点棘手,因为所有涉及的XName都必须匹配。此外,使用布尔值会在没有警告的情况下停止整个过程,因此请确保避免使用布尔值

更新: 您在代码中使用了不同的XML名称空间。CreateWorkflowServiceHost()用于定义属性提升,CollectValues()用作收集的值的XML名称空间。两者应该相同。

我让它们工作,u