为什么没有完全服务的分块响应?

时间:2014-05-22 07:58:51

标签: scala iframe playframework playframework-2.2 future

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没有抛出异常。

1 个答案:

答案 0 :(得分:1)

&#34;不完整的分块编码&#34;发生错误的原因是用于构建Future的{​​{1}}正在完成失败。

HTTP无法通知在发送响应的过程中发生了错误,即使是分块响应也没有。当您为Play Enumerator Ok.chunked失败时,它有两种选择:

  1. 交付最后一个空块以完成请求。这是不诚实的,前端的任何内容都无法判断是否发生了错误。
  2. 断开连接。
  3. Play选择选项2,这是导致&#34;不完整的分块编码的原因。错误。

    解决此问题的方法是尽可能确保您的Enumerator不会失败。以下是处理失败的Enumerator

    getEnumerator方法的替代方法
    Future