0

我正在编写一个在客户端和服务器之间传输 JSON 的 ASP.NET Web 应用程序。我几乎完成了一切,除了我似乎无法从客户端将 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 方法更改为 take stringExpressionStructure但都返回一个500 Internal Server Error. 我还尝试修改来自客户端的 JSON,进行各种包装(包括"Expression"用方括号包装最外层)。

我遗漏了哪些关键元素阻止 ASMX 正确获取 JSON 并获取ExpressionStructure? 或者,我怎样才能直接或从字典中获取字符串,以便手动执行 JSON 转换(我不想这样做)?

4

1 回答 1

0

在构建了一个与主项目分开的小测试用例后,我能够更好地了解服务器返回的原因500 Internal Server Error。碰巧的是,Web 应用程序正在捕获反序列化错误并尝试将请求重定向到错误处理程序页面。由于它不是一个实际的页面请求,重定向引发了一个错误,这迫使重定向到错误处理程序页面......直到太多的重定向踢出一个错误。

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

于 2012-08-09T21:00:20.077 回答