我使用较旧的“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 的建议,我发现只需将参数更改为标量类型即可使调用成功。但是,该参数始终为空。