【发布时间】:2010-02-05 15:09:52
【问题描述】:
我目前正在开发一个自定义 HttpHandler(用于压缩/组合 CSS,但这对于这个问题并不重要)。
我从一个简单的 reusable=true 同步 HttpHandler 开始,就像我们都知道的那样。
现在我正在尝试将其改进为异步处理程序(因为它使用 IO 功能并且在非常繁忙的网站上使用)。
我的第一次尝试(这似乎工作正常):
Action<HttpContext> asyncProcessRequest;
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
asyncProcessRequest = new Action<HttpContext>(ProcessRequest);
return asyncProcessRequest.BeginInvoke(context, cb, extraData);
}
public void EndProcessRequest(IAsyncResult result)
{
asyncProcessRequest.EndInvoke(result);
}
public virtual void ProcessRequest(HttpContext context)
{
// real work
}
这是一个不可重用的 httphandler(根据我的阅读,IsReusable 应该是假的,因为这个处理程序有状态(asyncProcessRequest 字段)。
现在我想让它可重复使用。所以我的第一个想法是创建一个这样的 IAsyncResult / Action 字典:
IDictionary<IAsyncResult, Action<HttpContext>> asyncProcessRequests;
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
if (asyncProcessRequests == null)
{
asyncProcessRequests = new Dictionary<IAsyncResult, Action<HttpContext>>();
}
var request = new Action<HttpContext>(ProcessRequest);
var result = request.BeginInvoke(context, cb, extraData);
asyncProcessRequests.Add(result, request);
return result;
}
public void EndProcessRequest(IAsyncResult result)
{
Action<HttpContext> action;
if (asyncProcessRequests.TryGetValue(result, out action))
{
action.EndInvoke(result);
}
}
这是一个正确的模式吗?还是我走远了?
它似乎有效(我没有收到任何错误或奇怪的行为),但在将其投入生产之前,我想与比我有更多编写这些 Http 处理程序经验的人进行验证..
提前致谢!
【问题讨论】:
-
你确定你真的需要为每个请求压缩/压缩 CSS 吗?也许,在构建/部署期间这样做会更好?
-
...和/或确保它被正确缓存。
-
浏览器和文件缓存得到正确处理。但是这个问题更多的是关于 httphandler 模式 async/reusable...
标签: c# asp.net asynchronous httphandler ihttpasynchandler