如何在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处理程序中执行相同的操作?
您可以使用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
则更容易。