【问题标题】:WCF Rest service Response Need property names..Instead of datamember attribute namesWCF Rest 服务响应需要属性名称..而不是数据成员属性名称
【发布时间】:2017-07-24 14:21:05
【问题描述】:

我有 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; }

}

当我使用服务(Rest Call)时,我得到的响应是

{"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 序列化程序。有什么帮助吗?

【问题讨论】:

  • 从 Newtonsoft.Json 添加 [JsonProperty("userName")] 属性
  • 我试过了...但是没用...需要在global.asax应用启动中添加吗?
  • 不,你不知道。尝试删除数据成员并仅使用 JsonProperty
  • 我两者都需要。因为我的桌面应用程序正在使用 WCF 服务。我们正在开发使用 WCF Rest 的 Angular 应用程序。但是 newtonsoft 文档。说我们可以同时使用两者。 “Json.NET 属性优先于标准 .NET 序列化属性(例如,如果 JsonPropertyAttribute 和 DataMemberAttribute 都存在于属性上并且都自定义名称,则将使用来自 JsonPropertyAttribute 的名称)。” 否则是否可以将 global.asax 中的默认序列化程序分配给 JSON.Net。因为当我使用 jsonconvert 手动序列化时输出是正确的。考虑 JsonProperty 名称。
  • stackoverflow.com/questions/14591750/… 此链接可以帮助您覆盖默认的 json 序列化程序。虽然它适用于 asp.net mvc 但它应该有所帮助。

标签: rest wcf response


【解决方案1】:

更改响应中某个属性的名称是对 WCF 服务合同的重大更改。形式上,您希望对您的服务进行版本化,以便旧客户端继续照常工作,但新客户端获取新功能。 WCF 服务的版本控制在 Stack Overflow 上的其他地方进行了讨论(例如 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 去,或者可能更聪明的东西)。

【讨论】:

  • 感谢劳伦斯的回复。我不想违反合同。但是是否可以在 Global.asax 中添加 JSON 格式化程序以创建具有原始属性名称的响应?仅适用于 REST 调用
  • 抱歉,不清楚您的旧客户端是否使用 REST 协议。您可以连接到 WCF 管道,将 IDispatchMessageInspector 视为扩展点,在那里您可能会询问 OperationContext 以计算客户端调用的上下文。就个人而言,我建议不要做任何太聪明的事情 - 根据协议具有不同架构的响应可能会令人惊讶(取决于您的场景)。
  • 我们正在将我们的桌面应用程序转换(创建)为 web(Angular)。所以我们的桌面客户端将使用 WCF 服务。 Web 客户端将使用相同的服务但​​在 REST 中。
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 2018-06-12
  • 1970-01-01
  • 2013-08-23
  • 2021-07-23
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
相关资源
最近更新 更多