"Использование типа.. не поддерживается с NetDataContractSerializer" - почему используется NetDataContractSerializer?
Эта ошибка вызвана тем, что используется NetDataContractSerializer (NetDCS), но эталонная сборка не является общей и включена в клиент. Этот вопрос не об этом.
Этот вопрос о предотвращении использования NetDataContractSerializer; или, по крайней мере, выяснить, почему он используется клиентом.
Почему клиент использует NetDCS, если я не настроил его для этого?
Согласно статьям / постам, я обнаружил, что это явный шаг; Я не включил это вручную для проекта или клиента WCF - есть ли где-нибудь переопределение машины / фреймворка?
Могу ли я заставить клиента использовать обычный DataContractSerializer (DCS)?
Если да, могу ли я форсировать это для каждого типа или пространства имен? Базовая структура "базовые типы" уже находится в сборке, на которую ссылаются; в идеале я мог бы разрешить эти проблемы с помощью NetDCS, но я бы отказался от NetDCS, чтобы "исправить" эту проблему.
Если нет, существуют ли какие-либо более радикальные меры, такие как изменение XML ответа / ответов?
(Я прекрасно добавляю вручную все необходимые средства разрешения контрактов и работаю с искаженными сгенерированными именами.)
Использование тестового клиента WCF (который всегда использует DCS?) "Работает нормально", что заставляет меня поверить, что текущая проблема связана с десериализацией NetDCS, возникающей при использовании сервиса из проекта. Возможно, я неправильно понимаю, как работает тестовый клиент WCF.
Вот сообщение об ошибке (которое может быть устранено путем добавления эталонных сборок для NetDCS, но я не хочу этого делать), чтобы убедиться, что я не неправильно понял проблему. Я на 95% уверен, что речь идет о десериализации в клиенте.
Форматировщик выдал исключение при попытке десериализации сообщения.
Использование типа ".." в качестве коллекции только для получения не поддерживается в NetDataContractSerializer. Попробуйте пометить тип атрибутом CollectionDataContractAttribute или атрибутом SerializableAttribute или добавить установщик в свойство. '
И резюме стека:
Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ref ProxyRpc rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService
Конфигурация клиента WCF - это "простая" конфигурация по умолчанию, и нет кода, который изменяет поведение во время выполнения.
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_myServiceBinding" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="endPoint.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_myServiceBinding"
contract="MyServive.IMyServiceEndPoint" name="BasicHttpBinding_serviceEndPoint" />
</client>
</system.serviceModel>
Ссылка на сервис генерируется в VS 2013, и цели проекта.NET 4. Проект со ссылкой на сервис и тестовый проект являются простыми библиотеками классов - т.е. они не размещены в IIS.
1 ответ
Вы можете применить XmlSerializerFormatAttribute ( http://msdn.microsoft.com/en-us/library/system.servicemodel.xmlserializerformatattribute.aspx), чтобы заставить ваш класс использовать сериализатор XML.