7

在调用异步操作(并且我的 threadid 更改)OperationContext后,我遇到了 null的问题。

我知道这是一个已知问题,我已经提出了一些关于该问题的 StackOverflow 问题。

您可以在此处.net 4.6.2阅读该问题的修复程序。

OperationContext.Current 异步改进

WCF 现在能够将 OperationContext.Current 包含在 ExecutionContext 中,以便 OperationContext 流经异步延续。通过这一改进,WCF 允许 CurrentContext 从一个线程传播到另一个线程。这意味着即使在对 OperationContext.Current 的调用之间存在上下文切换,它的值也会在方法的整个执行过程中正确流动。

为了得到这个支持,我需要做些什么特别的事情吗?我正在使用 VS 2013,将框架更新为4.6.2并安装了开发包。我已经将我的项目更改为使用,但在异步调用后Framework 4.6.2我仍然得到一个空值。OperationContext

4

3 回答 3

5

根据 Tomasz 的回答,确保您的应用配置中包含以下内容:

<appSettings>
    <add key="wcf:disableOperationContextAsyncFlow" value="false" />
</appSettings>

有关更多信息,请查看https://github.com/Microsoft/dotnet/issues/403,其中 MS 承认这实际上是一个重大变化。似乎这样可以很容易地在该领域打破很多应用程序。

于 2017-05-15T18:57:55.113 回答
1

安装 KB4013429 操作上下文异步流后默认禁用。要启用它(并使用 4.6.2 中修复的功能),您需要在应用配置中将 wcf:disableOperationContextAsyncFlow 标志设置为“false”。(我还没有找到关于这个标志的任何信息,在修复 OperationContext 传播不正确的问题时发现了它)。

于 2017-03-31T07:50:18.590 回答
0

您所描述的行为设法使其成为 .NET 4.6.2 版本,我们知道这一点。事实上,我们正在为此推出修复程序,我希望它会在接下来的几个月内公开发布。

目前已知的解决方法是恢复到 4.6.1 版本的框架或执行类似的操作:

OperationContext ocx = OperationContext.Current;

using (new OperationContextScope(OperationContext.Current))
    {
        OperationContext.Current = new OperationContext(ocx.Channel);
        // ...
    }

如果您有其他问题或意见,请告诉我们。

于 2016-09-27T19:18:50.287 回答