我使用旧的“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。
答案 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之间在该字段上的不匹配导致了错误。