为什么我无法将JSON对象传递给WCF Web服务?

时间:2012-10-17 23:33:16

标签: asp.net ajax json wcf

我使用旧的“ASMX”Web服务实现构建了一个相当复杂的应用程序,我正在迁移到WCF。有一件事只是让我发疯 - 它应该很容易,但无论我如何尝试构建这个调用,我的AJAX调用都会出错。这适用于ASMX调用,但不适用于WCF。

以下是AJAX调用:

        var ProfileData = new Object();
        ProfileData.SUID = SUID;
        ProfileData.FirstName = $("#FirstName").val();
        ProfileData.LastName = $("#LastName").val();
        ProfileData.Birthdate = new Date($("#Birthdate").val());
        var DTO = {'ProfileData': ProfileData };

        $.ajax({
            type: "POST",
            url: "AllianceService.svc/SaveBasicProfile",
            data: JSON.stringify(DTO),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                    UpdateTips($("#BasicProfileValidate"), "Success! Your data has been updated.");
                }
            },
            error: function (xhr, ajaxOptions, thrownError, request, error) {
                alert('Error Saving Basic Profile Data');
            }
        });

以下是C#/ Server端类型的声明:

[DataContract]
public class BasicFolderData
{
    [DataMember]
    public string SUID { get; set; }
    [DataMember]
    public string FirstName { get; set; }
    [DataMember]
    public string LastName { get; set; }
    [DataMember]
    public DateTime Birthdate { get; set; }
}

以下是该服务的定义:

    [OperationContract]
    public int SaveBasicProfile(BasicFolderData ProfileData)
    {
         ... do stuff
    }

现在,如果我打破所有数据成员并将它们用作参数,我可以使用简单的

    data: JSON.stringify(ProfileData)

但是这个对象实际上比这要长得多,我想知道如何传递对象。

另外,我试过了:

    data: JSON.stringify({"ProfileData": ProfileData }),

    data: JSON.stringify('{"ProfileData":' + ProfileData + '}'),

    data: '{"ProfileData":' + JSON.stringify(ProfileData)  + '}',

但一切都无济于事......我收到了所有错误消息。

如果我使用:

    data: JSON.stringify(ProfileData), 

然后,奇怪的是,请求将其发送到服务器,但ProfileData参数为null。我怀疑问题是我的datacontract,但不知道从哪里开始。此外,我有许多标量参数的函数可以正常工作 - 只有当我尝试传递失败的对象时才会这样。任何帮助将不胜感激!!

根据DonAndre的建议,我发现只需将参数更改为标量类型即可使调用成功。但是,参数始终为null。

2 个答案:

答案 0 :(得分:1)

如果在服务器上的配置中将enableWebScript设置为true,则WCF将JSON包装为d。看看这里:JsonConvert.DeserializeObject and "d" wrapper in WCF

答案 1 :(得分:1)

好的 - 问题很简单:“BasicFolderClass”中有一个DateTime字段(Birthdate)。

当在DTO对象上调用JSON.stringify时,它会在发送之前将javascript端的DateTime字段转换为字符串。所呈现的JSON字符串与预期的DateTime之间在该字段上的不匹配导致了错误。