为工作流服务提供工作流扩展 - WF 4.0

时间:2011-02-09 10:31:06

标签: wcf workflow-foundation workflowservice

问候一个人!

我是WF 4.0和WWF的新手,所以请原谅我,如果这似乎是一个新手类型的问题,但相信我,我已经在互联网的深处搜寻解决这个问题,但无济于事

我创建了一个带有自定义CodeActivity的示例WF应用程序,需要提供扩展,如下所示:

public sealed class PreparePizza : CodeActivity
{
    public InArgument<Order> Order { get; set; }

    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);

        if (this.Order == null)
            metadata.AddValidationError("You must supply an Order.");

        metadata.RequireExtension<IPreparePizzaExtension>();
    }
    // 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
        Order order = context.GetValue(this.Order);
        var extension = context.GetExtension<IPreparePizzaExtension>();
        extension.Prepare(order);
    }
}

public interface IPreparePizzaExtension
{
    void Prepare(Order order);
}

然后我将此活动插入工作流服务,并尝试通过添加服务引用来通过我的Web应用程序进行消费。但是,当我添加引用时,我得到:

  

System.Activities.ValidationException:必须配置“PizzaMan.ActivityLibrary.IPreparePizzaExtension”类型的扩展名才能运行此工作流程。

足够公平 - 当然我的活动要求我传递一个IPreparePizzaExtension的实现 - 毕竟,我告诉它了!

所以我的问题是,我该如何将其传递给服务?我可以使用WorkflowInvoker在控制台应用程序场景中轻松管理这个,但我看不到通过服务方法做任何明显的方法。我认为显然,添加参考的程序化方法是需要的,但我再次对于如何解决这个问题感到茫然。

非常感谢任何帮助。

祝你好运 伊恩

4 个答案:

答案 0 :(得分:7)

WorkflowServiceHost具有WorkflowExtensions属性,您可以在其中添加工作流扩展。有几种方法可以做到这一点。如果您是自托管,那么在创建WorkflowServiceHost时这很容易。如果您使用IIS,则需要创建ServiceHostFactory来配置WorkflowServiceHost。最后,可以使用metadata.AddDefaultExtensionProvider()函数在您的活动的CacheMetadata中添加工作流扩展。

答案 1 :(得分:0)

解决方法如下,自托管风格:

    static void Main(string[] args)
    {
        Workflow1 workflow = new Workflow1();
        // Provide some default values; note: these will be overriden once method on the service is called.
        workflow.productID = -1;

        Uri address = new Uri("http://localhost:1234/WorkflowService1");
        WorkflowServiceHost host = new WorkflowServiceHost(workflow, address);

        // Behaviours
        host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
        host.Description.Behaviors.Remove(typeof(ServiceDebugBehavior));
        host.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });

        // Persistence
        var connStr = @"";
        var behavior = new SqlWorkflowInstanceStoreBehavior(connStr);
        behavior.InstanceCompletionAction = InstanceCompletionAction.DeleteNothing;
        behavior.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry;
        behavior.InstanceEncodingOption = InstanceEncodingOption.None;
        host.Description.Behaviors.Add(behavior);

        // Add extension implementations
        if (!TEST_MODE)
        {
            host.WorkflowExtensions.Add(new MyExtension());                
        }
        else
        {
            host.WorkflowExtensions.Add(new MyExtensionTest());
        }

        host.Faulted += new EventHandler(host_Faulted);

        host.Open();

        foreach (System.ServiceModel.Description.ServiceEndpoint endpoint in host.Description.Endpoints)
        {
            Console.WriteLine(endpoint.Address);
        }

        Console.WriteLine("Listening...");
        Console.ReadLine();
        host.Close();
    }

答案 2 :(得分:-1)

答案 3 :(得分:-1)