OWIN 自主机中等效的会话变量

Posted

技术标签:

【中文标题】OWIN 自主机中等效的会话变量【英文标题】:Session variable equivalent in OWIN self-host 【发布时间】:2015-02-17 10:20:18 【问题描述】:

我有一个托管在 OWIN 进程中的示例 Web API(自托管,不在 IIS 中)。我在我的控制器中获得了一个 JWT 令牌,我希望能够在应用程序的另一部分中检索它,这是一个实现 NserviceBus IMutateOutgoingTransportMessages 的类。在我的另一个 Web 应用程序 POC(托管在 IIS 中)中,我使用了一个简单的会话变量,它工作得很好。但我想知道在我的新 OWIN 自托管环境中最好的方法是什么?静态类中的静态属性?

【问题讨论】:

我目前面临同样的需求(Owin 自托管进程中的会话以存储一些信息)。 【参考方案1】:

在我目前为客户开发的服务器上,我也面临着类似的困境。我的问题是服务器必须使用旧的多线程 DLL(又名 SDK)进行调用(并保持实时连接)。

我很难通过常规的 Web API 项目在 IIS 上实现此功能。失败很严重,因为 IIS 在确定线程正在流氓时回收线程......从那个角度来看,这就是 SDK 线程的样子。此外,SDK 必须能够回调调用者(客户端 - 单页应用程序),为此我使用 SignalR。

然后我尝试了一个多部分系统(单页 + IIS 上的 Web api + 用于 SDK 集成的 WCF 服务)。但管理起来确实是一场噩梦,因为所有应用程序之间都必须进行 2 路异步通信。再次:失败。

所以我在控制台应用程序中恢复为单个自托管的 OWIN + WebAPI 服务(目前)。我的问题是一些调用很长并且在工作线程中处理。我设法通过标头在每个 ajax 调用中传递 SignalR 客户端 ID。我可以在 web api 控制器中提取 id。但是当任务异步时,我需要从管理异步任务的类中获取 id(通过 Unity 注入服务)。 这是我的问题与您的问题相似的地方。在 IIS 托管的应用程序中,我们有 HttpContext。它在每个客户端调用时都被上下文化,并遵循管道中的任何线程更改...但不是在自托管的 OWIN WCF 应用程序中...

我正在研究线程本地存储、CallContext... 以及在异步调用的生命周期内跟踪原始调用者信息的其他方法。我已阅读有关 OWIN 管道的信息,我可以在 OWIN 中间件中捕获信息……但是如何安全地保留该信息以用于注入服务?我还在寻找答案...

我想知道你是否找到了解决这个相当有趣的问题的方法?

我更喜欢添加到您的线程而不是启动另一个并行线程/ SO 问题。

【讨论】:

很遗憾没有。我们决定使用 IIS 托管的 OWIN 而不是自托管的。但我建议你看看 System.Runtime.Caching【参考方案2】:

如果不详细了解您的具体需求,这个问题确实很宽泛,很难回答。这是我对您的问题的解释:

您已经对每个请求进行了签名,可能会将令牌存储在浏览器 sessionStorage(甚至 localStorage)中,但这还不够 您需要在任何请求周期之外或与任何请求周期无关的情况下检索令牌(如果没有,这可能是您应该寻找答案的地方) 您的应用程序不需要是无状态的

一个静态类中一个令牌的一个静态属性当然会在多个请求同时命中应用程序时立即开始中断。实现一个维护令牌列表的类可能是一种解决方案,尽管我不知道您应该使用什么键来识别每个令牌。接口详细信息会有所不同,具体取决于您是否需要多次检索令牌。

线程安全问题将适用于此类类的所有处理和实现。使用Immutable Collections 和函数式编程实践作为灵感可能会有所帮助。

如果挥之不去的代币造成问题(从安全角度来看,如果没有其他问题,他们可能会),您需要弄清楚如何确保代币不会超过他们的受欢迎程度,即使循环出于某种原因没有完成。

看到您如何在 POC 中使用 Session 作为解决方案,我假设您想要一些类似的行为,并且不应允许一个用户同时携带两个令牌。您可以将令牌存储在数据库中,甚至存储在本地文件系统中,从而使维护和有效性成为一个单独的问题。

OWIN 自托管应用程序已经实现了类似缓存的功能,也许其中之一可以作为自己实现一切的捷径。

如果这个令牌业务实际上是在您的应用程序中引入状态的唯一原因,那么恕我直言,最好的解决方案是重新考虑您的架构,以便应用程序可以保持无状态。

【讨论】:

事实上,这只是一个测试,我们放弃了自托管选项。感谢您指点我在 OWIN 中的缓存之类的功能,我会看看它。我们仍在评估执行此操作的正确方法,您完全正确地认为应用程序需要尽可能保持无状态。

以上是关于OWIN 自主机中等效的会话变量的主要内容,如果未能解决你的问题,请参考以下文章

具有 OWIN 自主机和 Windows 身份验证的 Web Api

在自主机模式下获取当前的 owin 上下文

Oracle 的 MySQL 等效会话变量

csharp Topshelf + OWIN自主机+ ASP.NET WebAPI + Ninject

Owin 自主机 - 无法侦听前缀“http://localhost:12345/”,因为它与机器上的现有注册冲突

OWIN 自托管静态网站