2

给定通用处理程序:

<%@ 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 小时?使用网络用户控件很容易:

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

但是我一直在寻找一段时间来对通用处理程序(ashx)文件做同样的事情,但找不到任何解决方案。

4

4 回答 4

8

使用您提供的代码,您是在告诉最终用户浏览器将结果缓存 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);
        }
    }
}
于 2013-07-11T14:14:04.980 回答
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);
        }
    }
}
于 2015-02-17T07:42:52.983 回答
0

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

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

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

动态缓存如何在 IIS 中工作,假设您有一个 html 文件。IIS 将静态 html 文本视为可缓存文件,它会将其压缩并将缓存的副本放入其缓存中。如果静态 html 的最后更新时间比缓存时间早,那么它将使用缓存。如果文件被修改,IIS 会发现 html 的最后更新时间大于缓存时间,所以它会重置缓存。

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

于 2013-07-11T15:07:19.880 回答
0

要缓存文件,例如 .js、.css 或其他文件,您需要将其放入 context.cache。例子:

    public void ProcessRequest(HttpContext context)
    {
        var cachedResult = context.Cache.Get(context.Request.Path);

        if (cachedResult != null && cachedResult.GetType() == typeof(VueFileRequestResult))
        {
            RequestedFileResponce(context, cachedResult as VueFileRequestResult);
            return;
        }
        
        // SOME ACTIONS WITH NON-CACHED FILE

        var fileContent = System.IO.File.ReadAllBytes(filePath);
        var result = new VueFileRequestResult(contentType.GetDescription(), fileContent);

        RequestedFileResponce(context, result);

        var expirationDate = DateTime.Now.AddYears(1);
        var dependency = new CacheDependency(filePath);
        context.Cache.Add(context.Request.Path, result, dependency, expirationDate, TimeSpan.Zero, CacheItemPriority.Low, null);

        return;
    }
于 2022-02-01T16:10:10.130 回答