Asp.Net - 从不同的应用程序层异步调用Web服务,而不是页面本身

时间:2011-06-22 09:35:43

标签: asp.net web-services asynchronous business-logic-layer

我已经阅读了异步页面及其用法,看起来很简单:

[更新] 取自here

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
}

但我无法理解以下问题:

如果我想直接从我的网页代码隐藏中从我的业务层调用异步操作/ web服务,该怎么办?我似乎无法在网上找到任何相关信息。

简介:

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

我能想到的问题的一个解决方案是异步调用业务层服务,利用线程池中的第二个线程仅调用外部Web服务所需的时间: Request - > Page handler - || - > Business layer service - || - > External webservice [UPDATE - >] 所以基本上我想到了使用完全相同的模式将上述方法扩展到我的业务层服务。 [< - END] 在这种情况下,两个线程都将被释放到线程池(或者我猜),并且可以处理其他传入请求。当webservice的答案返回时,首先绑定一个线程来处理业务层服务,然后另一个线程用于完成页面呈现。但这听起来像是很多开销 - 无论是在编码方面,还是在运行时都是如此。

另一个解决方案是修改第一个 - 即,一旦我们触发外部webservice调用并且不是在Request的上下文中而是在应用程序内部处理它的结果,就向客户端返回未完成的响应。然后,当然,客户端必须轮询服务器以获取本应保存在某处的结果。这基本上是@emfurry在Async Web Service Calls中布局的想法。

我还没有考虑过其他可行的选择吗?

1 个答案:

答案 0 :(得分:0)

您可以考虑查看消息或使用服务总线。

我在这里有一个FOSS ESB:http://shuttle.codeplex.com/

这允许您进行异步处理。