- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Microsoft Dynamics CRM 4.0 中创建插件时,您可以使用以下方法检查导致插件触发的事件的来源。
public void Execute(IPluginExecutionContext context)
{
if (context.CallerOrigin.GetType() == CallerOrigin.WebServiceApi.GetType())
{
return;
}
plugin code here...
}
这将允许您检查该操作是否由表单中的用户、Web 服务或工作流等引起...
我有一个通过 WCF 创建和更新实体的同步应用程序,并且不希望插件在发生这种情况时执行,仅在用户编辑实体时执行(以防止同步过程中的无限循环)。
IExecutionContext.CallerOrigin
已在 MS Dynamics CRM 2011 中删除,那么执行此操作的新方法是什么?
我在想可能有一种方法可以在 WCF 调用中设置 IExecutionContext.CorrelationId
,然后检查插件中的特定 Guid,但我没有成功还没有。
最佳答案
虽然这似乎已经被问过一段时间了(而且我认为 OP 现在已经找到了他的解决方案!)我最近偶然发现了它来寻找类似的答案。需要进一步研究才能找出我需要什么,因此我也将其添加到此处以供遇到它的任何其他人使用。
首先,如果您正在寻找它,这个属性已经过时了。据说是因为它不可靠,但我们需要 MSCRM 4.0 中的 CallerOrigin 有几个原因。另一方面,也有一些方法可以解决这个问题:
防止无限循环(超过 2 个插件)
这就是我寻找 CallerOrigin 以及我是如何遇到这个问题的原因。我只希望插件在来自表单上的用户时触发,而不是来自另一个插件(即异步进程/网络服务)。在我的例子中,它是“超过 2 个插件”的区别非常重要,因为我无法使用 InputParameters 来解决问题。我的示例类似于以下内容:
为“父”实体更新插件。如果父实体上名为“状态”的选项集设置为“已批准”,我随后想将所有子实体的状态也设置为“已批准”。
为“子”实体更新插件。如果子实体上名为“状态”的选项集设置为“已批准”,并且同一父项的所有其他子项都将此设置为“已批准”,我也需要将父项的状态更新为已批准。
如果您不保护自己免受它的影响,这将导致无限循环。您也不能使用 InputParameters 来解决它。一种基本解决方案是使用深度检查:
context.PluginExecutionContext.Depth
如果它大于 1,则它已被另一个插件/工作流调用。注意:如果您有一个触发初始更新的工作流,您可能需要小心检查要检查的值。
防止离线客户端出现同步问题
我们被赋予了不同的属性来帮助我们区分这些属性。请改用这些:
context.PluginExecutionContext.IsExecutingOffline
context.PluginExecutionContext.IsOfflinePlayback
根据来源的不同做出不同的 react
好的,所以这是我们真正需要 CallerOrigin 的唯一场景。我认为您能够做到这一点的唯一方法是检查 PluginExecutionContext 本身的类型。我知道异步是这样的:
Microsoft.Crm.Asynchronous.AsyncExecutionContext
对于插件来说,它似乎是:
Microsoft.Crm.Extensibility.PipelineExecutionContext
不确定来自外部源时它是什么,不幸的是,我目前没有任何可用代码来测试和解决这个问题。除了您可能需要检查的所有内容之外:
PluginExecutionContext.ParentContext
我遇到的用于检测更新来源的唯一其他方法是在表单上使用自定义标志。因此,您可以使用以下选项创建一个名为“OriginOfChange”(或类似名称)的 OptionSet
然后在更新期间更新实体设置此字段。通过这种方式,您可以每次检查输入参数以查看更新的来源。
如果您需要根据来源做出不同 react ,最后一种方法很可能是最安全的。
关于c# - 如何防止 Microsoft Dynamics CRM 2011 中没有 ExecutionContext.CallerOrigin 的无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014286/
我有一个 .Net Framework 控制台应用程序,可以在 Azure 中成功将其发布为 WebJob 并查看它的运行情况。当我尝试向函数添加 ExecutionContext 参数时,我收到上述
我有以下测试用例: test("test future") { import scala.concurrent.ExecutionContext.global import scala
ExecutionContext 可用于函数参数。 但是,它不能通过依赖注入(inject)供其他方法使用,包括 Functions 的构造函数,如下所示: public class Func
ExecutionContext 可用于函数参数。 但是,它不能通过依赖注入(inject)供其他方法使用,包括 Functions 的构造函数,如下所示: public class Func
有人知道 ExecutionContext.Capture() 和 ExecutionContext.Run(context, work, state) 是否很昂贵吗? 它是否会降低性能,因此建议谨慎
我想知道哪个ExecutionContext我应该在 scalatest % 2.2.6 上使用(以及为什么)运行我的 future 并模拟 future 。 class Foo { def f
我一直在开发一个中小型 Web 应用程序,大约有 10 个端点。它应该可以同时处理数百个并发请求。 由于我公司的政策,我必须为我的 Controller 使用 javax.ws.rs,所以每个 Con
我有以下代码: object KafkaApi { private implicit val main: ExecutionContextExecutor = ExecutionContext.g
考虑以下代码: private static async Task Main(string[] args) { await SetValueInAsyncMethod(); Print
在每个方法中传递 ExecutionContext 是否更符合 Scala 习惯,例如 class Foo { def bar(a: Int, b: Int)(implicit ec: Exe
我试图发现 ExecutionContext实际上适用于 .NET Framework 4.0 及更高版本。文档说,在使用 Thread.Start 和大多数线程池操作时,托管原则、同步、区域设置和用
假设我想知道给定 ExecutionContext 中有多少个线程. 所以我正在写一个这样的函数 def count(implicit ec: ExecutionContext): Int = {
我知道,当您通过调用 BeginInvoke() 或 ThreadPool.QueueUserWorkItem(...) 并行运行某些方法时,.NET 框架正在捕获包含代码访问安全信息和其他一些内容的
在 scala 中使用 future 时,默认行为是使用默认的 Implicits.global 执行上下文。看来这默认为每个处理器提供一个可用线程。在更传统的线程 Web 应用程序中,当 futur
我有一个 Spring 批处理作业,它使用如下 Web 参数执行: https://localhost:8443/batch/async/orz003A?id=123&name=test 我已将这些参
我希望将隐式 ExecutionContext 传递给部分实现的特征。 在代码示例中: import scala.concurrent.Future trait Processor[T,R] {
我正在使用 Scala 2.10 future 创建一个异步库。库的构造函数采用一系列实现特定特征的用户定义对象,然后库类上的方法将一些数据逐个发送到用户定义对象中。我希望用户提供ExecutionC
这是一个相当笼统的问题,但希望是一个合理的问题。什么时候ExecutionContext#reportFailure(Throwable)叫? Scala 标准库中似乎没有调用它。我想我也许应该在某些
当我制作 future ,或应用类似 onSuccess 的方法和 map ,我可以为它们指定 ExecutionContext 。 例如, val f = future { // code }
我有这两个错误: Error:(39, 20) Cannot find an implicit ExecutionContext. You might pass an (implicit ec: Ex
我是一名优秀的程序员,十分优秀!