При отправке перечислений через WCF отправляется строковое представление значения перечисления, а не числовое значение. Это позволяет обеим сторонам отображать одну и ту же метку перечисления на разные номера.
Если отправлена метка, непонятная получателю, канал будет закрыт. Я полагаю, что это распространяется на значения для перечислений, которые не определены (к которым, похоже, вы обращаетесь).
Таким образом, только то, что метка enum действительна на стороне отправителя, не означает, что клиент обязательно это поймет.
Используете ли вы одно и то же определение класса для отправителя и получателя?
Чтобы продолжить отладку этой проблемы, вы должны включить трассировку службы на клиенте и сервере (это верно для многих проблем с WCF. Это поможет вам определить источник проблемы, если в противном случае у вас нет никаких указаний.
Добавьте следующий XML-файл в файл App.config (как на клиенте, так и на сервере):
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "WcfTrace.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>
Есть несколько опций для этой конфигурации .
После добавления этой конфигурации вы создадите файл .svclog
, который можно просмотреть с помощью Service Trace Viewer Tool . Этот журнал содержит много информации обо всем, что происходит, включая предупреждения и ошибки.
Обратите внимание, что сгенерированные файлы журналов могут быть довольно большими, поэтому обязательно удалите или закомментируйте этот раздел конфигурации после завершения отладки.
Обратите внимание, что вы можете указать различные строковые значения для элементов enum, которые будут использоваться в проводе.
Например, следующие два перечисления эквивалентны WCF:
public enum CarCondition
{
New,
Used,
Rental,
[NonSerialized]
Lost
}
[DataContract(Name = "CarCondition")]
public enum CarConditionWithDifferentNames
{
[EnumMember(Value = "New")]
BrandNew,
[EnumMember(Value = "Used")]
PreviouslyOwned,
[EnumMember]
Rental
}
Вы можете прочитать более подробную информацию об использовании перечислений поверх WCF здесь .