[英]Generic .ashx for concurrent HTTP requests
我创建了一个.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()
方法中完成的(类似于常规通用处理程序.ashx中的ProcessRequest()
),因此我认为我在此处添加了一个可以覆盖的方法。 但是,它似乎从未被调用过。
我错过了什么? 您对即兴演奏还有其他建议吗?
看来您从未创建过TestAsyncHandler的实例-这可能就是为什么未调用该类中的代码的原因。 将BaseAsynchOperation标记为抽象,以在编译时进行检测。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.