OperationContext равен нулю после асинхронного метода с использованием.net 4.6.2
У меня проблема с OperationContext
получение нулевого значения после вызова асинхронной операции (и мой threadid изменяется).
Я знаю, что это известная проблема, и я бросил некоторые вопросы Stackru относительно этой проблемы.
В .net 4.6.2
Существует исправление для проблемы, как вы можете прочитать здесь.
OperationContext.Current Async Улучшения
WCF теперь имеет возможность включать OperationContext.Current с ExecutionContext, чтобы OperationContext проходил через асинхронные продолжения. С этим улучшением WCF позволяет CurrentContext распространяться из одного потока в другой поток. Это означает, что даже если между вызовами OperationContext.Current есть переключение контекста, его значение будет правильно передаваться в течение всего выполнения метода.
Есть ли что-то особенное, что мне нужно сделать, чтобы это поддерживалось с моей стороны? Я использую VS 2013, обновил фреймворк до 4.6.2
и установил пакет разработчика. Я изменил свой проект, чтобы использовать Framework 4.6.2
и я все еще получаю ноль OperationContext
после асинхронного вызова.
3 ответа
Согласно ответу Tomasz, убедитесь, что в настройках вашего приложения есть следующее:
<appSettings>
<add key="wcf:disableOperationContextAsyncFlow" value="false" />
</appSettings>
За дополнительной информацией обращайтесь по адресу https://github.com/Microsoft/dotnet/issues/403 где MS признает, что это, на самом деле, серьезное изменение. Похоже, что это может легко сломать много приложений на местах.
После установки KB4013429 контекст операции асинхронный поток по умолчанию отключен. Чтобы включить его (и использовать функциональность, исправленную в 4.6.2), вам нужно установить флаг wcf: disableOperationContextAsyncFlow в значение false в конфигурации вашего приложения. (Я не нашел никакой информации об этом флаге, обнаружил ее при исправлении проблемы с неправильным распространением OperationContext).
Поведение, которое вы описываете, удалось включить в выпуск.NET 4.6.2, и мы об этом знаем. На самом деле, мы находимся в процессе решения этой проблемы, и я ожидаю, что она станет общедоступной в течение следующих нескольких месяцев.
На данный момент известные обходные пути - вернуться к версии фреймворка 4.6.1 или сделать что-то похожее на это:
OperationContext ocx = OperationContext.Current;
using (new OperationContextScope(OperationContext.Current))
{
OperationContext.Current = new OperationContext(ocx.Channel);
// ...
}
Пожалуйста, дайте нам знать, если у вас есть дополнительные вопросы или комментарии.