1

对于我从事的产品,我在一些 ASP.NET/Castle Monorail 站点上遇到了一个小问题(或者可能不是那么小)。这是一个相当遗留的系统(写得早于我的时间),它使用 GET 请求,并在查询字符串中包含大量信息。我们最近遇到了查询字符串长度限制,对于我们需要传输到服务器的数据量,将数据临时存储在 cookie 中也是不合理的(我们已经远远超过了每个 cookie 4096 字节的限制,而且我们设置了很多 cookie,因此我们可能也接近或处于每个域的 cookie 限制。)

我想知道除了 POST (在某些情况下可能更改为 POST 请求,但可能根本不可能)之外,是否还有其他选择可以解决这个问题。我希望 StackOverflow 上的其他人也遇到过类似的问题,并且有一些神奇的解决方案(即使用 javascript 压缩数据,编码为 base64,传递给单个查询字符串项?只是不确定是否有任何库可以压缩以与 .NET 3.5 中的内置压缩类兼容的方式使用 javascript 处理数据。)

更新:

我最终选择的解决方案是发布到临时控制器。这个临时控制器拉取大量数据,将其卡在共享会话中(生产服务器位于不使用粘性会话/IP 的大型多银行服务器场中),并对实际控制器执行 GET,后者拉取来自共享会话的数据。不是最高效的解决方案,但它解决了问题。

4

7 回答 7

3

有几个用于 jQuery 的 Base64 编码插件,但这无济于事,因为Base64 通常会使数据更长,而不是更短。

根据数据,我会看看其他一些文本压缩技术。维基百科列出了一些

  • 上下文树加权法(CTW)
  • Burrows-Wheeler 变换(使压缩更有效的块排序预处理)
  • LZ77(由 DEFLATE 使用)
  • LZW

这是Javascript 的 LZW 实现

霍夫曼编码基于字母频率,因此它可能不适合您的数据。您可能必须转义结果以使其成为 URL 安全的。

于 2009-07-28T16:19:29.577 回答
1

除了切换到 POST 之外,您的选择将受到限制。Base64 将增加数据的大小而不是减少它。您提到将数据压缩为单个查询字符串项...也许您可以使用 Ajax 将数据拆分为 2 个单独的请求?不过,我不确定这是否适合您的情况。

于 2009-07-28T16:12:31.103 回答
1

如果生成如下查询字符串之类的数组,我建议使用 JSON 作为数据传输格式:

params[]=sth&params[]=sth2&params[]=sth3

这将是

{params:['sth1', 'sth2', 'sth3']}

您可以将此 JSON 字符串 sssign 到单个字母变量,如下所示

p={params:['sth1', 'sth2', 'sth3']}

更好的是压缩和 Base64 编码整个查询字符串。由于您在服务器端生成查询字符串(我假设这可以通过使用相同的 comp/decomp 算法在 JS 中完成),您可以在您的编程语言(例如 gzip)中使用任何内置压缩算法。在对压缩数据进行 Base64 编码后,是的,它会扩展一点,但不会像 url 编码那样扩展它。

于 2009-07-28T18:00:35.940 回答
0

我不会过分依赖javascript。压缩查询字符串是第一件自然而然的事情;但如果你远远领先于这些限制,你应该尝试保持会话。您从默认状态信息重新开始,然后通过提供的 POST 数据逐渐将服务器上的状态反映到用户的会话中,因此您将所有这些数据划分为许多处理程序(读取页面)。

于 2009-07-28T16:17:24.447 回答
0

教科书的答案是使用 POST。为什么这不可能?发明 POST 的原因几乎是为了绕过 GET 中的长度限制。

取决于细节的另一种可能性是有多个屏幕,每个屏幕都有一个数据子集,并将来自每个屏幕的数据存储在服务器上并在最后将它们连接起来。

于 2009-07-28T16:52:51.117 回答
0

是客户端还是服务器上的查询字符串限制?

如果问题只是客户端不会发送长 GET 字符串,也许您可​​以 POST 到代理服务器,然后将请求作为 GET 转发。

于 2009-07-28T16:56:06.817 回答
0

这是保存页面之间的状态信息吗?如果是这样,一个选项可能是使用其值为 GUID 的 cookie,如下所示:

_SESSIONID=3F2504E0-4F89-11D3-9A0C-0305E82C3301

并在服务器端存储会话信息。会话使用 GUID 唯一标识,因此可以轻松地直接在服务器上检索大量信息。

然后,您需要在客户端发送/检索该会话 id 以及客户端生成的信息(GET/POST字段)。

于 2009-07-28T17:03:10.440 回答