【问题标题】:ASP.NET WebService call queuingASP.NET WebService 调用队列
【发布时间】:2012-04-08 01:45:25
【问题描述】:

我有一个当前调用 Java WebService 的 ASP.NET Webform。 ASP.NET Webform 是在内部创建/维护的,而 Java WS 是一个包解决方案,我们只有一个应用程序的 WS 接口。

问题是,由于系统负载等原因,Java WS 有时响应缓慢,对此我无能为力。所以目前在 ASP.NET Webform 上存在很长的延迟,有时如果 Java-WS 响应缓慢,有时会导致 ASP.NET 达到其超时值并抛出连接。

我需要确保这两个应用程序之间的数据连接,我可以通过增加超时值来做到这一点,但我不能让 ASP.NET 表单等待超过几秒钟。

这就是排队系统的想法出现的地方。

我的想法是,让 ASP.NET 表单构建soap请求,然后将其排入本地队列,然后守护进程运行并在Java-WS上触发请求。

在我从头开始构建之前,我需要一些指导。

  1. 我的解决方案可行吗?
  2. 是否有任何库等可供我使用?
  3. 有没有更好的方法来实现我正在寻找的东西?

【问题讨论】:

  • 您还在使用 ASMX Web 服务吗?这是一项遗留技术,您应该改用 WCF。
  • 他没有使用 ASMX。它是一个调用 Java Web 服务的 Web 表单。话虽如此,您是否考虑过异步调用 Java Web Service。
  • @William yes 已经考虑过这一点,但是一旦将请求发送到 Web 服务异步,Web 窗体就会关闭并且用户返回到调用系统,因此不会有实例如果你得到我,一个回调返回。
  • 是的,您需要阅读 WCF。它在六年前取代了 ASMX!请参阅WCF vs. ASMX Web Serviceswcf 标签。
  • 最重要的区别是您可以在任何类型的应用程序中托管 WCF 服务,包括 Windows 服务,而无需 Web 服务器。由于 Windows 服务永远不会停止(除非有异常,请小心!)它可以公开 Web 服务(WCF 服务公开为 WS 端点)。此 Windows 服务可以充当代理接收来自 ASP.NET 应用程序的调用,并将它们作为对 java Web 服务的异步请求进行处理,因此它不会锁定并可以参与更多的传入呼叫。当 java web 服务给出响应时,可以在回调函数中进行处理。

标签: asp.net wcf web-services msmq message-queue


【解决方案1】:

你有两个不同的问题:

  1. 您的 Web 表单需要学习向服务发送请求,然后轮询以获取该服务的结果。您可以通过编写一个简单的中间服务(请在 WCF 中)来做到这一点,该服务将有两个操作:一个是异步调用 Java 服务,另一个是查看异步调用是否已完成,如果已完成则返回结果.
  2. 您可能需要持久地将对 Java 服务的请求排队。如果性能不是最重要的问题(而且似乎不是),那么最简单的方法是将#1 中的中间服务分成两部分:一半使用 WCF MSMQ 绑定调用另一半。这将透明地使用 MSMQ 作为传输,导致排队的请求保留在队列中,直到它们在下半场被拉出。后半部分将被编写为 Windows 服务,以便在系统启动时启动并开始清空队列。

【讨论】:

  • 在第 1 项中。您说“稍后进行轮询以获取该服务的结果”我真的不希望输入表单关心结果是什么,但我需要关心一些东西,可能是一个报告守护进程某种内置到 Windows 服务中,或写入事件日志等。
  • 对学习 WCF 的一些好书有什么建议吗??学习 WCF,Michele Leroux 的实践指南 ??
  • 恐怕 Michele 的书已经过时了,尤其是如果您使用的是 .NET 4.0 或更高版本。请参阅Beginner's Guide to WCF,尤其是“教程和文章”部分。 .NET 4.0 通过消除许多可怕的配置文件内容,使 WCF 更容易上手。如果您有 Visual Studio 2010,请尝试创建一个“WCF 服务应用程序”并查看它创建的代码。
  • 在 #2 中,您说将服务分成两半,因此前半部分将有一个端点,并将数据放入 MSMQ 队列,后半部分将读取队列并处理数据正确???
  • 我将此标记为答案,因为它为我提供了有关最佳解决方案的更复杂的细节,尽管 JotaBe 的帖子清楚地解释了类似的事情。
【解决方案2】:

你可以create a WindowsService hosting a WCF service

您的网络应用程序可以调用您的 Windows 服务的 WCF 方法。

您的 windows 服务可以异步调用 java web 服务方法,使用 begin/End pattern

您的 windows 服务甚至可以存储 java web 服务的答案,并通过其他 WCF 方法公开它们。例如,您可以在 WCF 服务中使用以下方法:

1) 一种允许不正确地调用 java web 服务并返回此调用的标识符的方法

2) 另一种方法,通过显示调用的标识符返回 java web 服务调用结果

您甚至可以使用 AJAX 调用 Windows 服务的 WCF 方法。

【讨论】:

  • 因为他正在寻找一个队列,所以这个解决方案可以通过在数据库中合并一个队列表来更进一步。
  • 可能没有必要,如果他只是想确保处理对 java web 服务的调用。 Windows 服务可以安全地执行此操作,无需使用队列。
【解决方案3】:

您可以使用MSMQ 来排队来自您的客户端的请求。 请记住,MSMQ 不会为您处理任何事情 - 它只是一种传输方式。

它所做的只是接收MSMQ 消息并将它们传递到MSMQ 队列。

原始消息的创建和传递消息的处理都在发送和接收机器上的您自己的代码中处理:目标机器必须安装 MSMQ 并运行自定义服务来获取和处理它们他们

无论如何,有一个使用 JAVA 与 MSQM 互操作的库:http://msmqjava.codeplex.com/

另一种方法是您可以在其中一个 Windows 框上创建一个队列,然后创建一个服务,从队列中提取消息并将它们转发到 Java 服务

【讨论】:

  • 目标机器必须安装 MSMQ 并运行自定义服务来获取和处理它们无论如何都有一个使用 JAVA msmqjava.codeplex.com与 MSQM 互操作的库@
  • 这不是一个选项。我拥有的目的地的唯一入口点是 WebService 接口。我无法在目标服务器上安装任何东西。
  • 是的,你的最后一段几乎总结了我一直在想做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 2013-07-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多