2

次のような簡単な方法で定義されたWCFサービス操作があります

[ServiceContract(Namespace = "http://contoso.com")]
interface ICalculator
{
  [OperationContract]
  AddResp Add(AddRqst addRequestDummyName);
}

ここで、AddRqst は次のように定義されます

[DataContract]
class AddRqst
{
    [DataMember]
    public decimal A { get; set; }
    [DataMember]
    public decimal B { get; set; }
}

私が見る問題は、WCFがシリアル化する方法とリクエストが期待される方法が、パラメーター名でラップされていることです(これはメモリからのものです)

<Add>
  <addRequestDummyName>
     <A>1</A>
     <B>1.5</B>
  </addRequestDummyName>
</Add>

このファイルのスキーマを配布することはできません。なぜなら、WCF はパラメータの追加ラッパーを追加するのが好きであり、期待しているためです。私がデザインしたように見えるはずです。

<Add>
   <A>1</A>
   <B>1.5</B>
</Add>

私はMessageContractを認識しており、AddRqst (および AddResp) を次のように変更するとラッピングが削除されることをテストしました。

[DataContract]
[MessageContract]
class AddRqst
{
    [DataMember]
    [MessageBodyMember]
    public decimal A { get; set; }
    [DataMember]
    [MessageBodyMember]
    public decimal B { get; set; }
}

私の質問は次のとおりです。データ契約だけでこれを行う方法はありますか? すべての操作には 1 つのパラメーターがあります。そうでない場合、AddRqst を変更した方法がこれを行うための最良の方法ですか?

4

0 に答える 0