我将用户信息作为每次调用的一部分传递给有状态服务。我将此信息用于服务中的审计目的。
我是否必须在服务中传递这些信息,或者是否有一些其他机制(例如用户上下文)来保存我可以全局访问的数据?我过去曾使用线程存储(数据槽)来保存数据,但由于代码是异步的,我认为这不起作用?
我将用户信息作为每次调用的一部分传递给有状态服务。我将此信息用于服务中的审计目的。
我是否必须在服务中传递这些信息,或者是否有一些其他机制(例如用户上下文)来保存我可以全局访问的数据?我过去曾使用线程存储(数据槽)来保存数据,但由于代码是异步的,我认为这不起作用?
您无法将该信息保留在服务的某些成员中,因为您无法控制并发调用如何在多个线程上异步执行。运行时允许任务和异步方法“跳转”的方式意味着 ThreadStorage 不是保持该上下文的安全方式。
您需要的是可以从您的ServiceRemotingDispatcher一直到执行您的实际服务方法并且不受并发调用(可能是相同的方法)影响的东西。底层 Service Fabric 实现执行您的方法的方式意味着正在调用多个任务和异步方法,这也意味着仅基于此线程 id 是不可能的选项,因为它几乎可以保证跳转在你到达你的代码之前至少线程一次。
我写了一个类似问题的答案(该问题已被删除,所以我自己添加了这个 q )。它基本上解决了你的问题,它基于@LoekD提到的CallContext
有一个名为 CallContext 的概念,它可以提供帮助。在这里阅读更多:http: //blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html