Как обрабатывать долго выполняющиеся запросы с помощью обработчика HTTP под IIS? - PullRequest
6 голосов
/ 04 января 2012

Мне нужно обрабатывать долго выполняющиеся запросы внутри IIS, обработка самого запроса очень легка, но занимает много времени, в основном из-за ввода-вывода.В основном мне нужно запросить другой сервер, который иногда запрашивает третий сервер.Поэтому я хочу обрабатывать как можно больше запросов одновременно.Для этого мне нужно обрабатывать запросы асинхронно, как мне сделать это правильно?

Используя класс 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 ...», и ответ отправляется в другой поток, вы можете легко достичь очень высокого уровня параллелизма.Как вы делаете то же самое в обработчике HTTP внутри IIS?

Ответы [ 2 ]

3 голосов
/ 04 января 2012

Начните с чего-то вроде этого:

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.

3 голосов
/ 04 января 2012

Вы можете реализовать HttpHandler с IHttpAsyncHandler. У MSDN есть хорошее пошаговое руководство с примерами того, как это сделать здесь .

...