0

私はWCFの初心者です。現在、TCP WCFサービスを開発しています。パラメーターを正しく渡すかどうかわからないので、コメントして標準化された方法を提供することをお勧めします。

明確にするために、単一のメソッドを持ち、単一のクラスを公開する外部の.Net dllに依存する、テスト目的の小さなサービスを開発しました。サービス契約コード

    [ServiceContract]
    public  interface IMyService
    {
        [OperationContract]
        int Test1(actionType at, calculationType ct, action a);
        [OperationContract]
        int Test2(DataSeries s);
    }

actionTypecalculationType、は、外部dll action内で宣言された列挙型でありDataSeries、dll 内で宣言されたクラスです。

dll 内のクラスの元の定義は、メンバーに対してonly および noでDataSeriesマークされています。[Serializable][DataMember]

私はクライアント側とサーバー側で 3 番目の dll を使用しています。驚いたことに[DataContract]、DataSeries クラスを配置しなくても、クラス[EnumMember]内の列挙型を使用しなくても、両方のアプリケーションが正常に動作していました[DataMember]

それで、何が起こっているのですか?

別の実験:

クライアント側からサードパーティを削除し、サービスをそのまま使用すると、vs2008 が列挙型とDataSeriesクラスを生成し、適切な属性でマークすることがわかりましたか? お気に入り

    [System.CodeDom.Compiler.GeneratedCodeAttribute      ("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="actionType",  Namespace="http://schemas.datacontract.org/2004/07/DBInterface")]
    public enum actionType : int {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        All = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Buy = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Sell = 2,
    }
4

3 に答える 3

1

DataContractDataMember、およびEnumMember属性は、DataContractSerializer (通常はbasicHttpBindingまたはwsHttpBinding ) によって使用されます。TCP バインディング ( netTcpBinding )を使用してエンドポイントを公開する場合は、SerializableAttributeのみが必要です。DataContractSerializer を使用すると、SerializableAttribute のみをクラスに追加でき、すべてのフィールドが自動的にシリアル化されることに注意してください。

次のことをお勧めします。サービスを相互運用できるようにする場合は、basicHttpBinding を使用し、クラスに DataContract 属性と DataMember 属性をマークします。クライアントが .NET アプリケーションの場合は、netTcpBinding を使用し、クラスを SerializableAttribute でマークします。

この投稿を読んで、異なるバインディングを比較することもできます。

于 2009-05-02T13:06:36.873 に答える
0

したがって、私は [DataContract] を使用し、1 つのパラメーターを渡し、データ コントラクトを返します。

これにより、既存のクライアントを壊すことなく、新しいオプションの属性を使用してデータ コントラクトをデータ コントラクトに拡張できるため、柔軟性が向上します。

列挙型もデータ コンタクトを作成します。何も壊さずに列挙型を拡張して、同じことを行うことができ、名前空間を制御できるからです。

[DataContract(Namespace = "http://namespace.mydomain.com/2009/05", Name = "ReferenceTypeData")]
public enum GenderEnum
{
    [EnumMember()]
    Unknown = 0,
    [EnumMember()]
    Male = 1,
    [EnumMember()]
    Female = 2
}

次に、サービス契約をマークする必要があります

[ServiceKnownType(typeof(GenderEnum))]
public interface IServiceContract
{
    ....
}
于 2009-05-02T12:47:32.270 に答える