技术开发 频道

ASP.NET MVC 3:缓存功能的设计问题

  VaryByContentEncoding,一般设置为Accept-Encoding里面可能的Encoding名称,从上图也可以看出,Request里面是包含这个标头的。

  VaryByCustom,则是一个完全可以定制的设置,例如我们可能需要根据用户角色来决定不同的缓存版本,或者根据浏览器的一些小版本号来区分不同的缓存版本,我们可以这样设置:VaryByCustom=”Role,BrowserVersion”,这些名称是你自己定义的,光这样写当然是没有用的,我们还需要在Global.asax文件中,添加一个特殊的方法,来针对这种特殊的需求进行处理。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
namespace MvcApplicationCacheSample
{
    
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
    
// visit http://go.microsoft.com/?LinkId=9394801
    
public class MvcApplication : System.Web.HttpApplication
    {
        
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(
new HandleErrorAttribute());
        }
        
public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute(
"{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                
"Default", // Route name
                
"{controller}/{action}/{id}", // URL with parameters
                
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
        }
        
protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
        
public override string GetVaryByCustomString(HttpContext context, string custom)
        {
            switch(
custom)
            {
                
case "Role":
                    {
                        
return string.Join(",", Roles.GetRolesForUser());
                    }
                
case "BrowserVersion":
                    {
                        
return context.Request.Browser.Type;
                    }
                
default:
                    break;
            }
            
return string.Empty;
        }
    }
}

   上面四个属性,可以改变缓存使用的行为。另外还有一个重要属性将影响缓存保存的位置,这就是Location属性,这个属性有如下几个可选项,我从文档中摘录过来

  这里要思考一个问题,设置为Client与设置为Server有哪些行为上面的不同

  如果设置为Client,那么第一次请求的时候,得到的响应标头里面,会记录好这个页面应该是要缓存的,并且在10秒之后到期。如下图所示

  而如果设置为Server的话,则会看到客户端是没有缓存的。

 

0
相关文章