Perché si è verificata un’eccezione quando il metodo in webservice restituisce Arraylist in c #?

scrivo il metodo nel servizio web restituendo l’elenco di array e quando ottengo quel metodo genera un’eccezione. Il mio metodo è sotto

//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")); } 

Il dettaglio dell’eccezione genera quando il metodo webservice di chiamata è inferiore a ….

System.Web.Services.Protocols.SoapException: il server non è stato in grado di elaborare la richiesta. —> System.InvalidOperationException: si è verificato un errore durante la generazione del documento XML. —> System.InvalidOperationException: il tipo System.Object [] non può essere utilizzato in questo contesto. a System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive (Nome stringa, String ns, Oggetto o, xeiTipo booleano) in Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object (String n, String ns, Object o, Boolean isNullable, Boolean needType ) in Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write6_ReceiveMessageResponse (Object [] p) in System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespace, String encodingStyle, String id) — Fine di traccia dello stack di eccezione interna — su System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespace, String encodingStyle, String id) su System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespace, String encodingStyle)
su System.Web.Services.Protocols.SoapServerProtocol.WriteReturns (Object [] returnValues, Stream outputStream) su System.Web.Services.Protocols.WebServiceHandler.WriteReturns (Object [] returnValues) su System.Web.Services.Protocols.WebServiceHandler. Invoke () — Fine della traccia dello stack di eccezioni interne —

Il serializzatore non sa cosa fare con l’array Object sottostante all’interno di ArrayList.

Puoi risolvere questo problema restituendo un tipo diverso, ad esempio un Elenco generico o decorando il tuo metodo con:

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

C’è una buona spiegazione qui

comunque a beneficio di questo post stai dicendo al generatore di proxy il tipo di classi da generare altrimenti semplicemente non sa cosa generare e ottieni quell’eccezione.

in base a questo il tuo codice webmethod può essere riscritto come:

 [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; } 

Se puoi aggiornare il tuo codice al meglio per non utilizzare più ArrayList puoi riscrivere il tuo codice in questo modo:

 [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; } 

Spero che questo ti aiuti.