工作流加载及本地通信服务常见的异常
2008-08-15 17:59
337 查看
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();
}
异常信息:未处理 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();
}
相关文章推荐
- 工作流编程循序渐进(9:使用本地服务在宿主和工作流之间通信)
- 容器本地启动要把提供的服务加载进去
- Android--建立能与访问者进行相互通信的本地服务
- ReactNative Webview加载本地html异常问题
- 服务 在初始化安装时发生异常:System.IO.FileNotFoundException: "file:///D:\testService"未能加载文件或程序集。系统找不到指定文件。
- WF4.0:工作流服务异常处理
- 为了使CallExternalMethod活动工作,我们需要在工作流Runtime中添加一个ExternalDataExchangeService,然后再向ExternalDataExchangeService中添加一个本地服务BugFlowService
- android后台服务service全解析(上)--service的使用与本地通信
- JVM类加载过程中抛出的常见异常
- 服务 在初始化安装时发生异常:System.IO.FileNotFoundException: 未能加载文件或******
- skynet框架应用 (七) 本地服务间消息通信
- java网络编程Socket通信常见异常
- Android--建立能与访问者进行相互通信的本地服务
- air加载本地swf并与之通信
- 工作流学习过程-本地服务之事件处理
- Maven -- 使用插件打包时,提示java编译异常,但是本地服务可以正常运行
- WF4.0:工作流服务异常处理
- Android:Service:与Activity进行相互通信的本地服务
- Android建立能与Activity进行相互通信的本地服务
- 常见异常——tomcat服务 localhost可以访问,ip无法访问解决办法