如何在IIS下使用HTTP处理程序处理长时间运行的请求?

6
我需要在IIS内处理长时间运行的请求,请求本身非常轻量级,但由于IO操作而耗费大量时间。基本上我需要查询另一个服务器,有时还会查询第三个服务器。因此,我想同时处理尽可能多的请求。为此,我需要异步处理请求,如何正确地实现?
使用Socket类,我可以很容易地编写以下内容:
// ..listening code
// ..Accepting code

void CalledOnRecive(Request request)
{
    //process the request  a little
    Context context = new Context()
    context.Socket  = request.Socket;
    remoteServer.Begin_LongRunningDemonicMethod(request.someParameter, DoneCallBack, context);
}

void DoneCallBack( )
{
    IAsyncresult result = remoteServer.Begin_CallSomeVeryLongRunningDemonicMethod( request.someParameter, DoneCallBack, context);

    Socket socket = result.Context.Socket;
    socket.Send(result.Result);
}

在上面的示例中,一旦调用“Begin…”方法,线程就会被释放,并且响应会在另一个线程上发送,因此您可以轻松实现非常高的并发性。如何在IIS内部的HTTP处理程序中进行相同的操作?
2个回答

3
你可以使用IHttpAsyncHandler实现HttpHandler。MSDN网站上有一个很好的示例教程,告诉你如何做到这一点here

3
开始,你可以使用类似以下的方式:

从这里开始:

public class Handler : IHttpAsyncHandler {
    public void ProcessRequest(HttpContext context)
    {
    }

    public IAsyncResult BeginProcessRequest(HttpContext context,
            AsyncCallback cb, object extraData)
    {
        IAsyncResult ar = BeginYourLongAsyncProcessHere(cb);
        return ar;
    }

    public void EndProcessRequest(IAsyncResult ar)
    {
        Object result = EndYourLongAsyncProcessHere(ar);
    }

    public bool IsReusable { get { return false; } }
}

如果你需要链接多个请求,可以在异步的 HttpHandler 中实现,但是如果使用异步的 Page 更加简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接