현재 CSS를 압축/결합하기위한 사용자 지정 HttpHandler를 개발 중입니다.하지만이 문제는 중요하지 않습니다.재사용 가능한 비동기 HttpHandler 패턴
우리 모두 알고있는 것처럼 간단한 재사용 가능한 = 진정한 동기식 HttpHandler로 시작했습니다.
이제 비동기 처리기 (IO 기능을 사용하고 매우 바쁜 웹 사이트에서 사용됨)로 개선하려고합니다.
내 첫 번째 시도를 (이 확인을 작동하는 것 같다) : 내가 읽은 것과, IsReusable 거짓해야로서이 아닌 재사용 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
}
,이 핸들러합니다 (asyncProcessRequest 상태를 가지고 있기 때문에 . 필드)
는 지금이 재사용을 만들고 싶어 내 첫번째 생각이 같은 IAsyncResult를/액션의 사전 만드는 것이었다 그래서 :.
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);
}
}
를이는 correc인가 패턴? 또는 나는 떨어져 있냐?
작동하지 않는 것 같습니다 (오류나 이상한 동작이 발생하지는 않습니다).하지만 이것을 제작하기 전에이 HTTP 처리기를 쓰면서 저보다 많은 경험을 가진 사람과 확인하고 싶습니다.
미리 감사드립니다.
각 요청마다 CSS를 압축/압축해야합니까? 어쩌면 빌드/배포 중에이 작업을 수행하는 것이 좋습니다. –
... 그리고/또는 제대로 캐시되는지 확인하십시오. – Lucero
브라우저 및 파일 캐싱이 올바르게 처리됩니다. 하지만이 질문은 httphandler 패턴 async/reusable ... –