事件源和Internet Explorer

4
我有以下服务器端的播放代码,以便为 HTML5 EventSources 提供端点。
package controllers

import scala.util.matching
import play.api.mvc._
import play.api.libs.json.JsValue
import play.api.libs.iteratee.{Concurrent, Enumeratee}
import play.api.libs.EventSource
import play.api.libs.concurrent.Execution.Implicits._

object Application extends Controller {

  /** Central hub for distributing chat messages */
  val (eventOut, eventChannel) = Concurrent.broadcast[JsValue]

  /** Enumeratee for filtering messages based on eventSpec */
  def filter(eventSpec: String) = Enumeratee.filter[JsValue] {
    json: JsValue => ("(?i)" + eventSpec).r.pattern.matcher((json \ "eventSpec").as[String]).matches
  }

  /** Enumeratee for detecting disconnect of SSE stream */
  def connDeathWatch(addr: String): Enumeratee[JsValue, JsValue] = 
    Enumeratee.onIterateeDone{ () => println(addr + " - SSE disconnected") }

  /** Controller action serving activity based on eventSpec */
  def events = Action { req =>
    println(req.remoteAddress + " - connected and subscribed for '" + eventSpec +"'")
    Ok.feed(eventOut
      &> filter(eventSpec) 
      &> Concurrent.buffer(50) 
      &> connDeathWatch(req.remoteAddress)
      &> EventSource()
    ).as("text/event-stream").withHeaders(
      "Access-Control-Allow-Origin" -> "*",
      "Access-Control-Allow-Methods" -> "GET",
      "Access-Control-Allow-Headers" -> "Content-Type"
    )
  }

}

我的路由看起来像这样:

GET /events controllers.Application.events

这个服务器在Chrome浏览器通过EventSource对象连接时完全正常。由于IE不支持EventSources,我正在使用 polyfill库。现在问题来了:IE正确地订阅事件,因为我可以看到'已连接和已订阅'的日志信息,但是一旦事件应该传递到此连接时,它就会记录'SSE已断开连接'。我错过了什么?需要添加一些HTTP头吗?

1个回答

1

看起来您可能正在使用CORS。(您正在发送CORS头文件。) 如果是这样,那么问题可能是因为您使用的polyfill不支持CORS。如果您需要CORS,可以使用 此Polyfill替代


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接