繁体   English   中英

并发HTTP请求的通用.ashx

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM