给出通用处理程序:
<%@ 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
)文件并找不到任何解决方案。
答案 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以查询您尝试缓存的项目的上次更新时间。