ASMX Web方法接收在参数中接受未加入的双引号,JSON
-
14-11-2019 - |
题
我的http请求包含一个有效的JSON字符串,其中名称中间的双引用“jo \”hn“在此处逃脱(由Fiddler Web调试器捕获)
{"name":"firstName","value":"jo\"hn"},
.
注意:请求提交过程使用标准jquery $.ajax(..)
调用如本文所见没有问题。
服务器侧问题
我的C#ASMX Web服务方法接收以下C#字符串值,该值具有中间双重引用(即删除了Backslash)。这不能被反序列化而不会导致下面的错误。
这是在我将值接收到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!
.
exception消息可以理解,是:
{“无效的对象传递,'或'或'}'。(423): [{\“名称\”:\“PLC $ LT LT ZoneHeaderTopNav $ SearchBoav $ txtword \”,\“value \”:\“\”},{\“name \”:\“致敬\”,\“值“:”Mr \“},{\”名称\“:\”firstname \“,\”value \“:\”joh \“n \”n},{\“name \”:\“lastname \ “,”值“:\”史密斯\“},{\”名称\“:\”初始\“,\”value \“:\”d \“}”。
如何在不改变经典的ASMX Web服务的情况下解决这个问题?
我可能会考虑一个清除传入请求的前处理程序,或者在Web服务方法的开头时运行String Cleanup。也许是一个不同的JSON库。
然而,我想知道是否有一个简单的答案:调整配置,使用属性,一个可能解决问题的设置或过载方法?
我已经在互联网上做了很多戳,但大多数文章都覆盖了从服务器返回客户端的JSON数据并处理该区域的问题。
附录注意: dimitrov
更新:Darin的答案在这里发布在此内联,便于参考
.function SaveDraft() { $.checklist.checkvalid(); var formObj = $(':input:not([type=hidden])').serializeArray(); var request = JSON.stringify(formObj); request = request.replace(/'/g, ""); $.ajax({ url: "/Service.asmx/saveData", type: "POST", // *** Original erroneous line: uses string concat - commented out // data: "{'values':'" + request + "'}", // *** CORRECTED LINE: provides an object instead of a string and calls JSON stringify. data: JSON.stringify({ values: request }), dataType: "json", contentType: "application/json; charset=utf-8", success: SaveDraftSuccess, error: SaveDraftFail }); }
注意:这是在问题顶部显示的有效JSON片段的调用的实施例。
解决方案
为什么您在Web服务中执行此可怕的手册JSON Deserialization?让我建议你更好的方法。
首先定义模型:
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);
}
});
.
不再是Kabooms。
此处显示的JSON.stringify
方法是内置现代浏览器,但如果需要支持旧版浏览器,您可以包含 json2.js 脚本到您的页面。
更新:
现在您已经显示了您的代码,似乎您未编码您的请求。尝试这样的:
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
});
.
要注意的事情:您不需要ReAgular表达式来删除单引号,您应该使用JSON.stringify
正确编码您的请求值。