为什么在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
希望这可以帮助。