如何使用.ashx处理程序的输出缓存?在这种情况下,我正在进行一些繁重的图像处理,并希望将处理程序缓存一分钟左右。
另外,有没有人有关于如何预防堆垛的任何建议?
答案 0 :(得分:36)
有一些很好的资源,但你想缓存处理服务器端和客户端。
添加HTTP标头应该有助于客户端缓存
这里有一些响应头开始..
你可以花几个小时调整它们,直到你获得所需的性能
//Adds document content type
context.Response.ContentType = currentDocument.MimeType;
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(10));
context.Response.Cache.SetMaxAge(new TimeSpan(0,10,0));
context.Response.AddHeader("Last-Modified", currentDocument.LastUpdated.ToLongDateString());
// Send back the file content
context.Response.BinaryWrite(currentDocument.Document);
至于服务器端缓存是一个不同的怪物......并且有很多缓存资源......
答案 1 :(得分:11)
你可以像这样使用
public class CacheHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
OutputCachedPage page = new OutputCachedPage(new OutputCacheParameters
{
Duration = 60,
Location = OutputCacheLocation.Server,
VaryByParam = "v"
});
page.ProcessRequest(HttpContext.Current);
context.Response.Write(DateTime.Now);
}
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()
{
// when you put the <%@ OutputCache %> directive on a page, the generated code calls InitOutputCache() from here
base.FrameworkInitialize();
InitOutputCache(_cacheSettings);
}
}
}
答案 2 :(得分:6)
老了,问题但答案并没有真正提到服务器端处理。
在获奖答案中,我会将此用于 client side
:
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(10));
context.Response.Cache.SetMaxAge(TimeSpan.FromMinutes(10));
对于 server side
,由于您使用的是ashx而不是网页,我假设您直接将输出写入{{1} }。
在这种情况下你可以使用这样的东西(在这种情况下,我想根据参数&#34; q&#34;和Im使用滑动窗口到期保存响应)
Context.Response
答案 3 :(得分:4)
我成功地使用了以下内容,并认为值得在这里发帖。
来自http://dotnetperls.com/cache-examples-aspnet
在Handler.ashx文件中设置缓存选项
首先,您可以使用HTTP处理程序 在ASP.NET中以更快的方式来服务器 动态内容比Web表单页面。 Handler.ashx是默认名称 ASP.NET通用处理程序。你需要 使用HttpContext参数和 以这种方式访问响应。
示例代码摘录:
<%@ WebHandler Language="C#" Class="Handler" %>
C#缓存响应1小时
using System;
using System.Web;
public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
// Cache this handler response for 1 hour.
HttpCachePolicy c = context.Response.Cache;
c.SetCacheability(HttpCacheability.Public);
c.SetMaxAge(new TimeSpan(1, 0, 0));
}
public bool IsReusable {
get {
return false;
}
}
}
答案 4 :(得分:1)
使用 OutputCachedPage 的解决方案可以正常工作,但需要付出代价,因为您需要实例化从 System.Web.UI.Page 派生的对象基类。
一个简单的解决方案是使用 Response.Cache.SetCacheability ,如上面的一些答案所示。但是,要在服务器(在输出缓存内部)缓存响应,需要使用 HttpCacheability.Server ,并设置 VaryByParams 或 VaryByHeaders (请注意,当使用 VaryByHeaders URL时,不能包含查询字符串,因为将跳过缓存)。
这是一个简单的例子(基于https://github.com/escobar022/php-imap-ToDB):
<%@ WebHandler Language="C#" Class="cacheTest" %>
using System;
using System.Web;
using System.Web.UI;
public class cacheTest : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
TimeSpan freshness = new TimeSpan(0, 0, 0, 10);
DateTime now = DateTime.Now;
HttpCachePolicy cachePolicy = context.Response.Cache;
cachePolicy.SetCacheability(HttpCacheability.Public);
cachePolicy.SetExpires(now.Add(freshness));
cachePolicy.SetMaxAge(freshness);
cachePolicy.SetValidUntilExpires(true);
cachePolicy.VaryByParams["id"] = true;
context.Response.ContentType = "application/json";
context.Response.BufferOutput = true;
context.Response.Write(context.Request.QueryString["id"]+"\n");
context.Response.Write(DateTime.Now.ToString("s"));
}
public bool IsReusable
{
get
{
return false;
}
}
}
提示:您在性能计数器“ASP.NET Applications__Total __ \ Output Cache Total”中监控缓存。