有时我们需要为PC浏览器及移动浏览器生成不同的页面,为了提高性能,不能每次请求都去判断User-Agent,通常用一个 Cookie 标记一下客户端是否是移动客户端,这样只需要读取这个 Cookie 的值就知道这个请求是否是移动端。

这里主要通过 OutputCacheByCustom 来实现对不同的 Cookie 值生成不同的页面,具体做法也比较简单:

1. 在 Global.asmx.cs 里重写 GetVaryByCustomString 函数

这个函数接受两个参数,第一个是 System.Web.HttpContext 对象,包含了对话的上下文,第二个是 string 类型的,用户判断具体采用用户定义的哪种缓存方案。

public override string GetVaryByCustomString(System.Web.HttpContext context, string custom)
{
if (custom == "IsMobile")
{
if (context.Request.Cookies["IsMobile"] == null)
return string.Empty;
return context.Request.Cookies["IsMobile"].Value;
}
else
{
return base.GetVaryByCustomString(context, custom);
}
}

2. 在需要判断 Cookie 生成不同缓存的 View 上添加 OutputCache Attribute

public class CacheController : Controller
{
[OutputCache(Duration=, VaryByCustom="IsMobile",Location=OutputCacheLocation.Server)]
public ActionResult Index()
{
return Content(DateTime.Now.ToString());
}
}

以上两步就可以了,当然也可以将缓存方案写进 Web.config 配置文件中:

<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<clear />
<!-- 60 seconds-->
<add varyByCustom="IsMobile" duration="60" name="ChangeByDevice" location="Server" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>

在 View 相应的位置只需指定 OutputCache 的 CacheProfile

public class CacheController : Controller
{
[OutputCache(CacheProfile = "ChangeByDevice")]
public ActionResult Index()
{
return Content(DateTime.Now.ToString());
}
}

测试

打开 http://localhost/cache/index

Output:2014/10/26 13:58:01

在控制台修改 IsMobile 的 Cookie 值

var date = new Date();
var expireDays = 100;
date.setTime(date.getTime() + expireDays*24*3600*1000);
document.cookie = "isMobile=1; path=/; expires=" + date.toGMTString();

重写打开 http://localhost/cache/index

Output:2014/10/26 13:58:16

针对不同的Cookie做页面缓存的更多相关文章

  1. 在关闭页面时自动清除Session cookie,页面缓存

    在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息. 清除session对 ...

  2. Mvc4页面缓存设置Cookie导致缓存失效

    [OutputCache(Duration = 60, VaryByParam = "none")]        public ActionResult Index()      ...

  3. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  4. [转]MVC3缓存之一:使用页面缓存

    本文转自:http://www.cnblogs.com/parry/archive/2011/03/19/OutputCache_In_MVC3.html 在以前的WebForm的开发中,在页面的头部 ...

  5. [转]Asp.net mvc 网站之速度优化 -- 页面缓存

    网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 — 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...

  6. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  7. MVC3缓存之一:使用页面缓存

    MVC3缓存之一:使用页面缓存 在MVC3中要如果要启用页面缓存,在页面对应的Action前面加上一个OutputCache属性即可. 我们建一个Demo来测试一下,在此Demo中,在View的Hom ...

  8. JSP 页面缓存以及清除缓存

    一.概述 缓存的思想可以应用在软件分层的各个层面.它是一种内部机制,对外界而言,是不可感知的. 数据库本身有缓存,持久层也可以缓存.(比如:hibernate,还分1级和2级缓存) 业务层也可以有缓存 ...

  9. 更新页面缓存OutputCache

    为什么要使用OutputCache 我认为OutputCache是最简单的缓存技术了,它针对的是页面级别的,简单的一条指令就可以达到缓存的效果,有效的减轻服务器的压力和减少带宽,对于网站一些不会频繁更 ...

随机推荐

  1. NOIP2013 题解

    转圈游戏 题解:快速幂 #include <cstdio> int n, m, k, x; inline long long QuickPow(int a, int k, int MOD) ...

  2. 2014年IT界最具“钱”景的10类岗位

    来自人力资源公司罗致恒富(Robert Half)的一组2014年薪资指导显示,在工程.软件开发和程序领域有一技之长的职工的薪资可能出现何种程度的增长.罗致恒富预计2014年薪资将平均上调3.7%,而 ...

  3. Linux环境中DISPLAY环境变量的解释及设置

    在Linux/Unix类操作系统上的GUI应用程序使用X Window系统(X Window System),它旨在允许多个用户使用窗口化的应用程序通过网络访问计算机. DISPLAY环境变量用来设置 ...

  4. blob及行外数据

    本文中我们假设innodb_page_size为16k,记录格式为compact. 1 大字段 大字段的类型可以参看这里, Data Type Storage Required TINYBLOB, T ...

  5. TypeScript开篇:尝点新鲜和甜头

    返回TS学习总目录 快速开始 我们通过创建一个简单的web应用来开始使用TypeScript.获得TS工具的方法主要有两种,一种是通过NPM(Node包管理器),另一种是通过VS2012安装TS的插件 ...

  6. 【译】用Fragment创建动态的界面布局(附Android示例代码)

    原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...

  7. 小米Web前端JavaScript面试题

    面试题目 一. 请定义这样一个函数 function repeat (func, times, wait) { } 这个函数能返回一个新函数,比如这样用 var repeatedFun = repea ...

  8. jenkins2 pipeline介绍

    文章来自:http://www.ciandcd.com 文中的代码来自可以从github下载: https://github.com/ciandcd   什么是jenkins2的pipeline?   ...

  9. SONATYPE NEXUS搭建MAVEN私服

    1.为什么使用Nexus如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费 ...

  10. Javascript之document对象用法(很重要)

    一.找到元素 document.getElementById("id"):根据id找层,最多找一个 var a=document.getElementById("id&q ...