Tôi hiện đang phát triển một HttpHandler tùy chỉnh (để nén/kết hợp CSS, nhưng điều đó không quan trọng cho câu hỏi này).Mẫu để sử dụng lại không đồng bộ HttpHandler
Tôi bắt đầu với một HttpHandler đồng bộ hóa có thể tái sử dụng đơn giản như chúng ta đều biết.
Bây giờ tôi đang cố gắng cải thiện nó thành trình xử lý không đồng bộ (vì nó sử dụng chức năng IO và được sử dụng trên một trang web rất bận).
nỗ lực đầu tiên của tôi (và điều này dường như làm việc ok):
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
}
Đây là một HttpHandler không thể tái sử dụng (kể từ những gì tôi đọc, IsReusable phải là sai lầm, bởi vì xử lý này có nhà nước (các asyncProcessRequest . trường)
Bây giờ tôi muốn thực hiện tái sử dụng này Vì vậy, suy nghĩ đầu tiên của tôi là tạo ra một từ điển của IAsyncResult/hành động như thế này:.
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);
}
}
đây có phải là một correc t mẫu? hoặc tôi đang đi? Có vẻ như để làm việc (tôi không nhận được bất kỳ lỗi hoặc hành vi kỳ lạ), nhưng trước khi đưa nó vào sản xuất, tôi muốn xác minh với một người có nhiều kinh nghiệm hơn tôi trong việc viết các trình xử lý Http này ..
Cảm ơn bạn trước!
Bạn có chắc chắn thực sự cần phải nén/nén CSS cho mỗi và mọi yêu cầu không? Có lẽ, nó tốt hơn để làm điều này trong quá trình xây dựng/triển khai? –
... và/hoặc đảm bảo rằng nó được lưu trữ đúng cách. – Lucero
bộ nhớ cache của trình duyệt và tệp được xử lý đúng cách. Nhưng câu hỏi này là nhiều hơn về mô hình httphandler async/tái sử dụng ... –