0

我有一个直截了当的服务,例如:

[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 的问题。它必须是一个序列化程序问题。

4

1 回答 1

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 始终被拾取....

于 2012-04-27T13:34:10.070 回答