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

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

更新:

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

有帮助吗?

解决方案

有几个 jQuery 的 Base64 编码插件, ,但这没有帮助,因为 Base64 通常会使数据变得更长, ,不短。

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

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

这是一个 Javascript 的 LZW 实现.

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

其他提示

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

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

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

这将是

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

您可以将此 JSON 字符串签名为单个字母变量,如下所示

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

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

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

教科书的答案是使用POST。为什么这不可能呢?发明 POST 的原因很大程度上是为了绕过 GET 的长度限制。

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top