[英]ASP.NET Application-state provider
到目前为止,我已经为Azure Table Store实现了几个自定义多租户提供程序,例如ASP.NET会话状态提供程序,ASP.NET虚拟路径提供程序,现在我想实现自定义多租户ASP.NET应用程序-国家提供者,但我没有在线找到任何资源或最佳实践。
在下面的示例中,我演示了如何使用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表存储中?
您问题中的链接陈述了有关ApplicationState
的以下假设:
易变性:由于应用程序状态存储在服务器内存中 ,因此无论何时停止或重新启动应用程序,状态都会丢失。
资源:因为它存储在内存中 ,所以与将数据保存到磁盘或数据库相比,应用程序状态非常快。
可伸缩性:服务于同一应用程序的多个服务器之间不共享应用程序状态
像您建议的提供程序将更改波动率(因为数据将存在于其他位置并且可以还原),并启用可伸缩性(因为多个ApplicationState
可以共享值)。 但是,这是以该页面为ApplicationState
建议的简单性为代价的。
简而言之,听起来像.NET打算让此数据结构保存应用程序的单个实例所需的值,这些实例不需要在进程重新启动之间保持不变。 如果您以这种方式使用它,那么可能有必要考虑使用不同于ApplicationState
数据结构,而不是一味地尝试使它变得不那么理想。 即使您确实设法编写了持久层,也请考虑一下它们提出的最后一点:
当介绍与Azure表(可能是在另一个虚拟机上,或者至少是在另一个进程上)进行交谈所涉及的滞后性和易错性时,您如何支持? 当线程1更改值,然后线程2将其改回,但是对线程2的更改首先写入磁盘,然后线程1进行更改,会发生什么情况? 重新启动后,您将不知道预期的值是多少。
简而言之,我认为您不应该写它。 它不是必需的工具,它破坏了预期的用途(尽管仅此一项还不足以表明它不应被编写)。 棺材的最后一个缺点是,这是不可行的,因为Microsoft并未像使用SessionStateProvider
类那样暴露出相同的扩展粒度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.