我想使用AJAX调用来使用WCF REST服务。

假设我有以下内容,其中Person是用户定义的类:

[ServiceContract]
public interface IPerson
{
    [WebInvoke(ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    Person GetPerson();
}


Person定义为DataContract和如果我未将Person定义为DataContract有什么区别?

[DataContract]
public class Person
{
    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}


在客户端,无论Person是否定义为DataContract,我都可以始终使用以下内容,对吗?

<script type="text/javascript">
    $().ready(function() {
        $("#Button1").click(function() {
            $.getJSON("<url of the service>/GetPerson", CallBackMethod);
        });
    });

    function CallBackMethod(result) {
        alert(result.FirstName);
        alert(result.LastName);
    }
</script>

最佳答案

数据协定只是.NET Framework支持的序列化的一种形式。它们实质上是WCF之前的XML序列化的替代品。所有这些都通过DataContractSerializer完成,DataContractSerializer负责将您的对象转换为与数据协定匹配的序列化XML。这是WCF和ASP.NET JSON代码以及其他请求所使用的序列化程序类。

从理论上讲,您应该使用DataContract和DataMember属性标记合同对象,以明确它们的用途。实际上,DataContractSerializer会根据您提供的任何自定义类型创建数据合同;如果不使用它们,它将为您推断DataContract和DataMember属性。添加它们使您可以更好地控制序列化的工作方式,与添加XML序列化属性的方式完全相同。缺少显式属性,对象中的所有公共字段都将成为数据协定的一部分。

因此,对您问题的真正答案是,至少就序列化程序而言,始终将Person定义为DataContract;将属性添加到您的班级及其所有公共成员将产生相同的效果。 IMO,没有充分的理由不这样做:它花费了您数毫秒的输入时间,如果您不这样做,运行时只会假装您仍然这样做。

09-26 16:30