无法将除了Dictionary<>之外的任何内容发送到ASMX的JSON

时间:2012-08-09 17:37:33

标签: c# asp.net ajax json web-services

我正在编写一个ASP.NET Web应用程序,它在客户端和服务器之间传输JSON。我几乎所有东西都已完成,除了我似乎无法从客户端将JSON传输到ASMX并将其解释为除了Dictionary<string>

之外的任何东西

在服务器端,我有

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class WebService1: System.Web.Services.WebService
{
    [WebMethod(EnableSession = true)]
    public bool SaveExpression(ExpressionStructure Expression) {
        return true;
    }
}

在客户端,我使用$.ajax()发送数据,其中expressionObject.expression是客户端先前收到的.NET类ExpressionStructure的对象:

var dataSubmit = { Expression: expressionObject.expression };
$.ajax({
    url: "WebService.asmx/SaveExpression",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    type: 'POST',
    data: JSON.stringify(dataSubmit),
    success: function (msg) {
        alert(msg.d);
    },
    error: function (obj, status, msg) { ajaxServerError(obj, status, msg); }
});

SaveExpression方法接受Object时,我会得到字符串字典。当我使用ExpressionStructure时,我会得到500 Internal Server Error

正在发送的表达式是从此MVC3控制器方法接收的未修改版本。

public ActionResult Expression(int ExpressionID) {
    ExpressionStructure es = GetExpressionFromDatabase(ExpressionID);

    return new JsonResult {
        Data = new {
            expression = es,
            view = this.RenderPartialView("_Expression_Statement", es)
        }, 
        JsonRequestBehavior = System.Web.Mvc.JsonRequestBehavior.AllowGet
    };
}

表达式本身如下:

{
    "Expression": 
    {
        "Name":"Status Desc",
        "Type":0,
        "Statement": 
        {
            "FormulaItem": 
            {
                "Type":"Replace",
                "Parameters": 
                [
                    {
                        "Type":"Char",
                        "Value": 
                        {
                            "Value":"[Status]"
                        },
                        "Source":"picker"
                    },
                    {
                        "Type":"input",
                        "Value":
                        {
                            "Value":"0,1,2;Home,Driving,Away"
                        },
                        "Source":"inputBox"
                    }
                ]
            }
        }
    }
}

我尝试更改ASMX方法以stringExpressionStructure,但都返回500 Internal Server Error。我也尝试修改来自客户端的JSON,进行各种包装(包括用方括号包裹最外面的"Expression")。

我遗漏了哪些关键元素阻止ASMX正确获取JSON并获取ExpressionStructure可选地,我如何直接或从词典中获取字符串我可以手动执行JSON转换(我不想做)?

1 个答案:

答案 0 :(得分:0)

在构建与主项目分离的小测试用例之后,我能够获得有关服务器返回原因500 Internal Server Error的更好信息。碰巧的是,Web应用程序正在捕获反序列化错误并尝试将请求重定向到错误处理程序页面。由于它不是实际的页面请求,重定向会引发错误,这会强制重定向到错误处理程序页面....直到有太多重定向引发错误。

潜在的问题在于将JSON反序列化为.NET端的一个相当复杂的(集合)类。这些类完全用XML属性装饰器装饰,当模式中有选择时(即一个元素或另一个元素),使用抽象类。没有类似的JSON装饰器,反序列化不知道如何将JSON反序列化到哪个类。