由一个业务需求引发的对 ASP.NET 全局变量的调研及结果

news/2024/11/8 23:17:32/文章来源:https://www.cnblogs.com/JackyGz/p/18536101

Coding-10

前言

前段时间使用 ASP.NET MVC + Form Auth 做了一个单机小项目,当时对于采用什么方式来存储登录状态有些纠结,通常的做法是使用 Cookie 或者 Session,但是我想有没有更好的方式来存储登录状态呢?于是花了点时间调研了 ASP.NET 的全局变量使用方式,希望能找到更好的方式来存储登录状态。

以下是本次调研过程及总结。

调研过程及总结

Application

测试过程:

  1. LoginController 在 Chrome 浏览器写入 Application["Test"] 的值
  2. 在 Edge 浏览器打开,Application["Test"] 的值依然存在

结论

Application 是全局性的,不太适合存储登录状态

Session

测试过程:

  1. LoginController 在 Chrome 浏览器写入 Session["Test"] 的值
  2. 重新刷新 Chrome 浏览器页面,值存在
  3. 在 Edge 浏览器打开,Session["Test"] 的值不存在

结论

Session 适合存储登录状态,其值存储在服务器端,重启 IIS 或者到时间(默认是20分钟)等方式都会使其丢失

Cookie

测试过程:

  1. LoginController 在 Chrome 浏览器写入 HttpCookie ["Test"] 的值
  2. 重新刷新 Chrome 浏览器,值存在
  3. 在 Edge 浏览器 打开,cookie 不存在

结论

Cookie 适合存储登录状态,其值存储在客户端,不能存储太多信息,安全性没有 Session 好

静态变量

测试过程:

  1. LoginController 在 Chrome 浏览器写入静态变量 GlobalTest.MyLogin 的值
  2. 在 Edge 浏览器打开,GlobalTest.MyLogin 的值依然存在

结论

静态变量是全局性的,不太适合存储登录状态

总结

权衡之下,最终还是选择使用 Session,在单机模式下,Session 相对比较安全可靠。当然还可以把登录状态持久化到本地文件或者数据库中,不过这又是另外一回事了,维护起来也相对比较麻烦。

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),更多干货等你来

往期精彩

  1. C# 静态类,高手不想让你知道的 15 个真相
  2. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  3. 用 C# Stopwatch 计时,让代码性能飞起来!
  4. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  5. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  6. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  7. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  8. C# AutoMapper 10个常用方法总结
  9. C# 7个方法比较两个对象是否相等
  10. C# 去掉字符串最后一个字符的 4 种方法

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/829084.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果手机数据传输

利用共享的文件夹 这个方法简单来说就是iPhone通过远程连接到Windows服务器,利用共享的文件夹来进行照片中转。 注意:iPhone和Windows必须要连接到同一个局域网内! ● Windows设置 第一步,获取Windows电脑的IP地址。 具体操作是先打开“Windows设置-网络和Internet-网络和共…

c语言中返回整数值的长度

001、方法1 while循环[root@PC1 test]# ls test.c [root@PC1 test]# cat test.c ## 测试c程序 #include <stdio.h>int get_length(int a) {int length = 0;while(a > 0){length++;a /= 10;}return length; }int main(void) {int a;printf("a = "…

Blender 常用建模操作

常用简单介绍 挤出 快捷键:E 挤出是2个动作,生成加移动,所以右键撤销只能撤销移动内插 快捷键:I 内插仅是一个动作倒角 快捷键:Ctrl+B 滚动滚轮可以增加倒角的段数环切 快捷键:Ctrl+R 滚动滚轮可以增加倒角的段数挤出详细介绍 沿轴线挤出或者自动挤出挤出流形可以向内挤出…

Stack模块的设置

TEAM: Topological Evolution-aware Framework for Traffic Forecasting–Extended Version Motivation 为了捕捉复杂的时空动态,许多基于深度学习的方法最近被提出,并由于其学习非线性动力学[35,59]的能力,在挑战数据集上显示出了有希望的结果。这些方法通常建立在图神经网…

CCPC辽宁省赛赛后总结

2024CCPC辽宁省赛-赛后总结 ​ 写这篇的时候已经是11/8日了,过了半个多星期才开始写,我实在堕落,啊对对对。 ​ 这算是acm生涯中真正意义上的首场了,本来是奔着首银摄金的目标去的,结果拿了个铜尾,导致我们小队闹得不是很愉快,所以来写下这篇总结来避免下次犯错。ps:滚榜…

C++之endl以及它与换行符的区别

看下C++_primer上的一段话,并给予解释:1. endl 是操纵符 在 C++ 中,endl 是一种特殊的操纵符(manipulator),它的作用不仅是结束一行(相当于换行),还会刷新缓冲区。操纵符是一种可以影响输出行为的特殊值,比如 endl、setw 等。 题外话 想要了解更多关于setw的内容,可…

C++之fixed

在 C++ 中,fixed 是一个操纵符(manipulator),用于指定浮点数的显示格式。 在默认情况下,C++ 会使用科学计数法或定点(小数点)格式输出浮点数,具体取决于数值的大小和有效位数。 然而,当使用 fixed 时,它会强制所有浮点数都以定点格式显示,即以小数点后的固定位数输出…

MyBatis如何关闭一级缓存(分注解和xml两种方式)

MyBatis如何关闭一级缓存(分注解和xml两种方式)@目录问题:为什么有缓存什么场景下必须需要关闭一级缓存关闭一级缓存方法(针对使用MyBatis场景)第1种:注解形式(可指定仅仅某个Mapper关闭注解)第2种:sql动态拼接传入的随机数 问题:为什么有缓存 mybatis默认开启一级缓存 什…

记录一下 Win11 下自编译 Ollama 本地运行 llama3.1

运行环境Windows 11(显卡 AMD Radeon RX 6650 XT)VS Code(用于查找特定代码,在 gfx1030 附近添加 gfx1032)GitGo 版本 $ go version go version go1.23.3 windows/amd64MinGW (编译需要 make 命令) $ make -v GNU Make 4.4.1 Built for x86_64-w64-mingw32 Copyright (C) …

记录一下 Win11 下编译 Ollama 本地运行 llama3.1

记录一下 Win11 下自编译 Ollama 本地运行 llama3.1 运行环境Windows 11(显卡 AMD Radeon RX 6650 XT)VS Code(用于查找特定代码,在 gfx1030 附近添加 gfx1032)GitGo 版本 $ go version go version go1.23.3 windows/amd64MinGW (编译需要 make 命令) $ make -v GNU Make …

解决Mac M芯片 Wireshark 运行rvictl -s 后,出现Starting device failed

前言 mac os big sur 之后,苹果系统的安全性能提升,导致 rvictl -s 创建虚拟网卡失败。 $ rvictl -s 000348120-001621w21184C01E bootstrap_look_up(): 1102Starting device 000348120-001621w21184C01E [FAILED]这是由于 rvictl 需要开启系统扩展才能使用,但是 M 芯片的 M…