问题标签 [callcontext]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2267 浏览

c# - 为什么 AsyncLocal 与 CallContext 不同

运行下面的代码,您可以看到 CallContext 和 AsyncLocal 之间存在差异。

你能解释一下为什么吗?

我希望 AsyncLocal 的值对于每个线程都是唯一的,因为文档说它应该表现得像 CallContext 一样。

0 投票
2 回答
11424 浏览

.net-core - .NET Core 等效于 CallContext.LogicalGet/SetData

我正在尝试将使用 CallContext.LogicalGet/SetData 的现有 .net 应用程序移入 .net 核心。

当 Web 请求到达应用程序时,我将 CorrelationId 保存在 CallContext 中,并且每当我需要稍后在轨道上记录某些内容时,我都可以轻松地从 CallContext 中收集它,而无需将其传输到任何地方。

由于 CallContext 在.net 核心中不再受支持,因为它是 System.Messaging.Remoting 的一部分,有哪些选项?

我见过的一个版本是可以使用 AsyncLocal (AsyncLocal 的语义与逻辑调用上下文有何不同?),但看起来我必须将这个变量传输到所有地方,这超出了目的,它不是方便的。

0 投票
1 回答
369 浏览

c# - .net core AsyncLocal 失去了 System.Reactive 的上下文

我想使用 AsyncLocal 通过异步工作流传递信息以进行跟踪。现在我遇到了RX的问题。
Thios 是我的测试代码:

输出是:

Main 0(线程:5):AsyncLocal.Value => 0
Main 1(线程:6):AsyncLocal.Value => 1
OnNextNormal 0(线程:5):AsyncLocal.Value => 0
OnNextNormal 1(线程:6): AsyncLocal.Value => 1
OnNextDelayed 0(线程:4):AsyncLocal.Value => 0
OnNextDelayed 1(线程:4):AsyncLocal.Value => 0

如您所见, AsyncLocal.Value 不会流向延迟订阅的方法。
=> AsyncValue 在延迟轨道上丢失

据我了解,普通的 Subscribe() 不使用调度程序,而 Delay() 使用调度程序。
当我对两个调用都使用 ObserveOn() 时,两者的输出如下

Main 0(线程:5):AsyncLocal.Value => 0
Main 1(线程:7):AsyncLocal.Value => 1
OnNextNormal 0(线程:9):AsyncLocal.Value => 0
OnNextNormal 1(线程:9): AsyncLocal.Value => 0
OnNextDelayed 0(线程:4):AsyncLocal.Value => 0
OnNextDelayed 1(线程:4):AsyncLocal.Value => 0

=> AsyncValue 在每条轨道上都会丢失

有没有办法让 ExecutionContext 与 RX 一起流动?
我只发现了这一点,但这是另一个问题。他们解决了观察者的上下文如何流动的问题。我想流动发布者的上下文。

我想要实现的是:

  1. 来自“外部”的消息为我服务
  2. 在服务内分发消息 (RX)
  3. 记录消息时,使用 MessageId 格式化日志消息
  4. 我不想到处传递信息

提前感谢您的回答。

0 投票
1 回答
533 浏览

c# - CallContext 正在向前传递之前设置的数据

我有这种情况,我看到线程的 CallContext 在后续调用中向前携带数据。

考虑我有一个简单的 API,当被查询时,它将使用以下方法将一个数据条目设置到 CallContext 中:

当我在一些 API 查询后看到日志时,我看到了类似的日志。

| 线程 | 日志 |
| 237 | 数据 23 |
| 145 | 数据 19 |
| 第872章 数据 78 |
| 237 | 数据 23 |

我担心的是为什么 ID 为 237 的线程会提取旧数据?即23
我确定控件没有进入LogicalSetData 代码块,因为它已经有数据。

我不确定为什么会这样?谁能帮我这个?

该服务是 WCF 数据服务。正在从邮递员 REST 客户端进行呼叫。

0 投票
1 回答
139 浏览

c# - 在没有/空 CallContext 的情况下创建 AppDomain

在 ASP.NET 应用程序中,我想创建一个 AppDomain,在其中运行不受信任的代码。但是,在初始化和展开我的程序集加载器时,会引发关于我没有传入的类型的异常。它是来自 web 请求 ( HttpContext.Current.User) 的当前用户,我认为它可以通过 LocalCallContext 提供。我不希望当前用户对不受信任的代码可用,实际上我希望不受信任的代码根本没有上下文。所以我想我可以传入一个显式的 CallContext,但似乎没有这样的事情。我将如何实现这一目标?

不受信任的代码是用户提供的 Razor 模板,将通过 RazorEngine 执行。

最后一行抛出这个异常,UnrelatedAssembly.SomeType是 my 的类型HttpContext.Current.User

0 投票
2 回答
407 浏览

c# - 使用 CallContext 存储 WCF 的 HttpContext

我目前有一个 WCF 服务,用于执行一些数据库查询和发送邮件。长话短说,这两种方法都HttpContext.Current在其实现的某个地方异步使用。

我最初的问题是,在第一个await,之后HttpContext.Current变为 null ,因此第二个操作失败。我在 Google 上搜索了几个小时,并测试了我发现的所有内容......自定义同步上下文,web.config 中的 appSettings,针对 .NET 4.5,启用 ASP.NET 兼容性,但没有任何效果。

然后,我发现这个 SO 帖子谈论CallContext. 基本上,这个想法是存储HttpContext.CurrentCallContext. 我测试并且yeepee,它的工作。但是,由于我不知道确切是什么CallContext,所以我阅读了它。

我不确定我是否真的正确理解了所有内容,但在阅读之后,我有一个担忧。我可能是错的,但似乎不能保证一旦异步调用完成后恢复的线程与初始线程相同。问题是我在其中存储了几个值,HttpContext我担心第一个方法使用用户 A 值执行,然后,一旦异步调用完成,第二个方法使用用户 B 值执行(因为HttpContext不会' t 相同)。

我想人们会很想告诉我只CallContextCallContext是次要的。

有人能告诉我我的理论是否正确吗?

0 投票
0 回答
466 浏览

c# - AsyncLocal 和 CallContext - 如何同时实现异步 * 和 * 远程逻辑上下文保证?

我正在尝试开发一个实现松散定义的环境上下文模式的库。我需要同时考虑高度并行性远程处理 ( .NET Framework 4.6.2)。看来我有 2 个选项可用:AsyncLocal<T>CallContext. 我不相信两者都满足这两个考虑。

考虑以下示例,该示例演示了我的问题的远程处理部分:

此类创建两个 GUID,一个存储在异步本地,另一个存储在逻辑调用上下文中。然后它启动一个新的 AppDomain,并打印来自当前和远程域的值。

该程序的示例输出显示

我们可以看到 CallContext 跨越了远程边界,而 AsyncLocal 没有(并不奇怪)。

问题在于,由于 CallContext 跨线程共享的方式,我不相信我可以在“简单并行”环境中利用 CallContext(正如Stephen Cleary 在这篇文章中所阐述的那样)。Stephen 在链接解决方案中有一个出色的伪代码示例,我不会在此重复。该示例概述了我的问题的异步部分。

然后我的两个选择变成

AsyncLocal<T>:在“简单并行”环境中工作,但无法跨越远程边界。

CallContext:跨远程边界工作,但在“简单并行”环境中失败。

我错过了第三种选择吗?

0 投票
1 回答
135 浏览

c# - 我需要自己清理 NLog MDLC 吗?

我在 REST 服务器中使用 NLog 4.5.10 和 C# 4.7.1。我正在使用该方法MappedDiagnosticsLogicalContext.Set(item, value)将请求的一些参数添加到我的日志消息中。

现在的问题是:我必须手动清理它们还是这些字典也被垃圾收集了?

据我所知,字典绑定到当前线程(通过使用 ThreadId?)。当我有很多请求并且 ThreadId 再次开始计数为零时会发生什么?可能会发生,当相应的线程被销毁时,具有相同 ID 的最后一个线程的值仍然存在,或者这些对象是否被销毁?

最好的问候,丹尼尔

0 投票
2 回答
205 浏览

.net - 如何防止任务继承父任务逻辑调用上下文

在使用 Task.Run() 和 Async 方法时,我正在尝试使用 AsyncLocal 作为 Thread 本地存储的替代品。我遇到的问题是我需要下面的代码来打印

如果使用 Thread 本地存储,这将是行为,但我得到的是这个输出。

示例代码:

0 投票
0 回答
215 浏览

asp.net - Web api 操作过滤器中设置的 CallContext 值不会流向控制器操作

我有一个 asp.net web api,我们在全局操作过滤器的 OnActionExecuting 中使用 TransactionScope(仅用于 POST、PUT 和 DELETE,但不适用于 GET)启动事务,然后在 OnActionExecuted 中完成或回滚它。最近我们决定进行更改,以便我们可以为至少 GET 调用添加 SqlAzureExecutionStrategy(因为它仅在没有用户发起的事务时才有效),以便可以处理临时故障以进行数据获取。我按照这里的文章并在我们的应用程序中实现了同样的事情。下面是代码。

创建了一个新的数据库配置类

每当我们需要启动事务时,将 suspendExecutionStrategy 设置为 true。

问题是在 OnActionExecuting 中正确设置了 SuspendExecutionStrategy 的值,但是当代码进入 Controller 操作或 OnActionExecuting 时,它始终为 false。

我做了一些调查,并意识到当我们从过滤器移动到控制器操作时,执行上下文本身会发生变化。因此,如果在 OnActionExecuting 我检查 Thread.CurrentThread.ExecutionContext.ToStringJson() 我看到 SuspendExecutionStrategy 的值可用,但如果我在控制器操作中检查相同的值,它不可用,奇怪的是执行上下文中的其他所有内容仍然可用.

OnActionExecuting 中 Thread.CurrentThread.ExecutionContext.ToStringJson() 的值

Controller Action 和 OnActionExecuted 中 Thread.CurrentThread.ExecutionContext.ToStringJson() 的值

所以我的问题是执行上下文如何从动作过滤器更改为控制器动作,以及执行上下文中的所有其他值如何仍然保留。