Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP MVC中使用Cookie存储会话_Asp.net Mvc_Session State - Fatal编程技术网

Asp.net mvc 在ASP MVC中使用Cookie存储会话

Asp.net mvc 在ASP MVC中使用Cookie存储会话,asp.net-mvc,session-state,Asp.net Mvc,Session State,在过去的几年里,将整个会话存储在cookie中一直是Rails的标准—有没有一种简单的方法可以实现与ASP MVC类似的功能 默认情况下,会话/临时数据中的任何内容都存储在服务器的内存中。在web.config中,可以将其更改为SQL存储/服务器端缓存。我希望能够将这些对象持久化到cookie中 看起来我可以实现一个自定义会话状态存储提供程序。是否有更简单的方法?取决于您希望在cookie中存储何种类型的数据,如果您只想存储字符串,以下代码将执行: HttpCookie cookie = new

在过去的几年里,将整个会话存储在cookie中一直是Rails的标准—有没有一种简单的方法可以实现与ASP MVC类似的功能

默认情况下,会话/临时数据中的任何内容都存储在服务器的内存中。在web.config中,可以将其更改为SQL存储/服务器端缓存。我希望能够将这些对象持久化到cookie中


看起来我可以实现一个自定义会话状态存储提供程序。是否有更简单的方法?

取决于您希望在cookie中存储何种类型的数据,如果您只想存储字符串,以下代码将执行:

HttpCookie cookie = new HttpCookie("username","sth");
            cookie.HttpOnly = true;
            cookie.Expires = DateTime.Now.AddMonths(3);
            HttpContext.Current.Response.Cookies.Add(cookie);

您不应该为此使用会话,而是使用配置文件。配置文件使用cookie将计算机与配置文件等进行匹配。配置文件密钥存储在cookie中,并且在关闭浏览器等时不会丢失


信息在此

我强烈反对将整个会话存储在cookie中。它对性能有不良影响。考虑这一点:每个请求(对每个资源)都包含可能只需要一次或两次的可能过时数据的开销。最终,这种开销会影响用户、带宽和站点性能

下面是一个例子:

GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...
初始请求大小约为200字节。比方说,您在会话中添加了大约100个字节。现在大小为300字节,开销约为30%。再添加100个字节,开销为50%。这意味着发送请求大约需要2倍的时间和2倍的带宽

您应该仔细研究,因为它占用的空间小得多,而且实际上是有意义的。

是的,实现一个。不,恐怕没有更简单的方法了


另外,这并不像看上去的那么糟糕,即>一半的会话正在写入数据库。

我认为将会话ID(散列或任何内容)存储在cookie中,然后使用该ID从内存/数据库/任何您喜欢的存储中获取会话数据会更有效。在cookie中保持完整会话状态会增加带宽


另外,请记住安全性:如果cookie包含身份验证信息或其他敏感数据,并且您不小心,那么它很容易被用户黑客攻击以获得权限,或者破坏您的应用程序(加密数据也很糟糕,因为你必须对加密数据进行base-64编码,这进一步浪费了带宽和处理时间)。你永远不应该信任用户的输入。

我建议将
TempData
存储在cookie中(与整个会话相反)

为了在cookie中存储
TempData
,您需要覆盖
ITempDataProvider
并实现您自己的自定义提供程序

实际上有一个nuget软件包(它为您提供了这个自定义实现):和。这个软件包的好处是它可以压缩和加密您的
TempData
,因此您不必担心通过Internet发送纯文本

您只需安装nuget软件包,然后在
ControllerBase
类中重写
CreateTempDataProvider

using BrockAllen.CookieTempData;

namespace myProject.web.Controllers
{
    public class ControllerBase : Controller
    {
        // use CookieTempDataProvider instead of default provider
        protected override ITempDataProvider CreateTempDataProvider()
        {
            return new CookieTempDataProvider();
        }
    }
}

您的意思是键入“cookie中的整个会话”吗?如何通过TempData(通过cookie存储实现)维护会话信息更快吗?维护TempData还需要额外的代码开销。会话应该相当轻——在我们的例子中是几十个字节——因此请求的开销应该是最小的。2007年Rails采用了基于cookie的会话存储作为标准。本文讨论了他们为什么这样做。我很高兴r Rails社区,但我的观点是基于统计数据:。TempData比session更具优势,因为它的开销只在页面往返过程中应用一次。否则cookie应该是干净的。无论如何,在经历了web场场景的痛苦之后,我根本不使用session,这不值得。您现在使用什么方法会话状态?我认为会话对象(无论是否为inproc)或cookie是唯一的选择?@UpTheCreek-我编写的代码不依赖于会话状态。每一条信息都可以从请求(包括cookie)中重建,也可以存储在缓存/db中(如果重新计算的成本很高)。接下来,我实现了一个自定义状态会话提供程序&这确实很简单。感谢您的帮助。在这种情况下,是否需要自定义会话状态存储,或者在web.config中禁用会话才有意义?