问题AJAX(ing)Mac上的JSON对象Firefox版本(3.6.12)

假设我想调用一些服务器方法并将其传递给以下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字符串以使用无效字符串到达​​服务器?

EDIT2:有趣的发现,如果使用HTTPS(安全),所有问题都得到解决:-)。 我想它必须是Mac Firefox上的安全设置?

我最终修改了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]); } 

我知道这不是解决问题的原因,但至少我需要一些时间来提出解决方案:-(

我认为这是Mac上Firefox中带有“托管”用户的JQuery AJAX错误的重复

问题是Firefox与Mac OS X 10.5中的家长控件之间存在冲突。 POST数据的最后两个字符替换为Pr。 这个问题是两年前首次报道的,它似乎不会被解决。

我所知道的最好的工作是使用SSL,因为这似乎可以防止这个问题。 如果这不是一个选项,那么您需要在POST数据的末尾添加至少2个字符,这些字符可以忽略。 在一种forms,意味着在表格的末尾添加像之类的东西(归功于Miquel Botanch )。 对于JSON / XML请求,最后几个字符对于解析很重要。 如果你不能只是添加空格或新行(也许这会起作用,我还没试过),那么你需要添加一些其他虚拟值客户端。 最后,服务器端你需要检测并删除这个额外的虚拟值(正如krul的答案所做的那样)。