Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASMX web方法在参数JSON中接收未替换的双引号 我的HTTP请求包含一个有效的JSON字符串,该字符串在“JO\\”HN的中间有双引号,如本文所见(Fiddler Web Debugger捕获)_C#_Asp.net_Json_Webmethod_Double Quotes - Fatal编程技术网

C# ASMX web方法在参数JSON中接收未替换的双引号 我的HTTP请求包含一个有效的JSON字符串,该字符串在“JO\\”HN的中间有双引号,如本文所见(Fiddler Web Debugger捕获)

C# 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

注意:请求提交过程使用标准的jQuery
$.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
});