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

时间:2012-01-25 22:34:59

标签: c# asp.net json webmethod double-quotes

我的HTTP REQUEST包含一个有效的JSON字符串,其名称为“jo”的中间带有双引号,如此处所示“被转义”(由Fiddler Web Debugger捕获)

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

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


服务器端问题

我的C#ASMX Web服务方法接收以下C#字符串值,其中间双引号未转义(即已删除反斜杠)。如果不导致下面的错误,则无法反序列化。

在我收到我的网络方法的价值之前,这是流程中不相交的地方。就像ASP.NET在内部处理字符串一样,通过取消它并将其重新放回而没有转义,改变原始值而不是逐字地提供给web方法参数。

C#String是:

{"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! 

可以理解的例外情况是:

  

{“传入无效对象,':'或'}'预期。(423):   [{\ “名称\”:\ “PLC $ LT $ zoneHeaderTopNav $ searchBoxTopNav $ txtWord \”,\ “值\”:\ “\”},{\ “名称\”:\ “称呼\”,\“值\ “:\” \先生 “},{\” 名称\ “:\” 名字\”,\ “价值\”:\ “JOH \” N \ “},{\” 名称\ “:\” 姓氏\ “\ ”值\“:\ ”史密斯\“},{\ ”名称\“:\ ”初始\“,\ ”值\“:\ ”d \“}]”}

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

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

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

我已经在互联网上做了相当多的讨论,但大多数文章都涉及从服务器返回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片段。

1 个答案:

答案 0 :(得分:3)

为什么要在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);
    }
});

再也没有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
});

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