WCF DataContractSerializer не может сериализоваться

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

[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. Это должно быть проблемой сериализатора.


person FlySwat    schedule 28.02.2010    source источник
comment
Это похоже на разницу в версии .NET Framework.   -  person John Saunders    schedule 01.03.2010
comment
О, хорошо, я запускаю 3.5SP1 локально, позвольте мне проверить сервер.   -  person FlySwat    schedule 01.03.2010
comment
Он также работает под управлением 3.5 SP1 :(   -  person FlySwat    schedule 01.03.2010


Ответы (1)


Первый сериализованный вывод (без каких-либо атрибутов пространства имен 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 всегда подхватывался....

person krisragh MSFT    schedule 27.04.2012