В настоящее время я разрабатываю собственный HttpHandler (для сжатия / объединения CSS, но для этого вопроса это не имеет значения).
Я начал с простого многоразового = истинного синхронного HttpHandler, как мы все знаем.
Теперь я пытаюсь улучшить его до асинхронного обработчика (поскольку он использует функции ввода-вывода и используется на очень загруженном веб-сайте).
Моя первая попытка (и, похоже, это работает нормально):
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
}
Это неиспользуемый http-обработчик (поскольку из того, что я прочитал, IsReusable должен иметь значение false, поскольку у этого обработчика есть состояние (поле 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 ..
Заранее спасибо!