为什么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()--结束内部异常堆栈跟踪--

为什么webservice中的方法返回c#中的Arraylist时发生异常

序列化程序不知道如何处理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;
}

希望这能有所帮助。