500错误 - JSON对象POST到.ASMX webservice

Ter*_*rry 4 ajax jquery json web-services asmx

保持这个问题简短而甜蜜.当我尝试将JSON对象传递给ASMX Web服务时,我收到500错误.请注意,如果我将params声明为单个变量(例如int ID, int OrderHeaderID,等),我不会收到错误.我不明白为什么会出现这个问题,我之前已经成功地以这种方式传递了对象,可能使用了不同的语法,但我记不得了.

JS:

var returnHeader = {
    ID: -1,
    OrderHeaderID: parseInt(getQueryStringKey('OrderID')),
    StatusID: 1,
    DeliveryCharge: 0,
    CreatedBy: $('span[id$="lblHidUsername"]').text(),
    ApprovedBy: $('span[id$="lblHidUsername"]').text()
};

$.ajax({
    type: "POST",
    url: 'Order.asmx/SaveReturnHeader',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: JSON.stringify(returnHeader),
    success: function (result) {
        if (result.Status == 'OK') {
            GetReturns();
        }
        else {
            $('#divMessage').show().html(result.Data.Message).addClass('error');
        }
    },
    error: function (x, e) {
        if (x.status == 500) {
            $('#divMessage').show().html('An unexpected server error has occurred, please contact support').addClass('error');
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

服务器:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public object SaveReturnHeader(BEReturnHeader returnHeader)
{
    try
    {
        return new
        {
            Status = "OK",
            Data = ""
        };                
    }
    catch (Exception ex)
    {
        return new
        {
            Status = "ERROR",
            Data = ex
        }; 
    }
}
Run Code Online (Sandbox Code Playgroud)

对象(简称为简称):

public int ID ...
public int OrderHeaderID ...
public int StatusID ...
public decimal DeliveryCharge ...
public string CreatedBy  ...
public string ApprovedBy ...
Run Code Online (Sandbox Code Playgroud)

请求数据:

{"ID":-1,"OrderHeaderID":5,"StatusID":1,"DeliveryCharge":0,"CreatedBy":"77777777","ApprovedBy":"77777777"}
Run Code Online (Sandbox Code Playgroud)

响应标题:

HTTP/1.1 500 Internal Server Error
Date: Mon, 05 Dec 2011 16:38:36 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
jsonerror: true
Cache-Control: private
Content-Type: application/json
Content-Length: 91
Run Code Online (Sandbox Code Playgroud)

响应数据:

{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}
Run Code Online (Sandbox Code Playgroud)

固定:

必须包装JSON对象,以便在服务器上识别它:

var params = {
            returnHeader: {
                ...
            }
        };

...
data: JSON.stringify(params),
...

{"returnHeader":{"ID":-1,"OrderHeaderID":5,"StatusID":1,"DeliveryCharge":0,"CreatedBy":"77777777","ApprovedBy":"77777777"}}
Run Code Online (Sandbox Code Playgroud)

Sco*_*ttE 6

您只传递对象的属性,而不是整个对象容器.所以,web方法期待这样的事情:

{returnHeader:{"ID":-1,"OrderHeaderID":5,"StatusID":1,"DeliveryCharge":0,"CreatedBy":"77777777","ApprovedBy":"77777777"}}
Run Code Online (Sandbox Code Playgroud)