Проблема DataContract в WCF - PullRequest
       19

Проблема DataContract в WCF

2 голосов
/ 13 июня 2009

Предположим, у меня есть метод и тип возвращаемого значения - enum, мой вопрос: должен ли я объявить перечисление как DataContract или нет?

Примеры, например, в примере OrderStatus является типом данных enum,

OrderStatus Poll(string queryID);

Должен ли я объявить тип перечисления OrderStatus как DataContract?

спасибо заранее, George

Ответы [ 5 ]

4 голосов
/ 13 июня 2009

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

Кроме того, существует атрибут [EnumMember], который позволяет вам выбирать, какие значения перечисления вы хотите раскрыть в своем контракте, если вы по какой-то причине не хотите показывать их все.

4 голосов
/ 14 июня 2009

Единственное время, когда вам нужно добавить [EnumMember] и т. Д. В перечисление, если:

  • Вы не хотите, чтобы они все были разоблачены (см. Ответ Pwninstein)
  • Вы хотите изменить текст на проводе по причинам совместимости (установите Value).

MSDN имеет пример последнего.

3 голосов
/ 02 июля 2009

Если вы хотите опубликовать свой wsdl с правильными пространствами имен xsd, вы можете сделать это только с помощью атрибута DataContract для перечисления.

, например

[Datacontract(Namespace="http://company/xsd/service/2009/07/03"]
public enum Status
{
[EnumMember]
ERROR = 1,
[EnumMember]
GOOD = 2,
}

В противном случае пространство имен по умолчанию используется в wsdl. Для корпоративного веб-сервиса вы, возможно, захотите иметь правильное пространство имен и контроль версий для своих схем wsdl. Кроме того, используя атрибут EnumMember, вы можете отказаться от публикации всех значений перечисления, как указано выше.

1 голос
/ 26 февраля 2011

Когда вы просите документ в своем комментарии к ответу Pwninstein, я поставлю его здесь.

http://msdn.microsoft.com/en-us/library/aa347875.aspx

Там написано (в разделе простых перечислений):

Вы также можете сериализовать типы перечисления, к которым атрибут DataContractAttribute не был применен. Такие типы перечисления обрабатываются точно так же, как описано ранее, за исключением того, что каждый член (к которому не применен атрибут NonSerializedAttribute) обрабатывается так, как если бы был применен атрибут EnumMemberAttribute.

Надеюсь, это поможет: D

1 голос
/ 13 июня 2009

Мне не нужно было отвечать на этот вопрос раньше, но кажется, что вы могли бы найти ответ сами, создав простой тестовый проект и попробовав его в обоих направлениях. Выберите метод, который дает вам необходимые результаты. (Ваш пост на самом деле не указывает на цель, поэтому все равно сложно ответить на вопрос.)

...