web-dev-qa-db-ja.com

列挙型をWCFサービスと共有

C#列挙型を共有したいアプリケーションがいくつかあります。通常のアプリケーションとWCFサービスの間でenum宣言を共有する方法はわかりません。

状況は次のとおりです。列挙値を共有する必要がある2つの軽量C#停止アプリとWCF Webサービスがあります。

クライアント1は

 Method1( MyEnum e, string sUserId );

クライアント2は

Method2( MyEnum e, string sUserId );

Webサービスには

ServiceMethod1( MyEnum e, string sUserId, string sSomeData);

私の最初は、Common.dllというライブラリを作成して列挙をカプセル化し、列挙が必要なすべてのプロジェクトでそのライブラリを参照するだけでした。ただし、WCFは列挙型をマークアップしてサービスの不可欠な部分にする必要があるため、事態を難しくします。このような:

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };  

だから.... WCFサービスと他のアプリケーション間でenumを共有する方法はありますか?

49
Keith G

共通ライブラリを使用しても問題ありません。列挙はシリアル化可能であり、DataContract属性は必要ありません。

参照: http://msdn.Microsoft.com/en-us/library/ms731923.aspx

列挙型。フラグ列挙を含む列挙はシリアル化可能です。オプションで、列挙型はDataContractAttribute属性でマークできます。この場合、シリアル化に参加するすべてのメンバーはEnumMemberAttribute属性でマークする必要があります

編集:たとえそうであっても、列挙型をDataContractとしてマークし、それを使用するクライアントライブラリを持つことに問題はないはずです。

46
Szymon Rozga

時代遅れのサービス参照などで問題が発生したはずです。私は戻って、列挙型を含む共通ライブラリを作成しましたが、すべて正常に動作します。サービスインターフェイスのファイルへのusing参照を追加しました。

using Common;  

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

そして、私は以下を落としました:

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };

列挙型はServiceKnownTypeを介して参照されるため、[DataContract]または[Enumerator]を使用して外部ライブラリでマークアップする必要はなかったと思います

34
Keith G

私は非常に奇妙な問題を抱えていて、それはあなたにとって興味深いかもしれないと思った。データコントラクトで列挙型を使用すると、接続が停止するという問題もありました。実際の問題が何であるかを見つけるのにかなり時間がかかりました。int値が割り当てられた列挙型を使用しました。それらは0ではなく1から始まりました。明らかに、WCFでは、シリアル化のために0に等しい列挙値が必要です。列挙内に値を指定しない場合、0から始まる自動int値マッピングが行われるため、すべて問題ありません。しかし、0値が割り当てられていない他の列挙定義をコピーして貼り付けると、WCFを介してクライアントに取得されません-奇妙ですが本当です!

32
Pilsator

int値をEnumメンバーに割り当て、転送にintを使用し、必要に応じてそれらをEnum型にキャストできます。