2010-02-28 62 views
0

我有一個簡單的服務,如: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

回答

0

第一序列輸出(無任何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的總是被拾起....