用于并发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()),所以我想在那里添加一个可以重写的方法。然而,它似乎从未被调用。

我错过了什么?你对改进还有其他建议吗?

用于并发HTTP请求的Generic.ashx

看起来您从未创建过TestAsyncHandler的实例,这可能就是为什么没有调用该类中的代码的原因。将BaseAsynchOperation标记为抽象,以便在编译时检测到它。