我创建了一个能够处理并发http请求的.ashx文件。
效果很好,但现在我想创建一个基础类来完成常见的工作,以便每次我需要创建一个同类的新.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()
方法中完成的(类似于常规通用处理程序.ashx中的ProcessRequest()
),我认为我在那里添加了一个可以覆盖的方法。然而,似乎永远不会被召唤。
我错过了什么?您对改进有任何其他建议吗?
答案 0 :(得分:0)
看起来你永远不会创建TestAsyncHandler的实例 - 这可能就是为什么不调用该类中的代码的原因。将BaseAsynchOperation标记为抽象,以便在编译时检测它。