缓存还是不缓存?以及如何在asp.net mvc中将其缓存在基本控制器上?

缓存还是不缓存?以及如何在asp.net mvc中将其缓存在基本控制器上?,.net,asp.net,asp.net-mvc,.net,Asp.net,Asp.net Mvc,我正在制作自己的基本控制器,因为我想将一些数据传递到母版页。现在,由于这类似于将此代码添加到该控制器中的每个视图,所以每次都会运行它 当它第一次加载时,我认为它至少已经命中了我的代码两次。所以我想把它缓存起来。但在我的书中,它说不要缓存私有数据,因为每个人都会看到它 所以我不知道该怎么办 我的两行代码就是这样做的 查找用户名并将其显示给用户 查找用户计划并显示该计划 所以我需要用户名来找出他们的GUID,这样我就可以找出他们注册的计划 所以我不知道如何缓存它,但不向所有人公开它。有没有办法让它只

我正在制作自己的基本控制器,因为我想将一些数据传递到母版页。现在,由于这类似于将此代码添加到该控制器中的每个视图,所以每次都会运行它

当它第一次加载时,我认为它至少已经命中了我的代码两次。所以我想把它缓存起来。但在我的书中,它说不要缓存私有数据,因为每个人都会看到它

所以我不知道该怎么办

我的两行代码就是这样做的

  • 查找用户名并将其显示给用户
  • 查找用户计划并显示该计划
  • 所以我需要用户名来找出他们的GUID,这样我就可以找出他们注册的计划

    所以我不知道如何缓存它,但不向所有人公开它。有没有办法让它只为这个用户缓存

    引用Asp.net mvc框架unleasehd pg 330

    不缓存私有数据

    缓存包含私有数据的页面 用户数据极其危险。什么时候 一个页面缓存在服务器上 向所有用户提供相同的页面。所以 如果缓存显示 用户信用卡号,每个人都可以 查看信用卡号码(不包括 太好了

    为所有用户缓存相同的页面 即使你需要授权。 例如,想象一下,您创建了 金融服务网站和 网站包括一个显示 用户的所有投资。页面 显示所需的金额 用户已投资一组股票, 债券和共同基金

    因为这些信息是私人的, 您需要用户在登录之前 正在查看页面。换句话说,每个 用户必须在授权之前 用户可以查看页面

    以提高系统的性能 金融服务页面,您决定 为页面启用缓存。你加上 属性的OutputCache属性 返回 页面

    不要那样做!如果缓存 返回 金融服务网页,私人网站 第一人的财务数据 请求页面将在所有用户之间共享 之后的每一位访客 应用程序

    通常,添加OutputCache和 将属性授权给相同的 控制器操作打开一个安全窗口 洞。避免这样做:


    控制器类的生命周期仅从操作请求延伸到视图呈现。你真的需要缓存这些数据吗?只需公开模型对象中的数据。查询听起来不够复杂,除此之外,大多数RDBMS供应商倾向于自己进行大量查询缓存

    HTTP是一种无状态协议,这意味着在请求之后,web服务器会忘记关于该请求的所有内容。为了避免这种无状态,asp.net提供了应用程序和会话对象。应用程序对所有请求全局可用,会话绑定到单个IP。将任何数据放入缓存通常是最后的手段,或者是缓存真正具有重载时间的数据的方案的一部分

    ASP.NET MVC中的流程大致相同

    • 请求URL
    • 控制器被称为
    • 行动被称为
    • 操作调用数据模型(用户名/用户计划)
    • 操作设置viewmodel中的数据
    • 操作使用viewmodel中的数据调用所需的视图
    • 视图被渲染
    在viewmodel上设置数据已经是“私有”的,因此我不确定缓存的需要来自何处。也许我误解了这个问题

    编辑

    好的,首先请原谅我的帖子有点冒昧。我认为您的代码根本不必进入基本构造函数的构造函数中。毕竟,您不会将控制器传递给视图

    一个好的做法是传入类型化的ViewModels。说这是你在site.master中的定义

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyNS.BaseViewDataModel>" %>
    
    以及您的HelpViewDataModel

    namespace MyNS
    {
        public class BaseViewDataModel
    
    namespace MyNS
    {
        public class HelpViewDataModel : BaseViewDataModel 
        {
    
    然后在帮助控制器的适当操作中

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Index()
    {
        var viewDataModel = new HelpViewDataModel ();
                viewDataModel.HelpText = "something";
                ..
                ..
        return View(viewDataModel);
    }
    
    现在,您可以在BaseViewDataModel的构造函数中实例化用户guid和用户计划,并且只会对实际实例化BaseViewDataModel子类的操作调用它

    您的视图是类型安全的,这是巨大的生产力提升,因为我们输入了现在可以调用的视图

    <%= this.Model.HelpText %>
    
    
    

    在帮助视图中。

    回答是否应该缓存某个内容的最佳方法是确定它是否确实影响了站点的性能。与实际指标。别猜了。如果它没有伤害到任何东西,而且一切似乎都是有反应的,那么我会说,在需要的时候再做别的事情。“渗透优化是万恶之源”已经说过一两次了:)

    如果你选择缓存数据,我不确定你说的每个人都可以看到它是什么意思?如果您指的是ASP.NET缓存框架(
    HttpContext.Current.Cache
    ),那么它存在于您的服务器内存中,并且是完全不稳定的(如果内存压力击中它,它将在任何时候被清除)。因此,请务必记住这一点,并始终检查null。要使用它,只需使用
    Cache.Insert()
    ,它有几个重载来自定义缓存首选项

    现在,如果您正在谈论使用浏览器cookies缓存某些内容,那就另当别论了。cookie确实存储在浏览器中,除非您为cookie指定HttpOnly,否则可以通过javascript读取cookie(只有当您在某处存在XSS漏洞时,这才是一个问题,因为恶意用户可以使用javascript“呼叫主页”用户的私有cookie数据。)因此,除非绝对必要,否则不要将任何私有内容放入cookie,如果确实需要,则应指定HttpOnly并采取适当步骤保护用户

    如果安全性是您最关心的问题,那么您肯定应该阅读更多关于XSS和其他常见HTTP安全问题的内容。(
    <%= this.Model.HelpText %>