使用 Redis 和 ASP.Net MVC5 实现自定义 ASP.NET 状态管理 – 第 1 部分






4.93/5 (7投票s)
介绍如何安装 Redis 服务器并使用 Redis 和 ASP.NET MVC5 实现自定义 ASP.NET 状态管理。
引言
在基于 Web 的编程中,当一个请求发送到服务器并返回时,会创建一个新的 Web 页面实例,而服务器不知道之前的请求/页面。为了在请求/响应之间维护 Web 页面的状态,ASP.Net 提供了几种在服务器或客户端存储状态数据的方法。
Cookie、隐藏字段、查询字符串、视图状态、控件状态将数据存储在客户端设备上,而会话状态、应用程序状态则将数据存储在服务器内存中。
ASP.NET 允许使用会话状态并通过 Web 服务器内存来保存值。存储在会话中的值保存在服务器上,直到它们被显式删除或会话过期。
ASP.Net 中主要有两种会话模式。
- 进程内 (In Proc) – 这是默认的会话模式,它使用 Web 服务器本身来处理会话状态。这种模式比其他模式更快,缺点是它会给 Web 服务器本身带来额外的开销,并且在 Web 服务器回收时不会保存会话状态数据。
- 进程外 (Out Proc) – 这种模式使用配置好的(在单独的服务器上)ASP.Net 状态服务、SQL Server 或自定义提供程序来存储会话数据。即使 Web 服务器回收,这种模式也能保留会话数据,但为了保存状态,数据类型/对象必须是可序列化的。
本文将介绍如何在 ASP.Net MVC 5 应用程序中使用 Redis 进行 ASP.Net 自定义状态管理。
在开始之前,先简单介绍一下 Redis 和 ASP.Net MVC;
Redis 是一个用 ANSI C 编写的开源内存 NOSQL 键值数据存储。REDIS 代表 REmote DIctionary Server(远程字典服务器)。
ASP.Net MVC5 是 Microsoft 的一个开源 Web 开发框架,它利用了 ASP.NET 和 .NET Framework 的强大功能。
在演示应用程序中,我将使用 Visual Studio Express 2013 for Web 作为开发环境,目标是 .Net Framework 4.5,并结合 Redis 服务器进行自定义 ASP.Net 状态管理。
首先,我将演示如何通过 NuGet 下载 Redis 服务器。
注意:我将在开发机本身上配置 Redis 服务器,但在实际应用中,您应该将其配置在另一台机器上。
步骤 1:打开 Visual Studio 2013 for Web,创建一个新的 ASP.Net Web 应用程序,选择“Empty”模板,并勾选“Add folders and reference”选项以添加 MVC,如下所示。
现在我们已经创建了一个基本的 ASP.Net MVC 文件夹,其中包含最少的引用。解决方案资源管理器如下图所示。
步骤 2:要通过 NuGet 下载 Redis 服务器,请右键单击“解决方案资源管理器”,然后选择“Manage NuGet Packages”。
步骤 3:在搜索框中键入“Redis”,选择“Redis-32”,然后单击“Install”。这是适用于 Windows 平台的 Redis 32 位服务器。
点击“Install”后,Redis 32 位二进制文件将下载到 \packages 文件夹中,如下图所示。
注意:您可以将这些 Redis 二进制文件复制到任何您选择的位置。只需将 Redis 二进制文件夹中的所有内容复制到任何文件夹,然后运行 redis-server.exe 启动服务器,运行 redis-cli.exe 通过 Shell 连接到此服务器。
步骤 4:接下来,我们将下载 ASP.NET 的 Redis 会话状态提供程序,如下所示。右键单击“解决方案资源管理器”,然后选择“Manage NuGet Packages”。在搜索框中键入“Redis State”,然后选择
Microsoft 创建的“RedisSessionProvider”并单击“Install”。
注意:这里 NuGet 包管理器将自动安装依赖库并将必要的配置详细信息添加到 Web.config 文件中。
步骤 5
添加 RedisSessionStateProvider NuGet 包将执行以下操作:
- 添加对 ASP.NET 的 Redis 会话状态提供程序程序集及其依赖项的引用。
- 在 Web.config 文件的 system.web 部分添加了以下配置。
<sessionState mode="Custom" customProvider="MySessionStateStore"> <providers> <!-- <add name="MySessionStateStore" host = "127.0.0.1" [String] port = "" [number] accessKey = "" [String] ssl = "false" [true|false] throwOnError = "true" [true|false] retryTimeoutInMilliseconds = "5000" [number] databaseId = "0" [number] applicationName = "" [String] connectionTimeoutInMilliseconds = "5000" [number] operationTimeoutInMilliseconds = "1000" [number] /> --> <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false" /> </providers> </sessionState>
成功安装 RedisSessionStateProvider 和依赖库后,
我们的解决方案资源管理器引用如下所示。
以及 Web.config 文件中的 System.web 部分如下所示。
请注意,这里的 Redis 服务器配置为本地主机和默认端口。
现在我们可以测试我们的 MVC 应用程序使用自定义 Redis 会话了。
步骤 6
首先,我们需要启动 Redis 服务器。
转到 \Redis_ASPNet_StateDemo\packages\Redis-32.2.6.12.1\tools **目录,然后**
双击“redis-server.exe”。
服务器启动并运行后,服务器将在端口 6379 上侦听,如下所示。
步骤 7:在我们的解决方案资源管理器中,在“\Views”文件夹下创建一个名为“Home”的子文件夹,如下所示。
- 解决方案资源管理器 -> 右键单击 Views 文件夹 -> Add -> New folder。将文件夹命名为“Home”,以存放我们的视图。
- 解决方案资源管理器 -> 右键单击 Home 文件夹 -> Add -> Views... 添加一个空模板视图,并将其命名为 Index.cshtml。
步骤 8:现在我们需要为我们的 Home 视图文件夹创建一个相应的控制器。
- 解决方案资源管理器 -> 右键单击 Controller 文件夹 -> Add -> Controller ... 选择 MVC 5 Controller – Empty 模板,并将控制器文件重命名为 HomeController.cs。
完成步骤 7 和步骤 8 后,我们的解决方案资源管理器如下所示。
现在我们的应用程序已准备好运行。要进行测试,请按 F5(或 Visual Studio 中配置的任何调试键),然后查看加载的空白索引页。
步骤 9
要测试自定义 Redis 状态管理功能,
将以下代码添加到我们的 HomeController.cs -> Index Action 方法中。这里我们只是将数据存储到 Session 变量中,这些数据将被保存到 Redis 服务器。
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
Session["RedisData"] = "This is stored in Redis Server , time - " + DateTime.Now.ToLongTimeString();
return View();
}
}
接下来,将以下代码添加到 Index.cshtml 视图中以检索和显示会话数据。
@*@Index.cshtml*@ <html> <head> <meta name="viewport" content="width=device-width" /> <title>Redis -ASP.NET Session State Provider </title> </head> <body> <div> <h1>Redis -ASP.NET Session State Provider </h1> <h3> Message retrieved from Redis Session State Server : @HttpContext.Current.Session["RedisData"]</h3> </div> </body> </html>
现在按 F5(或 Visual Studio 中配置的任何调试键),您将看到从 Redis 服务器检索到的会话数据。
注意:确保在按 F5 之前启动 Redis 服务器,如 Web.config 中配置的那样。
为了验证存储在 Redis 服务器中的数据,我们可以使用 redis-cli.exe 连接到服务器。运行
redis-cli.exe,然后输入命令“keys *”来查看存储的数据。这里的数据将被哈希并存储到 Redis 服务器。另外,还有一些适用于 Redis 的 GUI 客户端,也可以从互联网下载。
注意:有关 Redis Shell 命令,请参阅 https://redis.ac.cn/commands。
这只是一个关于如何配置 ASP.Net 自定义状态管理使用 Redis 的入门文章。要存储类对象等复杂数据类型,类必须被序列化。我将在完成文章后更新本文的第 2 部分链接,其中将演示复杂数据类型到 Redis 状态服务器的存储。