一个简单的问题。我有一个生成报告的ASHX处理程序。不幸的是,此过程可能需要2分钟或更长时间才能完成,并且Azure将在此处理程序响应之前关闭连接。为什么?因为连接空闲时间太长,因此它被终止。
所以,我需要以某种方式保持这种联系。为了让它更复杂一点,处理程序是从Silverlight应用程序调用的,该应用程序将从当前网页上的一个框架调用处理程序,或者(当不是从浏览器运行时)创建一个新的浏览器实例来调用处理程序。
我的挑战是用最少的代码绕过这个超时。但是,代码也需要完全像现在一样工作!
在单独的框架或浏览器窗口中打开处理程序允许将报告保存在用户系统的任何位置。如果我从Silverlight代码中下载它,我将没有适当的写访问权限。任何需要写入本地磁盘的Silverlight应用程序都不会获得许可,因此需要使用浏览器/框架。
对HTTP传输不太确定,但您肯定可以在套接字级别使用TCP保持活动。然而,你需要创建套接字监听器来下载HTTP内容(这太过分了)。
也许有一个更简单的解决方案?为什么不让客户机发出生成报表的请求,并让处理程序返回一个SAS签名(有时间限制的只读签名)到报表最终将被放入blob存储的位置呢?这非常快,并且不需要打开TCP连接。报告生成器应该简单地在一个文件中创建报告,然后在它发送给客户机的blob位置下载(这里任何GUID都可以),而不是通过响应将其流式传输回来。最后,客户机只需要轮询位置,直到获得文件。现在,您可以使用短的打开连接进行异步操作,并且不必担心TCP超时问题。这样做的代码远比处理TCP超时要简单得多。