Совместное использование Enum с помощью службы WCF

У меня есть несколько разных приложений, среди которых я хотел бы поделиться перечислением С#. Я не могу понять, как делиться объявлением enum между обычным приложением и службой WCF.

Вот ситуация. У меня есть 2 облегченных приложения для удаления С# и веб-сервис WCF, которым все нужно делиться значениями перечисления.

Клиент 1 имеет

 Method1( MyEnum e, string sUserId );

Клиент 2 имеет

Method2( MyEnum e, string sUserId );

У Webservice есть

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 и другими приложениями?

Ответ 1

Использование общей библиотеки должно быть в порядке. Перечисления сериализуемы и атрибуты DataContract не нужны.

См: http://msdn.microsoft.com/en-us/library/ms731923.aspx

Типы перечислений. Перечисления, включая перечисления флагов, сериализации. Необязательно, типы перечисления могут быть отмечены DataContractAttribute, в этом случае каждый член, который участвует в сериализации, должен быть отмечен Атрибут EnumMemberAttribute

РЕДАКТИРОВАТЬ: Несмотря на это, не должно быть никаких проблем с наличием перечисления, помеченного как DataContract, и с использованием его клиентских библиотек.

Ответ 2

У меня, должно быть, были проблемы с устаревшей ссылкой на службу или что-то в этом роде. Я вернулся и создал общую библиотеку, содержащую перечисление, и все работает нормально. Я просто добавил ссылку на использование файла интерфейса службы.

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]

Ответ 3

У меня была довольно странная проблема и подумал, что это может быть интересно для вас. У меня также были проблемы с тем, что у меня была остановка соединения, когда я использовал перечисления в контракте с моими данными. Мне потребовалось довольно много времени, чтобы выяснить, какова реальная проблема: я использовал перечисления с присвоенными значениями int. Они начинаются с 1 вместо 0. Очевидно, что WCF требует, чтобы для сериализации было значение перечисления, равное 0. Если вы не укажете какие-либо значения в вашем перечислении, будет выполнено автоматическое сопоставление значений значений для вас, начиная с 0, так что все отлично. Но когда вы копируете вставить какое-то другое определение перечисления, в котором значение 0 не назначено, вы не получите это для своего клиента через WCF - странно, но верно!

Ответ 4

вы можете назначить значения int своим членам Enum и просто использовать int для передачи и при необходимости вернуть их обратно в тип Enum