2

我使用较旧的“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 参数为空。我怀疑问题出在我的数据合同上,但不知道从哪里开始。此外,我有很多带有标量参数的函数都可以正常工作 - 只有当我尝试传递对象时才会失败。任何帮助将不胜感激!!

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

4

2 回答 2

1

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

于 2012-10-17T23:51:36.303 回答
1

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

当对 DTO 对象调用 JSON.stringify 时,它会将 javascript 端的 DateTime 字段转换为字符串,然后再发送。呈现的 JSON 字符串与预期的 DateTime 之间的该字段不匹配是导致错误的原因。

于 2012-10-18T00:56:49.547 回答