【问题标题】:Problem AJAX(ing) JSON object on Mac Firefox version (3.6.12)Mac Firefox 版本 (3.6.12) 上的问题 AJAX(ing) JSON 对象
【发布时间】:2011-06-21 15:29:17
【问题描述】:

假设我想调用一些服务器方法并将以下 JSON 对象传递给它:

var t = { "test": 0};

我正在使用带有以下选项的 jQuery 库 $.ajax 方法:

type: "POST",
async: true,
url: 'mypage.aspx?Action=myAction,
data: {
   test: JSON.stringify(t, null, 2)
},
contentType: 'application/x-www-form-urlencoded',
dataType: 'json',
.
.
.

在服务器端,我使用以下代码获取数据:

  public string GetInputStream()
  {
     string inputContent;
     using (var sr = new System.IO.StreamReader(Request.InputStream))
        inputContent = sr.ReadToEnd();

     return Server.UrlDecode(inputContent.Split('=')[1]);
  }

从 Mac Firefox 3.6.12 版以外的浏览器调用时,getinputstream 方法返回:

test=%7B%0A++%22test%22%3A+0%0A%7D

这是有效的,然后可以反序列化为一个对象,但是在调用时 这个方法来自 Mac OS X 10.5.8 Firefox 3.6.12 我得到了一个无法反序列化的字符串:

test=%7B%0A++%22test%22%3A0%0A%Pr

我相信字符串末尾的 Pr 把我弄乱了,没有变成右括号。有什么想法吗?

编辑: 我正在查看 Firebug Net > Call > POST 选项卡,惊讶地发现 POST 字符串有效:test=%7B%0A++%22test%22%3A%220%22%0A%7D 这个 POST 字符串还有什么地方可以修改以到达带有无效字符串的服务器?

编辑2: 有趣的发现,如果使用 HTTPS(安全),所有问题都会得到解决:-)。 我想这一定是 Mac Firefox 上的安全设置?

【问题讨论】:

  • 只是为了感受一下您要完成的工作,您能告诉我这种方法的目的是什么吗?根据您尝试执行的任务,使用页面方法和具有 application/json 内容类型的 AJAX 调用可能会容易得多
  • 我正在传入 json 对象,该对象的大小可能非常大,以便可以在服务器端持久化/创建它。我不确定您所说的“页面方法”是什么意思;我已经尝试过“application/json”内容类型,没有任何区别。
  • 我看到“Pr”来自具有以下用户代理的用户:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.12) Gecko /2009070609 Firefox/3.0.12(他们有 Firebug)

标签: .net jquery json serialization


【解决方案1】:

我最终修改了 GetInputStream() 方法以使用正则表达式将“%Pr”替换为右括号:

 public string GetInputStream()
 {
    string inputContent;
    using (var sr = new System.IO.StreamReader(Request.InputStream))
       inputContent = sr.ReadToEnd();

    inputContent = System.Text.RegularExpressions.Regex.Replace(inputContent, "%Pr$", "}");

    return Server.UrlDecode(inputContent.Split('=')[1]);
}

我知道这并不能解决问题的原因,但至少我正在争取一些时间来提出解决方案:-(

【讨论】:

    【解决方案2】:

    我认为这是JQuery AJAX Error in Firefox on Mac with "Managed" Users的副本

    问题是 Firefox 和 Mac OS X 10.5 中的家长控制之间的冲突。 POST 数据的最后两个字符替换为 Pr。这个问题是在两年前首次报告的,看起来不会修复。

    据我所知,最好的解决方法是使用 SSL,因为这似乎可以防止出现问题。如果这不是一个选项,那么您需要在 POST 数据的末尾添加至少 2 个字符,这些字符可以忽略。在一个表格中,这意味着在表格末尾添加类似<input type="hidden" name "useless" value="useless"> 的内容(归功于Miquel Botanch)。对于 JSON/XML 请求,最后几个字符对于解析很重要。如果您不能只添加空格或新行(也许这会起作用,我没有尝试过),那么您需要添加一些其他虚拟值客户端。最后,服务器端您需要检测并删除这个额外的虚拟值(正如 krul 的回答所做的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多