【问题标题】:500 Error - JSON object POST to .ASMX webservice500 错误 - JSON 对象 POST 到 .ASMX 网络服务
【发布时间】:2011-12-05 17:02:15
【问题描述】:

让这里的问题简短而有趣。当我尝试将 JSON 对象传递给 ASMX Web 服务时出现 500 错误。请注意,如果我将参数声明为单个变量(例如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');
        }
    }
});

服务器:

[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
        }; 
    }
}

对象(为简单起见):

public int ID ...
public int OrderHeaderID ...
public int StatusID ...
public decimal DeliveryCharge ...
public string CreatedBy  ...
public string ApprovedBy ...

请求数据:

{"ID":-1,"OrderHeaderID":5,"StatusID":1,"DeliveryCharge":0,"CreatedBy":"77777777","ApprovedBy":"77777777"}

响应标头:

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

响应数据:

{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}

修复:

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

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

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

{"returnHeader":{"ID":-1,"OrderHeaderID":5,"StatusID":1,"DeliveryCharge":0,"CreatedBy":"77777777","ApprovedBy":"77777777"}}

【问题讨论】:

    标签: jquery ajax json web-services asmx


    【解决方案1】:

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

    {returnHeader:{"ID":-1,"OrderHeaderID":5,"StatusID":1,"DeliveryCharge":0,"CreatedBy":"77777777","ApprovedBy":"77777777"}}
    

    【讨论】:

    • 这就是问题所在。蹩脚,我认为它足够聪明,可以意识到只传递了一个对象。谢谢斯科特。在 .NET 2.0 中工作的乐趣...
    • ScottE:现在数组也有同样的问题,但我正确命名了它,有什么想法吗?数据:{"ReturnDetails":[{"ReturnHeaderID":5,"SKU":537258,"ReasonCode":1,"Quantity":1,"Comment1":"","Comment2":"","Comment3":""},{"ReturnHeaderID":5,"SKU":467662,"ReasonCode":1,"Quantity":1,"Comment1":"","Comment2":"","Comment3":""}]} 功能:public object SaveReturnDetails(List<BEReturnDetail> ReturnDetails)
    • 附言。如果您知道问题,我可以提出一个新问题,以便您获得完整答案。
    • ReturnHeaderID 应该只是 ID,根据您的对象定义。另外,您那里似乎有一些额外的字段?
    • 不,这些是ReturnDetail 对象,而不是ReturnHeader。抱歉,我知道这有点令人困惑。话虽如此,同时我发现有一个合法的服务器端代码错误没有被抛出,即使我正在捕获异常并将它们作为成功的对象返回。事实证明我的语法没有问题。感谢您再次浏览,抱歉浪费您的时间。
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 2012-04-03
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    相关资源
    最近更新 更多