我已经使用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; }
}
}
答案 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引用,然后才能正常工作