"Использование типа.. не поддерживается с 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.

Другие вопросы по тегам