为什么在webservice中的方法在c#中返回Arraylist时发生exception?

我在Web服务中写入方法返回数组列表,当我得到该方法时,它会生成exception。 我的方法如下

//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方法在下面时生成Exception的详细信息….

System.Web.Services.Protocols.SoapException:服务器无法处理请求。 —> System.InvalidOperationException:生成XML文档时出错。 —> System.InvalidOperationException:类型System.Object []可能不在此上下文中使用。 at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name,String ns,Object o,Boolean xsiType)at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n,String ns,Object o,Boolean isNullable,Boolean needType )在System.Xml.Serialization.XmlSerializer.Serialize的Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write6_ReceiveMessageResponse(Object [] p)中(XmlWriter xmlWriter,Object o,XmlSerializerNamespaces名称空间,String encodingStyle,String id)—结束内部exception堆栈跟踪— System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter,Object o,XmlSerializerNamespaces名称空间,String encodingStyle,String id)在System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter,Object o, XmlSerializerNamespaces名称空间,String encodingStyle)
at System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object [] returnValues,Stream outputStream),位于System.Web.Services.Protocols.WebServiceHandler的System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object [] returnValues)。 Invoke()—内部exception堆栈跟踪结束—

序列化程序不知道如何处理ArrayList中的底层Object数组。

您可以通过返回其他类型(例如通用列表)或通过使用以下方法修改方法来解决此问题:

 [System.Xml.Serialization.XmlInclude(typeof(Object[]))] 

这里有一个很好的解释

然而,为了这篇文章的好处,你基本上告诉代理生成器要生成的类的类型,否则它根本不知道要生成什么,你得到该exception。

基于此,您的webmethod代码可以重写为:

 [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 ReceiveMessage(string strUser) { List list = new List(); 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; } 

希望这可以帮助。