在有状态服务中全局访问数据

Access data globally in stateful service

我在每次调用有状态服务时传递用户信息。我将此信息用于服务中的审计目的。

我是否必须在服务内传递此信息,或者是否有一些其他机制(例如用户上下文)来保存我可以全局访问的数据?我过去曾使用线程存储(数据槽)来保存数据,但由于代码是异步的,我认为这行不通吗?

有一个名为 CallContext 的概念可能会有所帮助。在这里阅读更多:http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html

您无法在服务的某些成员中保留该信息,因为您无法控制并发调用在多个线程上异步执行的方式。运行时允许任务和异步方法 'jump' 之间的方式意味着 ThreadStorage 不是保持该上下文的安全方法。

您需要的是可以从 ServiceRemotingDispatcher 一直执行到实际服务方法的执行并且不受并发调用(可能是同一方法)影响的东西。底层 Service Fabric 实现执行您的方法的方式意味着有多个任务和异步方法被调用,这也意味着仅仅基于此,线程 id 作为一个选项是不可能的,因为它几乎可以保证跳转在您到达代码之前至少线程一次。

我写了 to a similar question (that was deleted, so I added this q back myself). It basically solves your question and it is based on CallContext as