原文链接:Microsoft Docs
Microsoft Dynamics 365 事件处理子系统根据消息管道执行模型执行插件。Microsoft Dynamics 365 Web 应用程序中的用户操作或者插件或其他应用程序执行的 SDK 方法调用会导致将消息发送到组织 Web 服务。 该消息包含业务实体信息和核心操作信息。 该消息是通过事件执行管道传递的,平台核心操作和任何注册的插件都可以在事件执行管道中读取或修改它。
备注
尽管 Microsoft Dynamics 365 平台托管多个 Web 服务,但只有组织和 OData 端点触发的事件可以导致执行插件。
体系结构和相关组件
下图演示了 Microsoft Dynamics 365 平台的整体体系结构,以及同步和异步事件处理。
同步和异步事件处理关系图
事件执行管道可以通过同步或异步方式处理事件。 平台核心操作和为同步执行注册的所有插件都会立即执行。 为事件注册的同步插件按明确定义的顺序执行。 为异步执行注册的插件由异步队列代理放入队列中并在稍后由异步服务执行。
重要
无论插件同步执行还是异步执行,都会在执行(消息)请求时应用 2 分钟的时间限制。 如果插件逻辑的执行时间超出该时间限制,则会引发 System.TimeoutException。 如果插件需要比 2 分钟更长的处理时间,请考虑使用工作流或其他后台进程来完成预期任务。 此两分钟时间限制仅适用于注册在部分信任模式下执行的插件,也称为"沙盒"。
管道阶段
事件管道分为多个阶段,其中有 4 个阶段可用于注册自定义开发的插件或第三方插件。 在插件注册期间可以进一步在每个阶段对在该阶段中注册的多个插件进行排序(排名)
重要活动 | 阶段名称 | 阶段编号 | 说明 |
---|---|---|---|
前期事件 | 预验证 | 10 | 管道中的一个阶段,其中的插件在主系统操作之前执行。 在此阶段注册的插件可能会在数据库事务外部执行。前期验证阶段在要执行的安全检查之前发生,以验证发出调用的用户或登录用户是否具有执行预期操作所需的正确权限。 |
前期事件 | 预操作 | 20 | 管道中的一个阶段,其中的插件在主系统操作之前执行。 在此阶段注册的插件将在数据库事务内部执行。 |
平台核心操作 | 主操作 | 30 | 系统的事务内主操作,例如创建、更新和删除等等。 在该阶段中不可以注册自定义插件。仅供内部使用。 |
后期事件 | 后操作 | 40 | 管道中的一个阶段,其中的插件在主系统操作之后执行。 在此阶段注册的插件将在数据库事务内部执行。 |
消息处理
当应用程序代码或工作流调用 Microsoft Dynamics 365 Web 服务方法时,会更改系统中的状态,这将引发一个事件。 作为参数传递到 Web 服务方法的信息会在内部打包成 OrganizationRequest 消息,并由管道处理。OrganizationRequest 消息中的信息会传递到为该事件注册的第一个插件,且在传递到该事件的下一个注册插件之前可以对其读取或修改,依次类推。 插件会以传递到 Execute 方法的上下文的形式接收消息信息。 该消息也会传递到平台核心操作。
插件注册
可以在核心平台操作之前或之后注册要执行的插件。 前期事件注册的插件会首先接收 **OrganizationRequest **消息,并且在将该消息传递到核心操作之前可以修改该消息信息。 核心平台操作完成后,该消息则称为 OrganizationResponse。 响应会传递到注册的后期事件插件。 后期事件插件可以在响应的副本传递到任何注册的异步插件之前修改消息。 最后,响应返回到调用原始 Web 服务方法调用的应用程序或工作流。
因为单个 Microsoft Dynamics 365 服务器可以承载多个组织,所以执行管道是特定于组织的。 每个组织都有一个虚拟管道。 使用该管道注册的插件仅能处理单个组织的业务数据。 可处理多个组织的插件必须使用每个组织的执行管道进行注册。
在数据库事务中执行
插件可以在也可以不在 Microsoft Dynamics 365 平台的数据库事务中执行。 插件是否是事务的一部分取决于管道处理消息请求的方式。 您可以通过读取传递给插件的 IPluginExecutionContext 所继承的 IsInTransaction 属性,检查插件是否正在事务中执行。 如果插件正在数据库事务中执行,并且允许将例外传递回到平台,则整个交易将回滚。 阶段 20 和 40 一定是数据库事务的一部分,而阶段 10 可以是事务的一部分。
在数据库事务中执行并且将异常传递回平台的任何注册插件都会取消平台操作。 这会导致核心操作回滚。 此外,尚未执行的任何前期事件或后期事件注册插件以及为其注册插件的同一事件触发的任何工作流都不会执行。