ASP.net缓存ASHX文件服务器端

时间:2013-07-11 13:55:55

标签: c# asp.net caching

给出通用处理程序:

<%@ WebHandler Language="C#" Class="autocomp" %>

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;

public class autocomp : IHttpHandler {

    public void ProcessRequest (HttpContext context) {

        context.Response.ContentType = "application/json";
        context.Response.BufferOutput = true;

        var searchTerm = (context.Request.QueryString["name_startsWith"] + "").Trim();

        context.Response.Write(searchTerm);
        context.Response.Write(DateTime.Now.ToString("s"));

        context.Response.Flush();
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

我如何server side根据name_startsWith查询字符串参数缓存此文件1小时?使用Web用户控件很容易:

<%@ OutputCache Duration="120" VaryByParam="paramName" %>

但我一直在寻找一段时间来使用通用处理程序(ashx)文件并找不到任何解决方案。

3 个答案:

答案 0 :(得分:7)

使用您提供的代码,您告诉最终用户浏览器将结果缓存30分钟,因此您不进行任何服务器端缓存。

如果要缓存结果服务器端,您可能正在寻找HttpRuntime.Cache。这将允许您将项目插入到全局可用的缓存中。然后在页面加载时,您需要检查缓存项目是否存在,然后如果项目不存在或在缓存中过期,请转到数据库并检索对象。

修改

通过更新的代码示例,我发现https://stackoverflow.com/a/6234787/254973在我的测试中有效。所以在你的情况下你可以这样做:

public class autocomp : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        OutputCachedPage page = new OutputCachedPage(new OutputCacheParameters
        {
            Duration = 120,
            Location = OutputCacheLocation.Server,
            VaryByParam = "name_startsWith"
        });

        page.ProcessRequest(HttpContext.Current);

        context.Response.ContentType = "application/json";
        context.Response.BufferOutput = true;

        var searchTerm = (context.Request.QueryString["name_startsWith"] + "").Trim();

        context.Response.Write(searchTerm);
        context.Response.Write(DateTime.Now.ToString("s"));
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
    private sealed class OutputCachedPage : Page
    {
        private OutputCacheParameters _cacheSettings;

        public OutputCachedPage(OutputCacheParameters cacheSettings)
        {
            // Tracing requires Page IDs to be unique.
            ID = Guid.NewGuid().ToString();
            _cacheSettings = cacheSettings;
        }

        protected override void FrameworkInitialize()
        {
            base.FrameworkInitialize();
            InitOutputCache(_cacheSettings);
        }
    }
}

答案 1 :(得分:1)

对于多个查询字符串参数

public class test : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        OutputCachedPage page = new OutputCachedPage(new OutputCacheParameters
        {
            Duration = 120,
            Location = OutputCacheLocation.Server,
            VaryByParam = "name;city"
        });

        page.ProcessRequest(HttpContext.Current);

        context.Response.ContentType = "application/json";
        context.Response.BufferOutput = true;

        var searchTerm = (context.Request.QueryString["name"] + "").Trim();
        var searchTerm2 = (context.Request.QueryString["city"] + "").Trim();

        context.Response.Write(searchTerm+" "+searchTerm2+" ");
        context.Response.Write(DateTime.Now.ToString("s"));
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
    private sealed class OutputCachedPage : Page
    {
        private OutputCacheParameters _cacheSettings;

        public OutputCachedPage(OutputCacheParameters cacheSettings)
        {
            // Tracing requires Page IDs to be unique.
            ID = Guid.NewGuid().ToString();
            _cacheSettings = cacheSettings;
        }

        protected override void FrameworkInitialize()
        {
            base.FrameworkInitialize();
            InitOutputCache(_cacheSettings);
        }
    }
}

答案 2 :(得分:0)

IIS不使用Max Age来缓存任何内容,因为它不是HTTP PROXY。

这是因为您没有设置某个相关文件的上次修改日期时间。 IIS需要缓存依赖项(文件依赖项,以便它可以检查上次更新时间)并将其与缓存进行比较。 IIS不能用作HTTP代理,因此它不会将项目缓存30秒,而是IIS仅根据某种日期时间或某些缓存变量更新缓存。

您可以添加两个缓存依赖项,即文件依赖项和Sql缓存依赖项。

动态缓存在IIS中的工作原理,假设你有一个html文件。 IIS将静态html文本视为可缓存文件,它将对其进行gzip并将缓存副本放入其缓存中。如果静态html的上次更新时间早于缓存时间,那么它将使用缓存。如果文件被修改,IIS将发现html的最后更新时间大于缓存时间,因此它将重置缓存。

对于动态内容,您必须相应地规划缓存。如果基于存储在SQL表中的某些行提供内容,则应跟踪该行的上次更新时间,并在IIS上添加缓存依赖项以及SQL以查询您尝试缓存的项目的上次更新时间。