工作流加载及本地通信服务常见的异常

1、从Xoml文件加载工作流时runtime.CreateWorkflow(XmlTextReader.Create("workflow.xoml");
异常信息:未处理 System.Workflow.ComponentModel.Compiler.WorkflowValidationFailedException  Message="工作流验证失败。"
实质错误为:在未创建新 Activity 类型的情况下直接执行标记时不能使用 "x:Code" / "x:Class"。
处理方式为:删除x:Class/x:Code结点内容;例如下面xoml文件内容的x:Code就无法加载:

< SequentialWorkflowActivity  xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"  xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/workflow" >   < CodeActivity  x:Name ="codeActivity1"  ExecuteCode ="SayHello"   />     < x:Code > <![CDATA[    private int _amount = 500;          public int Amount          {              get { return _amount; }              set { _amount = value; }          }          private void SayHello(object sender, EventArgs e)          {            Console.WriteLine("Hello, workflow!");            Console.ReadKey();          }    ]]> </ x:Code >    </ SequentialWorkflowActivity >

2、本地通信服务定义的事件被客户端订阅时需要将触发事件的Sender参数必须设置为null,否则将报错如下:
无法为实例 ID“a7f482a5-dc7d-4700-b17a-7cf6c3dc8ffd”传递接口类型“OrderWorkflowLibrary.IOrderService”上的事件“OrderRequested”。
实质错误为:EventArgs 不可序列化 

    [ExternalDataExchange]
    
public   interface  IOrderService
    {
        
event  EventHandler < OrderEventArgs >  OrderRequested;     // 工作流定义中HandleExternalEventActivity活动中指定的外部事件
         void  NotifyOrderIdled(Guid instanceId,  string  userId);     // 工作流定义中CallExternalMethodActivity活动中指定的外部方法
    }

    [Serializable]
    
public   class  OrderService : IOrderService
    {
        
public   event  EventHandler < OrderEventArgs >  OrderRequested;
        
public   void  RaiseOrderRequestedEvent(Guid instanceId,  string  userId)
        {
            
if  (OrderRequested  !=   null )
            {
                OrderEventArgs e 
=   new  OrderEventArgs(instanceId, userId);
                OrderRequested(
this , e);     // 需要改为:OrderRequested(null, e);
            }
        }
        
        
public   event  EventHandler < OrderIdledEventArgs >  OrderIdled;     // 被客户代码订阅的事件
         public   void  NotifyOrderIdled(Guid instanceId,  string  userId)
        {
            
if  (OrderIdled  !=   null )
            {
                OrderIdledEventArgs e 
=   new  OrderIdledEventArgs(instanceId, userId);
                OrderIdled(
this , e);     // 这里的事件是发布给客户代码而不是工作流故没有问题
            }
        }
    }

客户端调用工作流代码:

         private   void  StartOrderWorkflow()
        {
            _workflowRuntime 
=   new  WorkflowRuntime();
            _externalDataExchangeService 
=   new  ExternalDataExchangeService();
            _workflowRuntime.AddService(_externalDataExchangeService);

            _OrderService 
=   new  OrderService();
            _OrderService.OrderIdled 
+=   new  EventHandler < OrderIdledEventArgs > (_OrderService_OrderIdled);
            _externalDataExchangeService.AddService(_OrderService);

            _workflowRuntime.StartRuntime();
            _workflowInstance 
=  _workflowRuntime.CreateWorkflow( typeof (OrderWorkflow));
            _workflowInstance.Start();
        }

   

转载于:https://www.cnblogs.com/chriskwok/archive/2008/08/15/1268899.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值