【问题标题】:web client call server, server call 3rd party, all async?网络客户端呼叫服务器,服务器呼叫第 3 方,全部异步?
【发布时间】:2013-09-17 00:40:13
【问题描述】:

我有一个使用 n 层方法构建的网站。我遇到的问题是我需要客户端调用应用程序层,然后其他层之一将调用世界某处的另一个 Web 服务。另一个 Web 服务可能需要一些时间才能恢复,所以如果可能的话,我想使用异步请求执行以下操作:

客户端是 HTML & JavaScript,服务器层是用 C# (.NET 4.5) 编写的,第 3 方 Web 服务只是我需要使用的 Web 服务

你打算怎么写这个? 任何帮助将不胜感激

【问题讨论】:

    标签: web-services architecture n-layer


    【解决方案1】:

    看起来服务器端代码需要异步调用外部服务。我没有看到这样做的优势。

    当然,客户端代码会异步调用服务器端代码。 (一个 AJAX 请求,例如使用 jQuery。)它会在处理该响应之前以异步方式等待该服务的响应表单。但由于此请求中的服务器端代码为该一个请求提供服务,因此它可以同步进行。

    确实,如果服务器端代码本身也是异步的,那么它会在客户端代码提供任何有用信息之前立即将控制权返回给客户端代码。这意味着客户端异步处理程序不能做任何事情。相反,当服务器端代码从外部服务获得响应时,它需要将该响应推送到客户端代码。这可以通过 websockets 和诸如此类的方式实现,但可能比这种情况需要的复杂得多。

    只有链中的第一个环节需要异步才能提供异步的用户体验,系统的其余部分不需要。

    【讨论】:

    • 感谢您的回复。很难知道该怎么做才能做到最好。我已经将一个 POC 放在一起,描述了您所描述的内容,并完成了我需要它做的事情。让我担心的是完全异步的事情,如何向客户返回一些东西。我在看可能是 SignalR。我现在被要求证明它是可扩展的,所以现在我需要研究负载测试(但这是另一回事)
    【解决方案2】:

    只要您有“客户端/服务器”边界,您就可以选择使服务器异步以及使客户端异步。这些决定是独立的。

    我会假设您的第三方网络服务是可扩展的,您的服务器除了这个请求之外还有其他事情要做。在这种情况下,我建议您的服务器是异步的。

    在 ASP.NET 4.5 中使用 async/await 是很自然的异步编程。根据您的第三方服务,您可能需要使用HttpClientasync 兼容的WCF 或Web 服务代理。 ASP.NET MVC 和 WebAPI 都支持对您的服务进行异步调用。

    在客户端,你别无选择;浏览器中的 JavaScript必须是异步的。

    【讨论】:

    • 感谢您的回复。让我担心的是大卫在下面的回复中描述的复杂性。如果服务器对第 3 方的调用是异步的,那么如果一切都是异步的,我将如何向客户端返回一些东西
    • 大卫不正确;异步服务器不会提前返回。
    • OK 那么会发生什么?客户端发出异步请求,服务器发出另一个异步请求,如果使用 HttpClient 我然后使用等待?
    • 服务端异步代码将服务端线程释放到线程池,但不返回给客户端。稍后,当服务器上的异步代码完成时,将响应发送到客户端。我有更长的解释on my blog
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多