我可以在我的ASP.NET MVC应用程序的现有SQL Azure DB中存储会话状态吗?

时间:2011-08-10 17:43:11

标签: asp.net-mvc asp.net-mvc-3 azure azure-sql-database asp.net-session

我正在以代码优先的方式使用EF4.1来为SQL Azure数据库'MyAppsDB'中的基于ASP.NET MVC 3的小型Web应用程序保留POCO对象。这些表在MyAppsDB中不存在时自动创建。我想在SQL Azure上托管应用程序,但我不想为额外的1GB数据库支付10美元/月来存储50MB的会话状态,而使用Cache会更加昂贵。

我想将会话状态与我的应用程序模型一起存储在MyAppDB中。有没有办法做到这一点? 如果会话表不存在,是否可以自动创建,与EF代码优先模型相同?

我尝试修改我的web.config,如下所示:

<sessionState mode="Custom" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      connectionStringName="MyAppDBContext" applicationName="/" />
  </providers>
</sessionState>

但它抱怨会话表不存在。如果我创建会话表,EF4.1会抱怨数据库元数据与其期望值不符。

1 个答案:

答案 0 :(得分:1)

当然可以将现有的SQL Azure数据库用于会话状态。我正是这样做的(并且出于完全相同的原因)。标准脚本不起作用,因为它们与SQL Azure不兼容。在某些地方有一些更新的脚本(我不记得在哪里,但我会有一个谷歌),我曾经用它来设置数据库。

但是,它不是代码优先的。您可以对模式进行反向工程,但涉及许多存储过程。

请注意,您还需要考虑整理过期的会话。有一个存储过程需要定期运行(我认为是DeleteExpiredSessions),典型的建议是从Worker Role运行它。但是,您不希望部署工作者角色的唯一目的是定期运行存储过程!

编辑:在this page上找到该脚本。请注意,主文章中发布的脚本存在问题,但在Peter McEvoy的评论中,页面下方还有一个经过修改的脚本。

有些人建议优先使用Azure表存储会话状态提供程序,如果我还没有使用SQL Azure,我倾向于同意。但是我遇到了Azure提供程序的问题(特别是在开发环境中),但是一旦部署了更新的脚本,使用SQL Server会话状态就没有任何问题。

编辑2:我已经取得了进一步的进展,我会为我的博客写下来并在这里发布一个链接。

要点是:

  • 针对空数据库运行InstallSqlState.SQL脚本(针对Azure修改的脚本)
  • 使用EF Power Tools将ASP状态表反向设计为EF Code-First
  • 将反向工程类集成到您的模型和上下文中
  • 修改ASPStateTempSessions表的映射以使用Image列类型
  • 从InstallSqlState.SQL创建一个只创建存储过程的新SQL脚本
  • 修改存储过程以始终指定默认值
  • 添加一些代码以在Initializer Seed()方法中运行SQL脚本

我认为就是这样,但是当我写完这篇文章时,我会在博客上给出更完整的描述。

编辑3:

我写的第一部分现在是on my blog。第二部分即将推出(现在是时候睡觉了)。

编辑4:

Part II现在也写了。