Совместное использование 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