用于并发HTTP请求的通用.ashx

时间:2014-09-08 19:58:42

标签: c# asp.net multithreading

我创建了一个能够处理并发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()),我认为我在那里添加了一个可以覆盖的方法。然而,似乎永远不会被召唤。

我错过了什么?您对改进有任何其他建议吗?

1 个答案:

答案 0 :(得分:0)

看起来你永远不会创建TestAsyncHandler的实例 - 这可能就是为什么不调用该类中的代码的原因。将BaseAsynchOperation标记为抽象,以便在编译时检测它。