哪个网站做刷手最好,wordpress做网盘资源,wordpress 链接优化插件,建筑公司网站宣传建筑工地文案范文图片2019独角兽企业重金招聘Python工程师标准 应用部署结构#xff08;精简#xff09;: 站点部署在Nginx后面#xff0c;以Nginx作为反向代理#xff0c;不希望在Nginx上设置ip_hash#xff0c;实现比较真实的负载均衡效果。 这时考虑到需要让site1和site2同时… 2019独角兽企业重金招聘Python工程师标准 应用部署结构精简: 站点部署在Nginx后面以Nginx作为反向代理不希望在Nginx上设置ip_hash实现比较真实的负载均衡效果。 这时考虑到需要让site1和site2同时共享会话信息进行如下的配置 默认情况下asp.net站点的会话模式是采用Inproc模式,这种模式在站点因IIS重启会导致丢失用户会话已经登陆的用户会自动重定向到登陆页面在本次实践中使用SqlServer模式 创建会话数据库(独立于应用): aspnet_regsql.exe -S server_ip -E -ssadd -sstype c -d dbname更多参数可以参考命令的帮助aspnet_regsql.exe /?通常路径在**C:\Windows\Microsoft.NET\Framework64\{.net_version}**下 配置如下 sessionState modeSQLServer sqlConnectionStringserverserver_ip;databasedbname;uiduser;pwdpwd; allowCustomSqlDatabaseTrue cookielessfalse timeout20 /会话数据库的表ASPStateTempApplications中存放应用的信息(appId和AppName),每一个站点一条记录我两个站点分别使用该数据库所以有两条记录如图 通过以上的配置 貌似完成了会话的共享这时候通过Nginx的IP地址发送两个请求到服务器一个登陆一个获取用户考试列表。通过Nginx的日志发现两次请求被分发到两台不同的后端服务器 从图中可以看出第一次请求是192.168.2.2:80803这个站点处理第二个请求被192.168.2.5:8083这个站点处理。明明已经设置了会话共享为什么第二次请求被提示为未登录。检查是否登陆的代码如下 public class WebApiCheckLoginFilterAttribute : ActionFilterAttribute{public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext){LoginService service new LoginService();string controllerName actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;string actionName actionContext.ActionDescriptor.ActionName;bool isAuthAction controllerName.Equals(ExamAPI) actionName.Equals(Login);if (!isAuthAction){HttpSessionState Session System.Web.HttpContext.Current.Session;if (Session[user] null){throw new HttpException((int)HttpStatusCode.NonAuthoritativeInformation, 未登录用户或已在其他设备中登录);}if (!service.IsOnline(Model.DeviceType.Phone, Session.SessionID)){throw new HttpException((int)HttpStatusCode.NonAuthoritativeInformation, 未登录用户或已在其他设备中登录);}}base.OnActionExecuting(actionContext);}}上述代码是为了检查如果session[user]null就会提示是未登陆。已经配置了会话共享为什么session[user]还是获取不到用户对象通过各种尝试发现asp.net在处理session的时候会根据站点的AppId加上浏览器上的SessionId在数据库表([ASPStateTempSessions])中创建会话记录SessionId的值如下 0kf0zoq4to3h0z0b1eztw43s28d8c07528d8c075 是AppId685293685的16进制对应的AppId0kf0zoq4to3h0z0b1eztw43s是客户端cookie中存放的sessionid通过查看存储过程[dbo].[TempGetAppID]的代码,发现asp.net会通过每个站点的AppName见表ASPStateTempApplications去获取AppId然后将SessionIdAppId(16进制)作为主键插入到表ASPStateTempSessions中这样的处理逻辑是保证一个会话数据库会被N个站点共同使用不用每个站点创建自己的会话数据库。隐藏的问题是如果站点的AppName不一样会导致获取的AppId不一样达不到会话共享的目的。 验证过程如下向Nginx发送两个请求一个登陆一个获取考试列表会在ASPStateTempSessions表中产生两条记录正常情况应该两个请求也应该只产生一条会话记录。 为了保证只产生一条会话记录可以通过让site1和site2的AppName保持一致每次通过存储过程[dbo].[TempGetAppID]获取的AppId都是同一个。 修改方式为 修改完成后再次发送两个请求一个登陆一个获取考试列表两个请求经过Nginx分发到两个站点后在ASPStateTempSessions只产生一条会话记录这样才真正的实现会话的一致性。 配置machineKey,在做asp.net站点集群的时候如果站点中使用到cookie或viewstate的话需要配置machineKey来确保多台机器共享验证和ViewState.每个节点上的machineKey配置必须一致 按照MSDN的标准说法“对密钥进行配置以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密并将其用于对进程外会话状态标识进行验证.加密和解密使用的就是machineKey 生成machineKey的代码 public static string CreateMachineKey(int length){byte[] random new byte[length / 2];RNGCryptoServiceProvider rng new RNGCryptoServiceProvider();rng.GetBytes(random);StringBuilder builder new StringBuilder();for (int i 0; i random.Length; i){builder.Append(string.Format({0:X2}, random[i]));}return builder.ToString();}string decryptionKey CreateMachineKey(48);string validationKey CreateMachineKey(128);web.config配置内容 system.webcompilation targetFramework4.0 /machineKey validationKeyvalidationKey decryptionKeydecryptionKey/
...other.../system.web小结 asp.net 站点的会话模式如果选用SqlServer的话需要保证站点群可能有N个站点通过[dbo].[TempGetAppID]存储过程获取AppId后的结果是相同的。可以通过修改存储过程也可以通过修改AppName。 转载于:https://my.oschina.net/hulingfeng/blog/1525737