WCF DataContractSerializer无法序列化

时间:2010-02-28 20:44:46

标签: 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?
  3. 显然,错误的XML节点会破坏任何解析器,所以这对我来说绝对没用。奇怪的是,这只发生在特定的服务方法上,所有其他方法都运行正常,并且配置方式相同。

    编辑:当我使用JSON时,一切看起来都不错,所以我不认为这是WCF的问题。它必须是序列化问题。

1 个答案:

答案 0 :(得分:0)

第一个序列化输出(没有任何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 ....