Я создал файл .ashx, способный обрабатывать одновременные HTTP-запросы.Generic .ashx для одновременных запросов HTTP
Отлично работает, но теперь я хотел бы создать базовый класс, который выполняет общую работу, чтобы не повторяться каждый раз, когда мне нужно создать новый .ashx того же типа.
Вот мой текущий код для обработчика HTTP:
public class BaseAsyncHandler : IHttpAsyncHandler, IRequiresSessionState
{
public bool IsReusable
{
get { return false; }
}
public BaseAsyncHandler()
{
}
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
{
BaseAsynchOperation asynch = new BaseAsynchOperation(cb, context, extraData);
asynch.StartAsyncWork();
return asynch;
}
public void EndProcessRequest(IAsyncResult result)
{
}
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException();
}
}
public class BaseAsynchOperation : IRequiresSessionState, IAsyncResult
{
private bool _completed;
private Object _state;
private AsyncCallback _callback;
public HttpContext _httpContext;
bool IAsyncResult.IsCompleted
{
get { return _completed; }
}
WaitHandle IAsyncResult.AsyncWaitHandle
{
get { return null; }
}
Object IAsyncResult.AsyncState
{
get { return _state; }
}
bool IAsyncResult.CompletedSynchronously
{
get { return false; }
}
public BaseAsynchOperation(AsyncCallback callback, HttpContext context, Object state)
{
_callback = callback;
_httpContext = context;
_state = state;
_completed = false;
}
public void StartAsyncWork()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);
}
protected virtual void OnBeforeStartAsyncTask()
{
}
public void StartAsyncTask(Object workItemState)
{
OnBeforeStartAsyncTask();
_httpContext.Response.ContentType = "application/json";
_completed = true;
_callback(this);
}
}
Мой новый тест, который наследует от базового класса:
public class TestAsyncHandler : BaseAsyncHandler
{
public TestAsyncHandler()
{
}
}
public class TestAsyncOperation : BaseAsynchOperation
{
public TestAsyncOperation(AsyncCallback callback, HttpContext context, object state) : base(callback, context, state)
{
}
protected override void OnBeforeStartAsyncTask()
{
var test = _httpContext.Request["test"]; // code never ends up here...
}
}
Поскольку вся моя работа делается в метод StartAsyncTask()
(аналогично ProcessRequest()
в обычном родовом обработчике .ashx), я думал, что добавляю туда метод, который может быть переопределены. Тем не менее, он никогда, кажется, не вызван.
Что я пропустил? Есть ли у вас какие-либо другие предложения по улучшению?
Право. Итак, любые идеи о том, как создать новый экземпляр «TestAsyncOperation» в базе «BeginProcessRequest»? Полагаю, это то, что мне нужно сделать ... – Johan
Возможно, есть много вариантов. Вы можете определить защищенный абстрактный метод в BaseAsyncHandler, который возвращает объект BaseAsynchOperation. Затем в TestAsyncHandler переопределите его и верните объект TestAsyncOperation. – joelsand