WCF的DataContractSerializer无法序列化

问题描述:

我有一个简单的服务,如:WCF的DataContractSerializer无法序列化

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

我datacontract是straightfoward,没有什么不寻常有:

[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. 我本地developm为什么不服务的命名空间环境?
  2. 为什么它通过将标准路径附加到标签内的服务来创建不好的XML?

很明显,坏的XML节点会破坏任何解析器,所以这对我来说绝对没用。奇怪的是,这只发生在特定的服务方法上,所有其他服务方式都正常工作,并且配置方式相同。

编辑:当我使用JSON,一切看起来都不错,所以我不认为这是WCF的问题。它必须是一个串行器问题。

+0

这看起来在.NET Framework版本中有所不同。 – 2010-02-28 21:07:14

+0

哦,好点,我在本地运行3.5SP1,让我检查服务器。 – FlySwat 2010-02-28 21:08:07

+0

它也运行3.5 SP1 :( – FlySwat 2010-02-28 21:11:07

第一序列输出(无任何XML命名空间属性)是,如果你使用的XmlSerializer而不是DataContractSerializer的你会得到输出。我的假设是XmlSerializer在IIS 5.1配置中被选为串行器。您的IIS 5.1和IIS 6.0软件包的配置有所不同吗?你的任何合同有什么不同?你可以在你的整个代码库和设置中搜索“XmlSerializer”,以确保你不会意外地把它放在某个地方吗? (例如,您可能会意外地将[XmlSerializerFormat]或[XmlSerializerOperationBehavior]插入到某处)。在导致此问题的IIS 5.1和IIS 6.0实现之间,WebServiceHostFactory上的设置也可能不同。

随着你的IIS 6.0的实现,你得到的输出是如果你使用的DataContractSerializer你会得到什么。如果你是与IIS 5.1输出,但不正常与IIS 6.0输出OK,你可以做的是装饰你的业务或[XmlSerializerFormat]您服务明确,使XmlSerializer的总是被拾起....