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