У меня есть веб-сервис 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 рассматривает это как пустое значение и вообще не передает его службе, а служба использует значение по умолчанию. Выполнение всех необходимых параметров устраняет проблему.