Использование enum в сервисе WCF - PullRequest
1 голос
/ 06 мая 2011

У меня есть веб-сервис WCF, написанный на c # У меня есть перечисление

[DataContract(Namespace = "NameSpace")]
public enum State
{
        [EnumMember]
        NotAvailable = 1,
        [EnumMember]
        RunningTests = 3,
        [EnumMember]
        ReadyForTests = 4,
        [EnumMember]
        HungOrBroken = 5
}

Затем я запускаю следующие команды для генерации файлов .h, .cpp, которые я могу использовать в своем приложении MFC.

svcutil.exe /t:metadata <webservice dll>
WSUtil.exe /prefix:Ws *.wsdl *.xsd

Приведенные выше команды генерируют файлы, которые имеют:

typedef enum WsState
{
    WsStateHungOrBroken = 0,
    WsStateNotAvailable = 1,
    WsStateReadyForTests = 2,
    WsStateRunningTests = 3,
}

Я понимаю, почему значения перечисления не совпадают точно ( info ). Все работает, как и ожидалось, за исключением того, что когда я передаю WsStateHungOrBroken веб-службе, он не может правильно интерпретировать его и просто конвертировать в 0. Это действительно должно быть 5, как это определено в веб-службе.

Если кто-нибудь может объяснить мне, почему это так или как я могу отлаживать дальше, это было бы полезно. Как примечание, я попробовал SvcTraceViewer, но не смог выяснить, какие данные передаются между службой и моим приложением.

Редактировать : найдено решение на http://thorarin.net/blog/post/2010/08/08/Controlling-WSDL-minOccurs-with-WCF.aspx#comment По умолчанию все параметры метода WCF имеют IsRequired = False, а когда значение enum равно 0, WCF рассматривает это как пустое значение и вообще не передает его службе, а служба использует значение по умолчанию. Выполнение всех необходимых параметров устраняет проблему.

1 Ответ

1 голос
/ 06 мая 2011

Сама ссылка , которую вы указали, говорит вам, почему это происходит.Числовые значения enum не сохраняются.Поскольку HungOrBroken является первым в алфавитном порядке, он будет иметь значение 0 на стороне клиента.

Это именно то, что вы отправили в своем вопросе.

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