假设我想调用一些服务器方法并将其传递给以下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上的安全设置?
答案 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的回答一样)。