为什么webservice中的方法返回c#中的Arraylist时发生异常
本文关键字:Arraylist 异常 中的 webservice 方法 返回 为什么 | 更新日期: 2023-09-27 18:27:45
我在web服务中编写返回数组List的方法,当我获得该方法时,它会生成异常。我的方法低于
//Webservice Method
[WebMethod]
public ArrayList ReceiveMessage(string strUser)
{
ArrayList arrList = new ArrayList();
for (int i = 0; i < arrMessage.Count; i++)
{
object[] objArr = (object[])arrMessage[i];
if (objArr[1].ToString() == strUser)
{
arrList.Add(new object[] {objArr[0],objArr[2], objArr[3], objArr[4] });
arrMessage.RemoveAt(i);
break;
}
}
return arrList;
}
//Method from where i am calling webservice method
private void button2_Click(object sender, EventArgs e)
{
ArrayList obj = new ArrayList(objService1.ReceiveMessage("ABC"));
}
调用webservice方法时生成异常的详细信息如下。。。。
System.Web.Services.Protocols.SoapException:服务器无法处理请求。--->System.InvalidOperationException:存在生成XML文档时出错。--->System.InvalidOperationException:类型System.Object[]不能是在此上下文中使用。在System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(字符串name,String ns,Object o,Boolean xsiType)Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(字符串n、 字符串ns,对象o,布尔值isNullable,布尔值needType)Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write6_ReceiveMessageResponse(Object[]p) 位于System.Xml.Serialization.XmlSerializer.Serialize(XmlWriterxmlWriter,对象o,XmlSerializerNamespaces命名空间,字符串encodingStyle,String id)--内部异常堆栈跟踪结束---位于System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter XmlWriter,Object o,XmlSerializerNamespaces命名空间,StringencodingStyle,字符串id)System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter XmlWriter,对象o、XmlSerializerNamespaces命名空间、字符串编码样式)
在System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object[]returnValues,Stream outputStream)System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[]returnValues)System.Web.Services.Protocols.WebServiceHandler.Invoke()--结束内部异常堆栈跟踪--
序列化程序不知道如何处理ArrayList中的底层Object数组。
你可以通过返回一个不同的类型来解决这个问题,比如Generic List,或者用装饰你的方法
[System.Xml.Serialization.XmlInclude(typeof(Object[]))]
这里有一个很好的解释
然而,为了这篇文章的好处,您基本上是在告诉代理生成器类生成,否则它根本不知道要生成什么,然后就会出现异常。
基于此,您的web方法代码可以重写为:
[WebMethod]
[System.Xml.Serialization.XmlInclude(typeof(Object[]))]
public ArrayList ReceiveMessage(string strUser)
{
ArrayList arrList = new ArrayList();
for (int i = 0; i < arrMessage.Count; i++)
{
object[] objArr = (object[])arrMessage[i];
if (objArr[1].ToString() == strUser)
{
arrList.Add(new object[] { objArr[0], objArr[2], objArr[3], objArr[4] });
arrMessage.RemoveAt(i);
break;
}
}
return arrList;
}
如果你可以更新你的代码,最好不要再使用ArrayList
,你可以这样重写你的代码:
[WebMethod]
public List<object> ReceiveMessage(string strUser)
{
List<object> list = new List<object>();
for (int i = 0; i < arrMessage.Count; i++)
{
object[] objArr = (object[])arrMessage[i];
if (objArr[1].ToString() == strUser)
{
list.Add(new object[] { objArr[0], objArr[2], objArr[3], objArr[4] });
arrMessage.RemoveAt(i);
break;
}
}
return list;
}
希望这能有所帮助。