2012-03-15 10 views
1

お客様のために、私たちはいくつかのWCF Webサービスを開発しています。私たちのメッセージコントラクトは、クラスとそのプロパティの上にDataContract属性とDataMember属性を使用して定義します。 DataMember属性にはいくつかの余分な規則が追加されています。たとえば、プロパティが常に使用可能な場合は、(IsRequired = true)を使用します。これを示す。これらのルールは、メッセージの受信時または送信時にチェックされます。 WCF IsRequired属性ジレンマ

[DataContract] 
public class TestClass  
{ 
    [DataMember(IsRequired = true)] 
    public int RequiredValue { get; set; }  
} 

は、しかし、当社のテスト中に、我々はそれが、両方を使用して、だから私は、このプロパティ、EmitDefaultValue = falseのを発見したいくつかの読書を持つようRequiredValueFieldは、ヌルで初期化されるため、クライアント側では、動作しないことに気づいた私いくつかのクライアントが RequiredValue = 0を初期化し、サービスのメソッドを呼び出す場合

[DataContract] 
public class TestClass 
{ 
     [DataMember(IsRequired = true, EmitDefaultValue=false)] 
     public int RequiredValue { get; set; } 
} 

望ましい結果を得ることが、仮定、それが再びエラーが発生します。 どうすれば私のAPIusersに、ゼロを含むこのメンバに何かを渡すことができるオプションを自由にすることができますが、省略すると、エラーが返されますか?

答えて

1
  1. "希望する"結果が何であるかについて言及していません。私はあなたが達成しようとしていることを意味します。
  2. 絶対に必要でない限り、EmitDefaultValuefalseに設定することをおすすめしません。理由を知るには、this MSDN pageの最後のセクションをお読みください。
  3. EmitDefaultValuefalseに設定すると、サービス用に生成されたWSDLには、WCFのみが理解できる注釈がいくつかあります。つまり、サービスの相互運用性を制限することができます。それはあなたの必要条件ですか?あなたの問題へ

ソリューション:

あなたのデータメンバー "RequiredValue" NULL可能int型にします。

[DataMember(IsRequired = true,EmitDefaultValue=false)] 
    public int? RequiredValue { get; set; } 

ようにすることで、RequiredValueデータメンバのデフォルト値がnullになり、あなたは何の問題もなく、ゼロ(0)を設定することができるようになります。