2014-09-08 2 views
0

Я создал файл .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), я думал, что добавляю туда метод, который может быть переопределены. Тем не менее, он никогда, кажется, не вызван.

Что я пропустил? Есть ли у вас какие-либо другие предложения по улучшению?

ответ

0

Похоже, вы никогда не создаете экземпляр TestAsyncHandler - возможно, поэтому код в этом классе не вызывается. Mark BaseAsynchOperation как абстрактный, чтобы обнаружить это во время компиляции.

+0

Право. Итак, любые идеи о том, как создать новый экземпляр «TestAsyncOperation» в базе «BeginProcessRequest»? Полагаю, это то, что мне нужно сделать ... – Johan

+0

Возможно, есть много вариантов. Вы можете определить защищенный абстрактный метод в BaseAsyncHandler, который возвращает объект BaseAsynchOperation. Затем в TestAsyncHandler переопределите его и верните объект TestAsyncOperation. – joelsand

Смежные вопросы