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

时间:2014-12-12 18:36:00

标签: c# asp.net azure

到目前为止,我已经为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表存储中?

1 个答案:

答案 0 :(得分:1)

您问题中的链接指出了有关ApplicationState的以下假设:

  • Volatility:由于应用程序状态存储在服务器内存中,因此只要应用程序停止或重新启动,它就会丢失。

  • 资源:由于存储在内存中,与将数据保存到磁盘或数据库相比,应用程序状态非常快。

  • 可伸缩性:为同一应用程序提供服务的多台服务器中的应用程序状态不共享

像您所建议的提供商会改变波动性(因为数据将存在于其他地方并且可以恢复),以及启用可扩展性(因为多个ApplicationState可以共享这些值)。然而,这是以该页面为ApplicationState建议的简单性为代价的。

简而言之,对于此数据结构而言,它听起来像.NET一样,可以保存应用程序的单个实例所需的值,而这些实例不需要在进程重新启动时保持不变。如果你在这个意义上使用它,可能值得考虑一个不同于ApplicationState的数据结构,而不是通过箍来使它成为它没有被设想的东西。即使您确实设法编写了持久层,也要考虑它们提出的最后一点:

  • 并发:应用程序状态是自由线程的,这意味着许多线程可以同时访问应用程序状态数据

当您介绍与Azure表交谈时涉及的滞后和错误时,您可能会如何支持,可能是在另一个虚拟机上或至少在另一个虚拟机上?当线程1对值进行更改,然后线程2将其更改回来时会发生什么,但是线程2的更改首先写入磁盘然后是线程1?重新启动后,您将不知道预期的值是什么。

总之,我不认为你应该写它。它不是一个需要的工具,并打破了预期用途(虽然仅凭这一点还不足以说它不应该被写入)。棺材中的最后一点是,它不可行,因为微软没有公开与使用SessionStateProvider类所做的扩展相同的粒度。