【问题标题】:How to ignore case sensitive properties name in WCF service call?如何在 WCF 服务调用中忽略区分大小写的属性名称?
【发布时间】:2013-03-22 15:54:08
【问题描述】:

您好,我想知道从客户端调用 WCF 方法的可能性,什么会忽略区分大小写的属性名称(在客户端,我使用小写属性名称的 JSON,但在服务器端使用大写)。在这种情况下,WCF 无法映射属性。 是否可以使用一些 WCF 属性等?

 public interface IMyWCF
    {
        [OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        bool UpdateUser(User user);

}
    [Serializable]
    [DataContract]
    public class User : ICloneable  
    {
        [DataMember]
        [JsonProperty(PropertyName = "login")]
        [StringLength(40, ErrorMessage = "The Login value cannot exceed 40 characters. ")]
        [DefaultValue("")]
        public String Login { get; set; }

        [DataMember]
        [JsonProperty(PropertyName = "id")]
        public int UserId { get; set; }
 }

【问题讨论】:

    标签: c# javascript wcf


    【解决方案1】:

    您可以使用[DataMember]属性的Name属性来映射属性名称:

    [DataContract]
    public class User : ICloneable  
    {
        [DataMember(Name = "login")]
        [JsonProperty(PropertyName = "login")]
        [StringLength(40, ErrorMessage = "The Login value cannot exceed 40 characters. ")]
        [DefaultValue("")]
        public String Login { get; set; }
    
        [DataMember(Name = "id")]
        [JsonProperty(PropertyName = "id")]
        public int UserId { get; set; }
    }
    

    更新以下评论:没有任何旋钮可用于在 WCF 使用的默认序列化程序上启用不区分大小写的反序列化。不过,有一些选择(不理想)。您可以将序列化程序更改为使用 JSON.NET(可以这样做,请参阅 this blog post,但不是很容易)并使用该序列化程序中的序列化程序设置来忽略大小写。我认为您还应该能够添加其他属性(可以是私有的,除非应用程序在部分信任下运行),以映射其他支持的案例;类似于下面的代码:

    [DataContract]
    public class User
    {
        [DataMember]
        public String Login { get; set; }
        [DataMember]
        private String login { get { return this.Login; } set { this.Login = value; } }
    
        [DataMember]
        public int UserId { get; set; }
        [DataMember]
        private int id { get { return this.UserId; } set { this.UserId = value; } }
    }
    

    【讨论】:

    • 是的,但是我需要同时使用小写和大写的变体呢?
    • 你找到办法了吗?
    • @Arbejdsglæde 4 年后:您可以向仅包装现有属性的对象添加另一个属性。然后,使用 DataMember 上的 name 参数作为您想要的大写/小写变体。
    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多