WCF Rest服务响应需要属性名称..而不是datamember属性名称

时间:2017-07-24 14:21:06

标签: rest wcf response

我有WCF Rest服务。我的Datacontract对象是

[DataContract(Name = "Z")]
public class User
{
    [DataMember(Name = "A", EmitDefaultValue = false)]
    public int UserName{ get; set; }

    [DataMember(Name = "B", EmitDefaultValue = false)]
    public int Address{ get; set; }

}

当我消费服务(休息呼叫)时,我得到了响应

{“A”:“TestName”,“B”:“India”}。

但我希望像这样回复

{“userName”:“TestName”,“Address”:“India”}。

如何获得以上回复。我不想删除模型对象的数据注释,因为我的旧客户端正在使用WCF服务。

提前致谢。

更新

我尝试使用以下代码

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.Remove(config.Formatters.JsonFormatter);
config.Formatters.Clear();
config.Formatters.Add(new NewtonsoftJsonFormatter());

* NewtonsoftJsonFormatter是从MediatypeForamtter扩展而来的 但没用。它仍采用默认的.net序列化器。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

更改响应中某个属性的名称是对WCF服务合同的重大更改。在形式上,您希望对您的服务进行版本控制,以便旧客户端像往常一样继续工作,但新客户端会选择新功能。在Stack Overflow的其他地方讨论了WCF服务的版本控制(例如Best practices for versioning your services with WCF?),但是在最简单的层面上,您可以在服务上创建一个返回新合同的新方法(同时在其他方面与现有方法的行为相同)方面):

[DataContract(Name = "SomethingMoreSensible")]
public class User
{
    [DataMember(Name = "userName", EmitDefaultValue = false)]
    public int UserName{ get; set; }

    [DataMember(Name = "Address", EmitDefaultValue = false)]
    public int Address{ get; set; }
}

新客户端被路由到这个新方法(通过明确地给他们一个不同的URL去,或者可能更聪明的东西)。