2012-01-03 46 views
6

我需要在IIS内部处理长时间运行的请求,处理请求本身非常轻量但主要由于IO而花费很多时间。基本上我需要查询另一台服务器,它有时会查询第三台服​​务器。所以我想同时处理尽可能多的请求。为此,我需要异步处理请求,我如何正确地执行该操作?如何使用IIS下的HTTP处理程序处理长时间运行的请求?

使用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); 
} 

在线程上面的例子,只要我所说的“开始......”的方法发布,并且响应发送上另一个线程,因此可以轻松实现非常高的并发性。 如何在IIS中的HTTP处理程序中执行相同的操作?

回答

3

您可以使用IHttpAsyncHandler实现HttpHandler。 MSDN有一个很好的演练,并带有关于如何做到这一点的示例here

+0

http://msdn.microsoft.com/en-us/magazine/cc164128.aspx – 2012-01-04 09:34:44

+0

http://msdn.microsoft.com/en-us/library/bb398986.aspx也有帮助 – 2012-01-04 09:35:25

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