Hello Play / Scala开发人员。我不知道这样的问题是属于这里还是某种其他面向网络的Q / A,但在这里它是:
我有一个Play应用,通过使用多个请求调用其他服务来提供搜索结果。对不同请求的响应以块的形式发送。基本上所有请求都被触发,一旦请求完成,结果将使用Comet发回:我使用Play's doc描述的iframe方法。
但是,我注意到在某些情况下,iframe调用在所有数据都已发送回最终用户之前完成。我调试了一下,发现请求最终全部完成,我的浏览器显示net :: ERR_INCOMPLETE_CHUNKED_ENCODING。我还注意到,传输到UI的数据量因浏览器而异。
以下是我的结果:
Ok.chunked(
(stringEnumerator1 &> Comet(callback = "script1")) >-
(stringEnumerator2 &> Comet(callback = "script2")) >-
(stringEnumerator3 &> Comet(callback = "script3"))
).as(HTML)
就我在Play's doc中所读到的内容而言,这应该可以解决问题,但事实并非如此,我不知道如何解决这个问题。有没有人对此有一点想法或提示?
修改
以下是枚举器的创建方式。一旦发出对远程服务器的呼叫,我得到Future
Option
case class
我期待的一个特定呼叫。此未来将传递给调用给定toHTML
上的方法(case class
)的方法,此方法会创建一个基本上附加到给定HTML Elem
的{{1}}在客户端调用回调。 div
是我的case类继承的抽象类,然后实现Part
方法。
以下是将给定部分转换为toHTML
字符串的方法:
HTML
编辑2
我发现问题出在哪里,问题是在我的def getEnumerator[X <: Part](part: Future[Option[X]]): Enumerator[String] =
Enumerator.flatten(part.map(Enumerator(_))).map(xopt => xopt.map(x => x.toHTML.toString).getOrElse(PartNotFound().toHTML.toString))
代中,有两个整数的总和,其中一个整数在某个时刻HTML
,这使得{null
1}}生成失败,播放然后丢弃了连接,让我感到困惑的是,当发生这样的总和时,Play没有抛出异常。
答案 0 :(得分:1)
&#34;不完整的分块编码&#34;发生错误的原因是用于构建Future
的{{1}}正在完成失败。
HTTP无法通知在发送响应的过程中发生了错误,即使是分块响应也没有。当您为Play Enumerator
Ok.chunked
失败时,它有两种选择:
Play选择选项2,这是导致&#34;不完整的分块编码的原因。错误。
解决此问题的方法是尽可能确保您的Enumerator
不会失败。以下是处理失败的Enumerator
:
getEnumerator
方法的替代方法
Future