2

こんにちは私はクライアント側から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; }
 }
4

1 に答える 1

9

Name属性のプロパティを使用して[DataMember]、プロパティ名をマップできます。

[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を使用するようにシリアライザーを変更し(これは可能です。このブログ投稿を参照してください。ただし、簡単ではありません)、そのシリアライザーのシリアライザー設定を使用して、大文字と小文字を無視することができます。サポートされている追加のケースをマップするために、追加のプロパティ(アプリケーションが部分的に信頼されている場合を除いて、プライベートにすることもできます)を追加することもできるはずです。以下のコードに似たもの:

[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; } }
}
于 2013-03-22T16:20:05.220 に答える