Asp.Net - 从不同的应用程序层异步调用 web 服务,而不是页面本身
Posted
技术标签:
【中文标题】Asp.Net - 从不同的应用程序层异步调用 web 服务,而不是页面本身【英文标题】:Asp.Net - calling a webservice asynchronously from a different application layer, not the page itself 【发布时间】:2011-09-20 05:40:08 【问题描述】:我已经阅读了异步页面及其用法,看起来很简单:
[更新]取自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 ->] 所以基本上我想使用完全相同的模式将上述方法扩展到我的业务层服务。 [
在这种情况下,两个线程都将被释放到线程池(或者我猜是这样),并且可以处理其他传入的请求。当 webservice 的应答返回时,首先会绑定一个线程来处理业务层服务,然后再绑定一个线程来完成 Page 渲染。但这听起来像是很多开销 - 无论是在编码方面,甚至在运行时。
另一个解决方案是对第一个解决方案的修改 - 即,一旦我们触发外部 web 服务调用并在应用程序内部而不是在请求的上下文中处理它的结果,就会向客户端返回一个未完成的响应。然后,当然,客户端必须轮询服务器以获取应该保存在某处的结果。这基本上是@emfurry 在Async Web Service Calls 中提出的想法。
还有其他我没有考虑过的可行方案吗?
【问题讨论】:
您的第一个解决方案不可行,因为它违反了 HttpRequest/HttpResponse 循环的基本架构。您应该追求第二种选择,因为它是唯一可行的选择。请记住,请求/响应是一问一答的过程。你不能断开它并恢复它,你不能从服务器推送到客户端,你只能拉。试想一下,我(客户端)和你(服务器)之间有一道防火墙,所以只有我可以接触到你,反之亦然——因为这通常是真的。 ;) 谢谢@Greebo。我没有考虑向客户推送任何东西,我想我没有清楚地说明自己。请参阅我的更新以获得进一步的解释。 【参考方案1】:您可以考虑查看消息传递或使用服务总线。
我在这里有一个 FOSS ESB:http://shuttle.codeplex.com/
这允许您进行异步处理。
【讨论】:
感谢@Eben 的提示和链接。我对服务总线的设计目标和目的并不完全熟悉,现在也不知道如何使用它来解决我的问题。所以现在,这超出了我的能力范围。 使用 ESB,您基本上可以将消息(包含所有相关数据的简单类)发送到一些排队机制(如 msmq)。队列由处理接收到的任何消息的系统(通常是服务)监控。这允许您将工作异步移交给其他组件。您还可以发布任何这些端点(服务)可以订阅的事件(发布/订阅)。不同的范式,但当你进入事物的摇摆时,它工作得很好。 感谢您的概述。我明白了,但不确定这将如何适应我的异步页面生命周期。看起来我将接受客户端的轮询,以了解长时间运行的操作结果。 np :) --- 一点点投票可能不会杀死任何人以上是关于Asp.Net - 从不同的应用程序层异步调用 web 服务,而不是页面本身的主要内容,如果未能解决你的问题,请参考以下文章
我需要从 ASP.NET 中调用第三方库中的函数,但不能允许它异步运行