如何在Web服务中维护集合类型(使用Web引用而不是服务引用)

时间:2013-08-21 07:48:40

标签: c# wcf web-services

我目前正在将HttpListener应用程序转换为WCF Web服务。 Web服务将由运行.NETCF 2.0的Windows CE 5.0客户端使用。我已经通过Web引用(而不是服务引用)完成了这项工作。在这里值得一提的是,我无法将框架版本从2.0升级到3.0或3.5。

我遇到的问题是我有多个包含List属性的类(如下所示)

[Serializable]
[XmlRoot]
public class Products
{
    public Products()
    {
        Items = new List<Product>();
        Errors = new List<Error>();
    }

    [XmlElement]
    public List<Product> Items
    { get; set; }

    [XmlElement]
    public List<Error> Errors
    { get; set; }

    [XmlElement]
    public long DeviceId
    { get; set; }

    [XmlElement]
    public User UserId
    { get; set; }

    [XmlElement]
    public long UserColour
    { get; set; }
}

当此属性通过Web引用传递时,List将成为一个数组(如下所示)

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://server-path/Service.svc")]
public partial class Products {

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Items")]
    public Product[] Items;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Errors")]
    public Error[] Errors;

    /// <remarks/>
    public long DeviceId;

    /// <remarks/>
    public User UserId;

    /// <remarks/>
    public long UserColour;
}

我知道使用服务引用可以更改通过服务传递的集合的集合类型,但是我不知道如何使用Web引用实现此目的。

我见过许多其他类似的问题,例如thisthis,但通常的解决方案是使用服务参考,我无法使用。

有没有办法可以在整个Web服务中维护集合类型,或者我可以实现客户端的解决方法?

谢谢, 海登

2 个答案:

答案 0 :(得分:0)

AFAIK你不能。 Web引用不允许列表

但是,如果将其更改为服务引用,则可以通过转到属性并指定要使用的集合类型来执行此操作。

答案 1 :(得分:0)

假设无法通过添加Web Reference来实现。 XmlSerializer将所有集合转换为数组,你无法避免。这是WCF的数据包含的一个特性,用于指定生成的代理集合的类型,但只有在使用svcutil添加服务引用时才可用。假设您唯一能做的就是用手编辑ypur合约,并指定正确的集合而不是数组。

相关问题