WCF DataContractSerializer не может сериализоваться - PullRequest
0 голосов
/ 28 февраля 2010

У меня есть прямой сервис, такой как:

[ServiceContract]
public interface IService
{
        [WebGet(UriTemplate = "/", ResponseFormat = WebMessageFormat.Xml)]        
        [OperationContract]
        List<DataContracts.MyThing> Get();
}

Мой сбор данных прямой, ничего необычного там нет:

[DataContract]
public class MyThing 
{
    [DataMember]
    public string ID { get; set;}
}

Я использую WebServiceHostFactory вместо ручной привязки.

Когда я запускаю это на IIS 5.1 (Windows XP, моя локальная среда разработки), я получаю следующее сообщение:

<ArrayOfMyThing>
    <MyThing></MyThing>
</ArrayOfMyThing>

Однако, когда я отбрасываю точно такой же код на IIS 6.0 впроизводственная коробка, я получаю ответ вроде:

<ArrayOfMyThing 
    xmlns="http://schemas.datacontract.org/2004/07/My.NameSpace.DataContracts"  
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"http://my.website.com/services/>
</ArrayOfMyThing>

Итак, мой вопрос двоякий:

  1. Почему он не обслуживает пространства имен в моей локальной среде разработки?
  2. Почему он создает плохой XML, добавляя базовый путь к службе внутри тега?

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

РЕДАКТИРОВАТЬ: Когда я использую JSON, все выглядит хорошо, поэтому я не думаю, что этоэто проблема с WCF.Это должна быть проблема с сериализатором.

1 Ответ

0 голосов
/ 27 апреля 2012

Первый сериализованный вывод (без каких-либо атрибутов пространства имен XML) - это вывод, который вы получите, если будете использовать XmlSerializer вместо DataContractSerializer. Моя гипотеза заключается в том, что XmlSerializer выбирается в качестве предпочтительного сериализатора в вашей конфигурации IIS 5.1. Отличается ли конфигурация между вашими пакетами IIS 5.1 и IIS 6.0? Отличается ли какой-либо из ваших контрактов? Можете ли вы искать «XmlSerializer» во всей вашей кодовой базе и настройках, чтобы убедиться, что вы случайно не взяли его где-нибудь? (Например, у вас может быть случайно подключен [XmlSerializerFormat] или [XmlSerializerOperationBehavior] где-то где-то случайно.) В WebServiceHostFactory также может быть параметр, который отличается в реализациях IIS 5.1 и IIS 6.0, что приводит к проблеме.

С вашей реализацией IIS 6.0 вы получите тот же результат, что и при использовании DataContractSerializer. Если вы в порядке с выводом IIS 5.1, но не в порядке с выводом IIS 6.0, то вы можете явно декорировать свои операции или службу с помощью [XmlSerializerFormat], так что XmlSerializer всегда будет подхвачен ....

...