到目前为止,我已经为Azure表存储实现了几个自定义多租户提供程序,如ASP.NET会话状态提供程序,ASP.NET虚拟路径提供程序,a.s.f。我现在想要实现一个自定义的多租户ASP.NET Application-State提供商,但我没有在网上找到任何资源或最佳实践。
在下面的示例中,我将展示如何使用ASP.NET应用程序状态提供程序跟踪所有Azure Web应用程序节点中的联机用户数量:
void Session_Start(object sender, EventArgs e)
{
Application["NumOnlineUsers"] = ((int)Application["NumOnlineUsers"] + 1);
}
void Session_End(object sender, EventArgs e)
{
Application["NumOnlineUsers"] = ((int)Application["NumOnlineUsers"] - 1);
}
如何实现ASP.NET应用程序状态提供程序,我将应用程序状态数据保存在Azure表存储中?
答案 0 :(得分:1)
您问题中的链接指出了有关ApplicationState
的以下假设:
Volatility:由于应用程序状态存储在服务器内存中,因此只要应用程序停止或重新启动,它就会丢失。
资源:由于存储在内存中,与将数据保存到磁盘或数据库相比,应用程序状态非常快。
可伸缩性:为同一应用程序提供服务的多台服务器中的应用程序状态不共享
像您所建议的提供商会改变波动性(因为数据将存在于其他地方并且可以恢复),以及启用可扩展性(因为多个ApplicationState
可以共享这些值)。然而,这是以该页面为ApplicationState
建议的简单性为代价的。
简而言之,对于此数据结构而言,它听起来像.NET一样,可以保存应用程序的单个实例所需的值,而这些实例不需要在进程重新启动时保持不变。如果你在这个意义上使用它,可能值得考虑一个不同于ApplicationState
的数据结构,而不是通过箍来使它成为它没有被设想的东西。即使您确实设法编写了持久层,也要考虑它们提出的最后一点:
当您介绍与Azure表交谈时涉及的滞后和错误时,您可能会如何支持,可能是在另一个虚拟机上或至少在另一个虚拟机上?当线程1对值进行更改,然后线程2将其更改回来时会发生什么,但是线程2的更改首先写入磁盘然后是线程1?重新启动后,您将不知道预期的值是什么。
总之,我不认为你应该写它。它不是一个需要的工具,并打破了预期用途(虽然仅凭这一点还不足以说它不应该被写入)。棺材中的最后一点是,它不可行,因为微软没有公开与使用SessionStateProvider
类所做的扩展相同的粒度。