用于并发HTTP请求的Generic.ashx
本文关键字:Generic ashx 请求 并发 HTTP 用于 | 更新日期: 2023-09-27 18:21:10
我创建了一个能够处理并发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()
),所以我想在那里添加一个可以重写的方法。然而,它似乎从未被调用。
我错过了什么?你对改进还有其他建议吗?
看起来您从未创建过TestAsyncHandler的实例,这可能就是为什么没有调用该类中的代码的原因。将BaseAsynchOperation标记为抽象,以便在编译时检测到它。