在Visual Studio 2003中使用wcf Web服务存在可空值的问题

时间:2009-09-07 09:59:36

标签: c# .net wcf asmx

我已经使用VS2008编写了一个Web服务 在VS2003中添加了对该服务的引用之后,我遇到了一个调用返回可以为null的值的方法的问题,比如int? 如果我用一个值填充该领域,问题就解决了。 有没有其他方法可以解决这个问题?

更多信息

请从我自己的代码中查看这些摘录:

public RevolverFund[] RetrieveRevolverFundList(int accountSetupOrganId, [System.Xml.Serialization.XmlIgnoreAttribute()] bool accountSetupOrganIdSpecified) 
{
    object[] results =  this.Invoke("RetrieveRevolverFundList", new object[] 
                                                                {
                                                                      accountSetupOrganId,
                                                                      accountSetupOrganIdSpecified
                                                                });
    return ((RevolverFund[])(results[0]));
}

当我将Web引用添加到我的解决方案时,它是由VS2003自动生成的。 这些代码行位于'Reference.cs'文件中。 RevolverFundView是一个具有一些可空属性的类 例外情况“XML文档中存在错误(1,481)。”每当调用'Invoke'方法时抛出。

顺便说一句,这里是RevolverFundClass的声明

public class RevolverFund {

    [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
    public string Comment;

    public int EmployeeCode;

    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool EmployeeCodeSpecified;

    public int Id;

    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool IdSpecified;

    public int OrganId;

    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool OrganIdSpecified;
}

in 'RevolverFund' class , 'EmployeeCode' and 'OrganId' properties are declared as 'Nullable Int's

**and here is The RevolverFund class difinition In VS2008**


    [DataContract]
    public class RevolverFund
    {
        private Int32 m_Id;
        [DataMember]
        public Int32 Id
        {
            get { return m_Id; }
            set { m_Id = value; }
        }

        private Int32? m_EmployeeCode;
        [DataMember]
        public Int32? EmployeeCode
        {
            get { return m_EmployeeCode; }
            set { m_EmployeeCode = value; }
        }

        private Int32? m_OrganId;
        [DataMember]
        public Int32? OrganId
        {
            get { return m_OrganId; }
            set { m_OrganId = value; }
        }

        private String m_Comment;
        [DataMember]
        public String Comment
        {
            get { return m_Comment; }
            set { m_Comment = value; }
        }
  }

3 个答案:

答案 0 :(得分:1)

Documentation on MSDN开始,当编译框/ unboxes为Nullable时,底层类型为boxed / unboxed,而不是对象。这意味着如果您尚未设置任何值(即HasValue属性为false),则可能会返回null值。这是一个灾难性的错误 - 'null'不是'int' - 会抛出InvalidOperationException(参见docs)

答案 1 :(得分:0)

您最近是否将网络服务从int更改为int??如果是这样,请在VS2003服务中更新您的Web引用,然后重试。您应该检查VS2003实例所期望的返回类型是int?而不是int

我们有大量的web服务可以通过可空的整数 - 这是可能的

答案 2 :(得分:0)

在你的ResolverFund类中,'EmployeeCode'和'OrganId'不可为空 - 它们只是普通的int。使它们可以为空,需要定义为

public int? EmployeeCode;
public int? OrganId;

public Nullable<int> EmployeeCode;
public Nullable<int> OrganId;

完成后,您必须从其他项目中刷新Web引用,然后才能正常工作