繁体   English   中英

ASP.NET应用程序状态提供程序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM