【问题标题】:Work-around needed: Windows Azure load balancers close idle connections after 60 seconds需要解决方法:Windows Azure 负载平衡器在 60 秒后关闭空闲连接
【发布时间】:2011-07-07 10:29:09
【问题描述】:

一个简单的问题。我有一个生成报告的 ASHX 处理程序。不幸的是,此过程可能需要 2 分钟或更长时间才能完成,并且 Azure 将在此处理程序响应之前关闭连接。为什么?因为连接空闲时间过长,所以被kill掉了。
所以,我需要以某种方式保持这种联系。为了使它更复杂一点,处理程序是从 Silverlight 应用程序调用的,该应用程序将从当前网页上的框架调用处理程序,或者(当不从浏览器运行时)创建一个新的浏览器实例来调用处理程序。
我的挑战是用最少的代码来解决这个超时。而且,代码需要像现在一样工作!

在单独的框架或浏览器窗口中打开处理程序允许将报告保存在用户系统的任何位置。如果我从 Silverlight 代码中下载它,我将没有正确的写入权限。将不会授予任何需要写入本地磁盘的 Silverlight 应用程序的权限,因此使用浏览器/框架的解决方法。

【问题讨论】:

标签: asp.net silverlight azure timeout load-balancing


【解决方案1】:

不太确定 HTTP 传输,但您当然可以在套接字级别使用 TCP 保持活动。但是,您需要创建套接字侦听器来下载 HTTP 内容(方式过大)。

也许有一个更简单的解决方案?为什么不让客户端请求生成报告并让处理程序返回一个 SAS 签名(时间有限,只读签名)到报告最终将被放入 blob 存储的位置。这非常快,并且不需要打开的 TCP 连接。报告生成器应该简单地在一个文件中创建报告,以便在它发送到客户端的 blob 位置下载报告(任何 GUID 都可以在这里工作),而不是通过响应将其流回。最后,客户端只需要轮询位置,直到它得到一个文件。现在,您可以很好地使用短打开连接进行异步操作,并且不必担心这个 TCP 超时问题。执行此操作的代码远比解决 TCP 超时的任何代码复杂得多。

【讨论】:

  • 有趣的是,我已经在研究这样的解决方案了。 :-) 它可能有效。首先调用生成报告,然后轮询以查看它是否完成,然后最后下载东西......不过,由于 Silverlight 无法将文件下载并保存到本地磁盘(甚至网络),我仍然需要处理程序来从 blob 存储中获取报告...
  • 为什么需要下载?只需在 blob 存储中设置正确的 MIME 类型,它就会流式传输并由客户端解释。您的处理程序将做的就是设置 MIME 类型并读取和流式传输字节。您可以直接从存储中执行此操作,而无需下载到磁盘。
  • 需要下载,因为它是用户需要存储在本地系统上的报告。例如,要打印、通过电子邮件发送或只是存储以供将来参考。下载是在客户端完成的,Silverlight 无法写入本地硬盘。不过,用户需要将其保存在磁盘上。
猜你喜欢
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多