Asp.Net - асинхронный вызов веб-службы из другого уровня приложения, а не самой страницы - PullRequest
0 голосов
/ 22 июня 2011

Я прочитал на асинхронной странице, и ее использование выглядит просто:

[ОБНОВЛЕНИЕ] Взято из здесь :

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    var task = new PageAsyncTask(BeginRequest, EndRequest, null, null);
    RegisterAsyncTask(task);
}

IAsyncResult BeginRequest(Object sender, EventArgs e, 
                          AsyncCallback cb, object state)
{ 
    return _service.BeginHelloWorld(cb);
}

void EndRequest(IAsyncResult asyncResult)
{
    var answer = _service.EndHelloWorld(asyncResult);
    // do something with answer
}

Но я не могу разобраться со следующей проблемой:

Что, если я хочу вызвать асинхронную операцию / веб-сервис из моего бизнес-уровня и , а не непосредственно из кода моей страницы? Я не могу найти информацию об этом в сети.

Сценарий в двух словах:

Request -> Page handler -> Business layer service - || -> External webservice

Одним из решений проблемы, о котором я могу подумать, было бы асинхронное обращение к сервису бизнес-уровня с использованием второго потока из пула потоков только в течение времени, необходимого для вызова внешнего веб-сервиса: Request -> Page handler - || -> Business layer service - || -> External webservice. [ОБНОВЛЕНИЕ ->] Таким образом, в основном я думал о расширении вышеупомянутого подхода к моей службе бизнес-уровня, используя точно такой же шаблон. [<- END] </strong> В этом случае оба потока будут выпущены в пул потоков (или, как я полагаю) и могут обрабатывать другие входящие запросы. Когда ответ из веб-службы возвращается, сначала поток связывается для обработки службы бизнес-уровня, а затем другой для завершения рендеринга страницы. Но это звучит как много накладных расходов - и в кодировании, и, возможно, даже во время выполнения.

Другим решением будет модификация первого, а именно: возврат незавершенного ответа клиенту после того, как мы вызовем внешний вызов веб-службы, и обработка его результата не в контексте запроса, а просто внутри приложения. Тогда, конечно, клиент должен будет опросить сервер на предмет результата, который должен был быть сохранен где-то. По сути, это идея, которую @emfurry выложил в Асинхронных вызовах веб-службы .

Есть ли другие жизнеспособные варианты, которые я не рассматривал?

1 Ответ

0 голосов
/ 22 июня 2011

Вы можете рассмотреть возможность обмена сообщениями или использования служебной шины.

У меня есть FOSS ESB здесь: http://shuttle.codeplex.com/

Это позволяет выполнять асинхронную обработку.

...