【发布时间】:2016-02-15 11:44:24
【问题描述】:
是否有一种快速、廉价、可靠的会话状态机制可用于 Free F1 WebApp ASP.NET 以进行演示配置?
我知道在 SO 上讨论了很多 Windows Azure 会话管理,但是这个特定的配置问题似乎漏掉了。
可用的配置选项似乎是:
InProc 模式:不建议在云中使用,但对于单个实例 Azure F1 WebApp,它理论上应该对于演示网站是可靠的。但是,我的经验是会话会意外超时,并且与 web.config 文件中的设置无关。
Azure Redis 缓存:推荐但不支持免费 F1 Web 应用;需要升级到付费计划。 (参考:https://azure.microsoft.com/en-gb/pricing/details/cache/)
Azure SQL:不推荐或不支持。 ** 如果您已经运行了 Azure SQL 服务器,这似乎是一个可行的选择。参考:https://azure.microsoft.com/en-gb/blog/using-sql-azure-for-session-state/。不幸的是,我发现无法找到修改后的 InstallSqlState.sql,并且所有下载链接都失败(例如:https://support.microsoft.com/en-us/kb/2006191)。 ** Universal Web Providers 可能会提供一个解决方案(参考:http://www.hanselman.com/blog/IntroducingSystemWebProvidersASPNETUniversalProvidersForSessionMembershipRolesAndUserProfileOnSQLCompactAndSQLAzure.aspx),但目前还不清楚——至少对我而言——它们是否提供会话管理支持以及 SQL Server 连接支持。
Azure 表存储:一个潜在的选项,但似乎是一个过时的解决方案,因为所有链接都已损坏。 (参考:https://www.simple-talk.com/cloud/platform-as-a-service/managing-session-state-in-windows-azure-what-are-the-options/)。我从未使用过 Azure Tables,所以这看起来很深奥。
StateServer:无法使用免费的 F1 网络应用程序。大概需要一个虚拟机。
自定义:是的,这会起作用。 **Redis Cache 是一个自定义会话管理器,所以我认为可以使用另一个。 **替代 AppFabric(参考:ASP.NET session state provider in Azure)似乎不再受支持,并且是付费解决方案。 **也许我还没有研究过另一种自定义解决方案。
Azure 缓存服务和基于角色的缓存:2016 年 11 月 30 日停用。(参考:https://azure.microsoft.com/en-gb/documentation/articles/cache-faq/#which-azure-cache-offering-is-right-for-me)。
在我看来,底线是没有的。如果有人能证明并非如此,我将不胜感激。
编辑:
我整天都在思考和修补这个问题。到目前为止,我的发现是:
1) 升级到 D1 WebApp 服务计划大大提高了会话状态管理的可靠性,但仍然容易出现不可预测性。正如 Hrvoje Hudo 在下面指出的那样,您不能指望免费或共享的可靠性。
2) 安装 ASP.NET 通用提供程序似乎是一种解决方案。我使用 MSVC2013 创建了一个新的 MVC WebApp 项目,选择 Azure 托管,输入:
install-package Microsoft.Aspnet.Providers
在包管理控制台中,添加: 会话[“时间”]=DateTime.Now.ToString() 到 Home Index 视图并在 about 视图中使用:
ViewBag.Message = Session["Time"]
并将 web.config 更新为:
<sessionState mode="Custom" customProvider="DefaultSessionProvider" timeout="1">
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=Whatever" connectionStringName="DbaseName"/>
</providers>
</sessionState>
当我发布网站时,会在我的 Azure SQL Server 上创建默认数据库,这要归功于包含我所有配置设置并将它们交换进去的发布 scripts.json,并在数据库上创建一个 dbo,session 表。
浏览网站时,会在数据库表上创建新会话 - 我可以使用 MS Management Studio 2013 查看它们 - 并在超时(60 秒以上)后删除。
我将网站降级为免费(以确保它没有默认配置为更高的计划,MSVC 曾经这样做)并且一切似乎仍然有效。这似乎就是我想要的。
3) Azure 表。我还不能理解这些!如果有人知道一个很好的“操作方法”教程,我很乐意看看。
编辑 2:
经过一天的浸泡测试,我现在 90% 确信 ASP.NET 通用提供程序是使用免费 Azure Web 应用程序进行快速可靠会话的方法。我不能说它是免费的,因为必须为 SQL Server 付费(基本 = 下午 4 英镑,请参阅:https://azure.microsoft.com/en-gb/pricing/details/sql-database/),但它肯定不贵,而且如果您仍然使用 SQL Server - 像我一样 - 它有道理。
【问题讨论】:
-
无论我走到哪里,都对 Universal Providers 路线的脚本感到困惑。它是自动创建数据库/表吗?你能分享脚本或链接到它吗?谢谢!
-
抱歉,我现在看到它在通过连接字符串提供的数据库中自动创建了一个名为 Sessions 的表