会话变量等价于OWIN自身
我有一个在OWIN过程中托管的示例Web API(自托管,而不是在IIS中)。 我在我的控制器中获得了一个JWT令牌,并且希望能够在应用程序的另一部分(一个实现NserviceBus IMutateOutgoingTransportMessages的类)中检索它。 在我的其他Web应用程序POC(托管在IIS中)中,我使用了一个简单的会话变量,它工作得很好。 但是我想知道在我的新OWIN自我托管环境中做什么是最好的方法? 静态类中的静态属性?
如果不详细了解您的具体需求,这个问题就非常广泛而且很难回答。 这是我对你的问题的解释:
只要有多个请求同时触发应用程序,静态类中一个令牌的静态属性当然会开始中断。 实现一个维护令牌列表的类可能是一个解决方案,但我无法分辨出应该使用哪个密钥来标识每个令牌。 如果您需要多次检索令牌,则接口详细信息会有所不同。
线程安全问题将适用于这种类的所有处理和实现。 使用不可变集合和函数式编程实践作为灵感可能会有所帮助。
如果挥之不去的令牌带来了问题(如果没有其他的话,他们可能会从安全的角度出发),您需要弄清楚如何确保令牌不会受到欢迎,即使周期由于某种原因未完成。
看到你如何使用Session
作为POC的解决方案,我假设你想要一些类似的行为,并且一个用户不应该被允许同时携带两个令牌。 您可以将令牌存储在数据库中,甚至可以存储在本地文件系统中,从而使维护和有效性成为一个单独的问题。
OWIN自托管应用程序中已经有了类似于缓存的功能的实现,也许其中的一个可以作为自己实现一切的捷径。
如果这个令牌业务实际上是在您的应用程序中引入状态的唯一原因,那么最好的解决方案恕我直言就是重新考虑您的架构,以便应用程序可以保持无状态。
我正在为目前正在为客户开发的服务器上面临类似的困境。 我的问题是,服务器必须使用传统的多线程DLL(又名SDK)进行调用(并保持活动连接)。
我努力使用常规的Web API项目在IIS上工作。 由于IIS在确定线程正在流氓时会回收线程,因此失败的情况很糟糕......女巫是SDK线程在该视图中的外观。 此外,SDK必须能够回调调用者(客户端 - 单页面应用程序),为此我使用SignalR。
然后我尝试了一个多部分系统(在IIS + WCF服务上用于集成SDK的单页+ web api)。 但由于必须在所有应用程序之间进行的双向异步通信,因此这是一个真正的恶梦。 再次:失败。
所以我在一个控制台应用程序(现在)中恢复了一个自己托管的OWIN + WebAPI服务。 我的问题是,一些调用很长,并在工作线程中处理。 我设法通过头文件在每个ajax调用中传递SignalR客户端ID。 我可以在web api控制器中提取id。 但是当任务异步时,我需要从管理异步任务的类中获取id(通过Unity注入服务)。 这是我的问题与你的问题类似的地方 。 在IIS托管的应用程序中,我们有HttpContext。 它是在每个客户端调用上下文化的,并遵循管道中的任何线程更改...但不在自己托管的OWIN WCF应用程序中...
我正在研究线程本地存储,CallContext ...以及在异步调用的生命周期中跟踪原始调用者信息的其他方法。 我读过关于OWIN管道的信息,我可以捕获OWIN中间件中的信息......但是如何安全地保存这些信息以便在注入服务中使用? 我仍然在寻找答案...
我想知道你是否找到了这个相当有趣的问题的解决方案?
我更喜欢添加到你的线程,而不是启动另一个并行线程/ SO问题。
链接地址: http://www.djcxy.com/p/95099.html