【问题标题】:Can JSONP services handle large parameters?JSONP 服务可以处理大参数吗?
【发布时间】:2013-12-19 22:24:21
【问题描述】:

我有一个应用程序需要在客户端 Web 浏览器和托管 WCF 服务的服务器之间来回发送大型数据结构。数据结构基本上是一棵树,其中树中的节点,以它们的序列化形式,每个可以大约 1 KB,并且在一次调用中可以有多达几百个这样的节点。

该应用程序是旧版应用程序,使用 JSONP 编写以支持跨域支持。鉴于项目的进度限制,我无法替换 JSONP。

理想情况下,我会在 HTTP 请求正文中传递序列化数据,但是当我用谷歌搜索 intertubes 时,我了解到 JSONP 请求只是 HTTP GET ——所以没有请求正文。这也意味着我遇到了 HTTP GET 的限制:查询字符串不能可靠地超过 8 KB 左右。

我的目的是避免在 WCF 服务上保存状态,通过让客户端向服务器发送修改后的树,服务器然后验证树,如果需要执行相关的树操作,然后将修改后的树发回在更新 UI 的响应中发送给客户端。如果往返的数据大约为 100 KB,这是否可行?

【问题讨论】:

    标签: jsonp


    【解决方案1】:

    解决 JSONP 大小限制(HTTP GET url/querystring 限制)的唯一方法是将大请求分解为多个较小的请求,但要做到这一点,您需要在服务器端。

    CLIENT /jsonp?part=1&of=3&callback=foobar&datachunk=...
    SERVER foobar("part 1 received");
    CLIENT /jsonp?part=3&of=3&callback=foobar&datachunk=...
    SERVER foobar("part 3 received");
    CLIENT /jsonp?part=2&of=3&callback=foobar&datachunk=...
    SERVER foobar("all parts received heres the result");
    

    编辑如果您只想发送 2 个请求,还有另一种可能性。在客户端使用 AJAX 将大数据 POST 到服务器。服务器将缓存数据并将令牌(GUID)返回给客户端。然后,客户端将使用令牌创建 JSONP 请求。

    【讨论】:

    • (。可爱。)我想我可以将我的请求“分解”为树中每个节点的单独请求,并使用某种“事务 ID”启动请求序列保存在服务器的 ASP.NET 缓存中。多么不幸。
    • @JohnKällén - 如果您只想发送 2 个请求,这是另一种可能性。在客户端使用 AJAX 将大数据 POST 到服务器。服务器将缓存数据并将令牌(GUID)返回给客户端。然后客户端将使用令牌创建 JSONP 请求。
    • 我认为跨域 AJAX 是不可能的?这就是为什么首先使用 JSONP 编写应用程序的全部原因。
    • @JohnKällén - 您只需在为客户端提供服务的同一个域上设置缓存。如果需要,JSONP 服务器可以从该域请求数据,或者服务于客户端的域可以将请求代理到 JSONP 服务器。但由于您不想做太多额外的工作,这可能不相关。
    • 明白。在我的场景中,我只能将脚本和 html 存储在为客户端提供服务的域上,但不允许在服务器上执行任何代码。我可以完全控制托管 JSONP 服务的服务器。考虑到这种情况,您的第一个选择似乎是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多