gpt4 book ai didi

c# - ASMX Web 方法在参数、JSON 中接收未转义的双引号

转载 作者:行者123 更新时间:2023-11-30 16:26:15 25 4
gpt4 key购买 nike

我的 HTTP REQUEST 包含一个有效的 JSON 字符串,名称“jo\"hn”中间的双引号已转义,如此处所示(由 Fiddler Web 调试器捕获)

{"name":"firstName","value":"jo\"hn"},

注意:请求提交过程使用标准的 jQuery $.ajax(..) 调用 as seen in this article没有问题。


服务器端问题

我的 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!

可以理解的异常信息是:

{"Invalid object passed in, ':' or '}' expected. (423): [{\"name\":\"plc$lt$zoneHeaderTopNav$searchBoxTopNav$txtWord\",\"value\":\"\"},{\"name\":\"salutation\",\"value\":\"Mr\"},{\"name\":\"firstName\",\"value\":\"joh\"n\"},{\"name\":\"lastName\",\"value\":\"smith\"},{\"name\":\"initial\",\"value\":\"d\"}]"}

在不改变经典 ASMX Web 服务的情况下,如何最好地解决这个问题?

我可能会考虑清理传入请求的前端处理程序,或者可能在 Web 服务方法的开头运行字符串清理。也许是一个不同的 JSON 库。

但是我想知道是否有一个简单的答案:调整配置、使用属性、设置或重载方法可能会解决问题?

我已经在 Internet 上进行了大量搜索,但大多数文章都介绍了从服务器向客户端返回 JSON 数据以及处理该领域的问题。


附录说明:Darin 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 反序列化?让我建议你一个更好的方法。

从定义模型开始:

public class Person
{
public string Name { get; set; }
public string Value { get; set; }
}

然后是一个网络方法:

[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 方法是现代浏览器内置的,但如果您需要支持旧版浏览器,您可以包含 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
});

注意事项:您不需要正则表达式来删除单引号,您应该使用 JSON.stringify 来正确编码您的请求值。

关于c# - ASMX Web 方法在参数、JSON 中接收未转义的双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9011419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com