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

本文关键字:处理 程序 长时间 运行 请求 HTTP IIS | 更新日期: 2023-09-27 18:19:16

我需要在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处理程序中执行相同的操作?

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

您可以使用IHttpAsyncHandler实现HttpHandler。MSDN有一个很好的演练,里面有如何做到这一点的例子。

像这样开始:

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则更容易。