• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NET中实现Session的负载均衡

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

据我目前所知有2种方法,如下:

1、利用微软提供的解决方案

参考网址:http://blog.maartenballiauw.be/post/2008/01/23/ASPNET-Session-State-Partitioning.aspx

2、利用第三方组件,比如:Memcached

我们排除第二种方法,只说第一种方法。


 在ASP.NET中Session的存储方式有3种:

1、IIS进程

2、ASP.NET State Service服务

3、SqlServer数据库

好,我们来分析一下,将Session放入IIS进程肯定是不行的,将Session放入SqlServer数据库中性能方面可能大打折扣,最好是放在ASP.NET State Service中。


下面说一下步骤:

1、在命令行键入services.msc打开服务窗口,开启ASP.NET State Service,仅仅这样还不行,还需要在注册表修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection的值,改为1即可。

2、新建解决方案MySession,里面包含一个Web项目:MySession和一个类库:App

3、在类库下面新建一类文件:PartitionResolver.cs,内容为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace App
{
    public class PartitionResolver : System.Web.IPartitionResolver
    {
        #region Private members

        private String[] partitions;

        #endregion


        #region IPartitionResolver Members

        public void Initialize()
        {
            // Create an array containing
            // all partition connection strings
            //
            // Note that this could also be an array
            // of SQL server connection strings!
            partitions = new String[] {
                "tcpip=192.168.1.17:42424",
                "tcpip=192.168.1.18:42424"
            };
        }

        public string ResolvePartition(object key)
        {
            // Accept incoming session identifier
            // which looks similar like "2ywbtzez3eqxut45ukyzq3qp"
            string sessionId = key as string;

            // Create your own manner to divide session id's
            // across available partitions or simply use this one!
            int partitionID = Math.Abs(sessionId.GetHashCode()) % partitions.Length;
            return partitions[partitionID];
        }

        #endregion
    }
}
View Code

  注意:可能需要引用System.Web,而且服务器IP列表自行斟酌修改,端口保持不变

4、在MySession Web项目中引用类库App

5、在MySession Web项目中的Web.config的<system.web>节点里面添加<sessionState mode="StateServer" partitionResolverType="App.PartitionResolver"/>

6、新建Default.aspx页面,cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MySession
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["test"] == null)
            {
                Session["test"] = "Test";
            }
            Response.Write(Session["test"]);
        }
    }
}
View Code

7、新建ShowSession.aspx页面,cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MySession
{
    public partial class ShowSession : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(Session["test"]);
        }
    }
}
View Code

按照我说的来,应该是没有问题的。简单吧?

而且还支持同一个顶级域名的跨域访问,不信自己试试。

如果有多台Web服务器,到时候可能还要注意machineKey


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#—ASP.NET:集成极光推送(PushAPIv3)发布时间:2022-07-10
下一篇:
ASP.NETMVC框架开发系列课程(webcast视频下载)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap