Совместное использование Enum с сервисом WCF - PullRequest
49 голосов
/ 09 октября 2008

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

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

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

 Method1( MyEnum e, string sUserId );

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

Method2( MyEnum e, string sUserId );

Веб-сервис имеет

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

Сначала я создал библиотеку Common.dll для инкапсуляции enum, а затем просто ссылался на эту библиотеку во всех проектах, где требуется enum. Однако 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 и других приложений?

Ответы [ 4 ]

46 голосов
/ 09 октября 2008

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

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

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

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

34 голосов
/ 10 октября 2008

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

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]

32 голосов
/ 30 июля 2010

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

0 голосов
/ 09 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...