小编nil*_*ilu的帖子

我们应该在调用异步回调的库中使用ConfigureAwait(false)吗?

ConfigureAwait(false)在C#中使用await/async 时,有很多指南可供使用.

似乎一般的建议是ConfigureAwait(false)在库代码中使用,因为它很少依赖于同步上下文.

但是,假设我们正在编写一些非常通用的实用程序代码,它将函数作为输入.一个简单的例子可能是以下(不完整的)功能组合器,以简化基于任务的简单操作:

地图:

public static async Task<TResult> Map<T, TResult>(this Task<T> task, Func<T, TResult> mapping)
{
    return mapping(await task);
}
Run Code Online (Sandbox Code Playgroud)

FlatMap:

public static async Task<TResult> FlatMap<T, TResult>(this Task<T> task, Func<T, Task<TResult>> mapping)
{
    return await mapping(await task);
}
Run Code Online (Sandbox Code Playgroud)

问题是,我们应该ConfigureAwait(false)在这种情况下使用吗?我不确定上下文捕获是如何工作的.关闭.

一方面,如果组合器以功能方式使用,则不需要同步上下文.另一方面,人们可能会滥用API,并在提供的函数中执行依赖于上下文的内容.

一种选择是为每个场景(Map和/ MapWithContextCapture或某些东西)设置单独的方法,但感觉很难看.

另一种选择可能是将map/flatmap选项添加到a中ConfiguredTaskAwaitable<T>,但是由于等待不必实现接口,这会导致大量冗余代码,在我看来更糟糕.

是否有一种将责任转交给调用者的好方法,这样实现的库就不需要对提供的映射函数中是否需要上下文做出任何假设?

或者仅仅是一个事实,异步方法组成得不是很好,没有各种假设?

编辑

只是为了澄清一些事情:

  1. 问题确实存在.当您在效用函数内执行"回调"时,添加ConfigureAwait(false)将导致空同步.上下文.
  2. 主要问题是我们应该如何处理这种情况.我们是否应该忽略某人可能想要使用同步的事实.上下文,还是有一个很好的方法将责任转移到调用者,除了添加一些重载,标志等?

正如一些答案所提到的那样,可以在方法中添加一个bool-flag,但正如我所看到的,这也不是太漂亮,因为它必须一直传播到API中(因为它有)更多"实用"功能,取决于上面显示的功能.

c# task synchronizationcontext task-parallel-library async-await

35
推荐指数
3
解决办法
2682
查看次数

如何使用WCF签署X509令牌

我正在开发一个必须与Oracle WebLogic服务通信的WCF客户端.该服务强制执行相互证书身份验证.

但是,我们无法满足策略,并且服务器会记录错误说明:

"WSM-00081:X.509证书未签名."

我一直想知道这是什么意思.Oracle文档说明:

WSM-00081:X.509证书未签名.

原因:未使用的X509令牌未根据证书身份验证方案的要求进行签名.

操作:对X509令牌(取决于所使用的引用机制)进行签名以进行证书身份验证.

1级

类型:错误

影响:安全

(http://docs.oracle.com/cd/E25054_01/core.1111/e10113/chapter_wsm_messages.htm)

经过一些研究,我们发现我们可以通过设置来禁用服务策略配置文件中的检查is-signed="false:

<orasp:x509-token orasp:enc-key-ref-mech="direct" orasp:is-encrypted="false"
              orasp:is-signed="false"
              orasp:rcpt-enc-key-ref-mech="direct"
              orasp:rcpt-sign-key-ref-mech="direct"
              orasp:sign-key-ref-mech="direct"/>
Run Code Online (Sandbox Code Playgroud)

我的两个理论:

  • 证书需要由CA签名
    • 我们使用由CA签名的证书进行了检查,但这没有任何区别
    • 但是,在配置时我们可能会犯下som错误.我们应该尝试一下吗?
  • 我们不知何故需要签署包含在请求中的包含的BinarySecurityToken.
    • 但是,我不知道如何才能做到这一点

我是否完全误解了这个主题,或者你们中的任何人都可以指出问题可能是什么以及如何解决?

wcf soap web-services weblogic wcf-security

7
推荐指数
1
解决办法
929
查看次数