问候一个人!
我是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在控制台应用程序场景中轻松管理这个,但我看不到通过服务方法做任何明显的方法。我认为显然,添加参考的程序化方法是需要的,但我再次对于如何解决这个问题感到茫然。
非常感谢任何帮助。
祝你好运 伊恩
答案 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)