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

时间:2011-02-04 21:24:06

标签: .net jquery json serialization

假设我想调用一些服务器方法并将其传递给以下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>致电> POST选项卡,并惊讶地发现POST字符串有效:test=%7B%0A++%22test%22%3A%220%22%0A%7D 在哪里可以修改此POST字符串以使用无效字符串到达​​服务器?

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我认为这是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的回答一样)。