C# ASMX web方法在参数JSON中接收未替换的双引号 我的HTTP请求包含一个有效的JSON字符串,该字符串在“JO\\”HN的中间有双引号,如本文所见(Fiddler Web Debugger捕获)
注意:请求提交过程使用标准的jQueryC# ASMX web方法在参数JSON中接收未替换的双引号 我的HTTP请求包含一个有效的JSON字符串,该字符串在“JO\\”HN的中间有双引号,如本文所见(Fiddler Web Debugger捕获),c#,asp.net,json,webmethod,double-quotes,C#,Asp.net,Json,Webmethod,Double Quotes,注意:请求提交过程使用标准的jQuery$.ajax(..)调用,没有问题 服务器端问题 我的C#ASMX web服务方法接收以下C#字符串值,该值的中间双引号未被替换(即,已删除反斜杠)。如果不导致下面所示的错误,则无法对其进行反序列化 在我将值接收到web方法之前,这就是过程中不相交的地方。这就好像ASP.NET正在内部处理字符串,方法是取消对字符串的回避,并将其重新组合在一起,而不进行转义,更改原始值,而不是将其逐字提供给web方法参数 C#字符串是: {"name":"firstNam
$.ajax(..)
调用,没有问题
服务器端问题 我的C#ASMX web服务方法接收以下C#字符串值,该值的中间双引号未被替换(即,已删除反斜杠)。如果不导致下面所示的错误,则无法对其进行反序列化 在我将值接收到web方法之前,这就是过程中不相交的地方。这就好像ASP.NET正在内部处理字符串,方法是取消对字符串的回避,并将其重新组合在一起,而不进行转义,更改原始值,而不是将其逐字提供给web方法参数 C#字符串是:
{"name":"firstName","value":"jo"hn"},
ASMX Web方法大致如下:
using System.Web.Script.Serialization;
using System.Web.Script.Services;
[WebMethod]
[ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
public string saveData(string values)
{
JavaScriptSerializer json = new JavaScriptSerializer();
request = json.Deserialize<List<NameValuePair>>(values.ToString());
// ^^^ KABOOM!
注意:这是生成问题顶部所示的有效JSON片段的调用的实施例。为什么要在web服务中执行这种可怕的手动JSON反序列化?让我建议一种更好的方法 首先定义一个模型:
public class Person
{
public string Name { get; set; }
public string Value { get; set; }
}
然后是web方法:
[WebMethod]
[ScriptMethod]
public string SaveData(Person person)
{
...
}
然后您可以从javascript调用它。例如,使用jQuery:
$.ajax({
url: 'foo.asmx/SaveData',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
person: {
name: 'firstName',
value: ' jo\"h\'n'
}
}),
success: function(result) {
alert(result.d);
}
});
不再有歌舞伎了
这里显示的JSON.stringify
方法是内置的现代浏览器,但是如果需要支持传统浏览器,可以将脚本包含到页面中
更新: 现在,您已经显示了代码,似乎没有对请求进行编码。请尝试以下操作:
var formObj = $(':input:not([type=hidden])').serializeArray();
var request = JSON.stringify(formObj);
$.ajax({
url: "/Service.asmx/saveData",
type: "POST",
data: JSON.stringify({ values: request }),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: SaveDraftSuccess,
error: SaveDraftFail
});
需要注意的事项:删除单引号不需要正则表达式,而应该使用
JSON.stringify
对请求值进行正确编码。我们从动态生成的前端表单接收大量值。没有“自定义“将此数据接收到服务器端的类。stringify在客户端运行良好,不需要修改流程。解析需要在ASP.NET端,我相信它是如何在框架中接收/处理JSON的。@JohnK,这个方法到底是如何从客户端调用的?为什么您的服务上没有强类型模型?这是系统以前的设计方式。我们只需要解决双报价问题,然后我们就可以开始运行了。现在不会进行重新设计。(它是通过jQuery ajax在客户端调用的,问题中有链接。)@JohnK,ASP.NET ASMX中没有缺陷。该漏洞存在于所有充斥互联网的错误信息的博客帖子中,人们认为这些错误信息是理所当然的,并在不了解可能产生的副作用的情况下将其复制粘贴到代码中。这既不是ASP.NET ASMX的错,也不是你的错。这是你读到的博客文章的作者的错,他只是提供了错误的信息。就这样。每次使用字符串连接来构建JSON时,您都应该知道自己做错了。@JohnK,错误,在jQuery AJAX请求中显示数据:“{name:'Prabir',times:2}”
。你不应该写这样的东西。从未。当然,除非这些值是像这样硬编码的,但事实并非如此。它们通常来自需要正确JSON编码的用户输入。浏览器(现代版)为此提供了JSON.stringify方法。解决方案在Darin的更新部分中,通过修改一行JavaScript代码:data:JSON.stringify({values:request}),
$.ajax({
url: 'foo.asmx/SaveData',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
person: {
name: 'firstName',
value: ' jo\"h\'n'
}
}),
success: function(result) {
alert(result.d);
}
});
var formObj = $(':input:not([type=hidden])').serializeArray();
var request = JSON.stringify(formObj);
$.ajax({
url: "/Service.asmx/saveData",
type: "POST",
data: JSON.stringify({ values: request }),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: SaveDraftSuccess,
error: SaveDraftFail
});