65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 使用 Redis 进行会话状态管理(本地服务器场测试)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (11投票s)

2015年10月16日

CPOL

7分钟阅读

viewsIcon

46069

在 ASP.NET Web 应用程序中,通过 IIS 创建本地服务器场来测试 Redis 会话存储功能。

什么是 Redis?

Redis 是一个开源的键值数据结构存储。键可以是字符串、哈希、列表、集合、有序集合等。这个内存数据存储广泛用于会话状态存储和缓存。

为什么选择 Redis 进行会话状态存储?

如果您正在为大公司开发 Web 应用程序,那么您的应用程序很可能托管在多台服务器上。坦白说,事实确实如此。在某些情况下,例如,您可能希望在主服务器发生故障时提供备用服务器。在其他情况下,例如,您可能希望减少其中一台服务器的请求负载,而是将请求分发到多台服务器。所以您明白了,对吧?我们将配置 IIS 来在多台服务器之间进行负载均衡。不用担心服务器,因为我将配置我的本地主机使用不同的端口号来充当多个服务器实例。

现在这里有一个问题!假设我作为用户通过您的 Web 应用程序发送请求,您的后端服务器之上配置了一个负载均衡器,它可以将传入的请求路由到您的其中一台服务器,但您不确定是哪一台,因为它取决于您服务器的状态(服务器上的负载/服务器是否正常运行?)。再次假设您的应用程序中配置了会话存储机制。例如,在您的电子商务 Web 应用程序中,您可能希望将添加到购物车的项目通过会话进行存储。这是真实场景,因为您不希望用户在意外关闭浏览器窗口时丢失所有添加的项目。您可以将这些项目在会话中持久化一段时间,这样用户就不必从头开始。所以会话是好的!对吧?

总之,由于我们有多台服务器,如果出现问题,会话将会丢失。例如,您在将商品添加到购物车时意外关闭了浏览器窗口。所以,当您再次打开浏览器并访问相同的应用程序 URL 时,您的请求可能会被路由到您上次浏览会话所在的同一台服务器,也可能不会。也有可能,当您下次请求应用程序时,之前的服务器崩溃,并将您的请求路由到备用服务器。所以两种情况您都完了!

Redis 来拯救我们免于这种状况!由于它是一个内存数据存储,它位于负载均衡服务器上。请求进入负载均衡器,其中 Redis 用于存储会话。当下一个请求进来时,之前的会话可以在负载均衡器中找到。所以不用担心丢失会话。也许一个简单的图表可以澄清您的想法。

因此,在我们的服务器场中,我们有四台服务器,其中一台是负载均衡器,有时我们也称之为暂存服务器。所有请求都进入暂存服务器,然后被转发到连接到它的其中一台服务器,而实际运行我们 Web 应用程序的实例就在那里。

创建本地服务器场

要创建本地服务器场,首先需要在您的计算机上配置 IIS(而不是 Visual Studio 附带的 IIS Express)。配置 IIS 很容易。只需按照以下步骤操作:

  • 转到“控制面板”>“程序和功能”
  • 从右侧面板单击“启用或关闭 Windows 功能”
  • 选择“Internet Information Service”并展开节点
  • 选择节点“World Wide Web Services”>“应用程序部署功能”>“ASP.NET 4.5”(Windows 10 上为 ASP.NET 4.6)
  • 单击“确定”以在 Windows 7/8/8.1/10 上安装 IIS

安装后可能需要重新启动。从开始菜单打开 Internet Information Services (IIS) 管理器。

要能够从 IIS 管理器创建服务器场,您需要一个扩展。您可以使用 Web 平台安装程序从那里下载大量的扩展。目前,我们只需要 IIS 的应用程序请求路由 (ARR) 扩展。

创建服务器场服务器

现在我们必须为服务器场创建本地服务器。由于我们在 localhost 上使用不同的端口作为多个服务器,因此我们必须将它们的地址包含在 Windows 主机文件中。将条目添加到主机文件(C:\Windows\System32\drivers\etc\host),为三个不同的服务器 i.e. 负载均衡器(图中为暂存服务器)、server-a、server-b。

如您所见,我们已将三个服务器地址配置为指向 localhost (127.0.0.1)。现在为了区分它们,我们必须为它们绑定端口。转到 IIS 管理器,右键单击“站点”节点并选择“添加网站”。添加三个站点 i.e. 负载均衡器、server-a 和 server-b。负载均衡器使用 9000,server-a 使用 9001,server-b 使用 9002。下面是我的配置和添加 server-a 的截图。

如果您添加了所有站点,应该会看到站点列表如下:

现在是将服务器添加到服务器场。在 IIS 管理器中,右键单击服务器场节点并选择“创建服务器场”。

为您的服务器场命名(redis-testing-farm)。

在下一页上,添加您的两个服务器(www.redis-testing-server-a.com, www.redis-testing-server-a.com),并指定它们各自的 HTTP 端口,即 9001 和 9002。完成此步骤,并在 URL 重写规则窗口弹出时单击“否”按钮。

定义 URL 重写规则

我们必须定义 URL 重写规则。只需按照以下步骤操作:

  • 在根节点上选择“URL 重写”
  • 在右侧操作栏中单击“添加规则”并选择“空白规则”
  • 为您的规则命名(redis-testing-farm-rule)
  • 在“模式”中键入(.*)
  • 展开“条件”节点并添加两个条件
  • 展开“操作”节点
    • 从“操作类型”下拉列表中选择“路由到服务器场”
    • 勾选“停止处理后续规则”
    • 应用规则
  • 选择 redis-testing-farm 并转到“负载均衡”选项
    • 选择“加权轮循”
    • Apply
  • 再次选择 redis-testing-farm 并转到“服务器亲和性”
    • 选择“客户端亲和性”
    • Apply

我们选择轮循作为负载均衡算法。它将平均分配您的传入请求到服务器。这意味着如果第一次请求来到负载均衡器服务器,它将被路由到服务器 A。如果页面重新加载并再次发送请求,它将被路由到服务器 B。每次请求进来时,服务器都会在 A 和 B 之间来回切换。我在每个服务器上都添加了一个索引,并放置了一些演示文本,以便您能更好地了解请求当前正在访问哪个服务器。

创建一个简单的 ASP.NET Web 应用程序并部署

下载源代码。该应用程序包含两个页面,一个是 Index.aspx,另一个是 Result.aspx。以下是两个页面的标记和代码隐藏:

Index.aspx 标记

<form id="form1" runat="server">
<div>
	<h1>Storing Session Data in Azure Redis Cache Server A</h1>
	<asp:TextBox ID="NameTextBox" runat="server"></asp:TextBox>
	<asp:Button ID="GreetButton" runat="server" Text="Greet!!!" OnClick="GreetButton_Click"/>
</div>
</form>

Index.aspx 代码隐藏

protected void GreetButton_Click(object sender, EventArgs e)
{
    string name = NameTextBox.Text;
    Session.Add("MyName", name);
    Session.Add("SessionTime", DateTime.Now);
    Response.Redirect("~/Result.aspx");
}

Result.aspx 标记

<form id="form1" runat="server">
<div>
    Server A - 
    <asp:Label ID="NameLabel" runat="server" Text="Label"></asp:Label>
</div>
</form>

Result.aspx 代码隐藏

protected void Page_Load(object sender, EventArgs e)
{
    object name = Session["MyName"];
    object time = Session["SessionTime"];
    if (name != null && time != null)
        NameLabel.Text = "Hi! " + (string)name + ", your last session state stroing time was: " + time; 
}

在部署时,请修改 Index.aspx 中

标签以及
标签内的字符串文本,使其与您的服务器名称(Server A/ Server B/ Staging Server)匹配,以便在测试应用程序时更好地了解您当前所在的服务器。使用文件系统将应用程序部署到所有服务器(如果遇到访问被拒绝的错误,请以管理员身份运行您的 Visual Studio)。

浏览到 localhost:9000。每次发送新请求时,服务器都会来回切换,但每个服务器(server-a、server-b)的会话将是不同的。

下载并运行 Redis (redis-server)

  • 从 nuget 或 chocolatey 安装 Redis x64 服务器。这是可以放在 Visual Studio 的程序包管理器控制台中的命令:
    Install-Package Redis-64

 

  • 您可以在这里从 chocolatey 安装它:
    https://chocolatey.org/packages/redis-64

 

  • 安装后,双击 redis-server.exe 运行 Redis 服务器。
    • 从命令提示符运行 redis-cli。
    • 键入(keys *)以获取所有存储的键。

使用 redis-cli 测试会话状态

我们几乎要结束了,我们需要一个 nuget 包。该包是 `RedisSessionStateProvider`。这是从程序包管理器控制台安装它的命令:

Install-Package Microsoft.Web.RedisSessionStateProvider

为了让 Redis 存储我们的会话,我们需要在 web.config 文件中添加这些行。

如果这已经存在,那么一切都很好。再次将项目部署到您的三个服务器并进行测试,您将看到所有会话状态都已成功持久化。

正如您所见,我将文本框的文本设置到会话中并在它们之间传递。之后,该值显示在两个服务器的 Result.aspx 页面中,即我们的会话已持久化。如果您查看源代码,您会发现我使用了两个会话变量,一个用于文本框中的输入,另一个用于当前日期和时间。两者都以加密密钥的形式保存在 Redis 存储中。

源代码

在此处下载 - http://1drv.ms/1ZFgfkR

© . All rights reserved.