为什么Web服务中的方法在C#中返回Arraylist时会发生异常? [英] Why Exception occured when method in webservice return Arraylist in c#?

查看:35
本文介绍了为什么Web服务中的方法在C#中返回Arraylist时会发生异常?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在返回数组列表的Web服务中写入方法,当我得到该方法时,它将生成异常.我的方法在下面

i write method in web service returning array List and when i get that method it generate exception. My method is below

   //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方法时会生成异常的详细信息.

Detail of Exception generate when call webservice method is below....

System.Web.Services.Protocols.SoapException:服务器无法执行处理请求.---> System.InvalidOperationException:有一个生成XML文档时出错.--->System.InvalidOperationException:类型System.Object []可能不是在此上下文中使用.在System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String名称,字符串ns,对象o,布尔值xsiType)位于Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(Stringn,字符串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,对象o,XmlSerializerNamespaces命名空间,字符串encodingStyle,字符串ID)位于System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter,对象o,XmlSerializerNamespaces命名空间,字符串encodingStyle)
在System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object []returnValues,流outputStream)位于System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object []returnValues)System.Web.Services.Protocols.WebServiceHandler.Invoke()---结束内部异常堆栈跟踪---

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type System.Object[] may not be used in this context. 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) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write6_ReceiveMessageResponse(Object[] p) at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) --- End of inner exception stack trace --- at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle)
at System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream) at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues) at System.Web.Services.Protocols.WebServiceHandler.Invoke() --- End of inner exception stack trace ---

推荐答案

序列化器不知道如何处理ArrayList中的基础Object数组.

The serializer doesn't know what to do with the underlying Object array inside the ArrayList.

您可以通过返回不同的类型(例如通用列表)或用以下方法修饰您的方法来解决此问题:

You can fix this by returning a different type, say a Generic List or by decorating your method with:

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

此处

不过,对于本文的好处,您基本上是在告诉代理生成器的类型要生成的类,否则它根本不知道生成什么,而您会得到该异常.

however for the benefit of this post you are basically telling the proxy generator the type of classes to generate otherwise it simply does not know what to generate and you get that exception.

基于此,您的网络方法代码可以重写为:

based on this your webmethod code can be rewritten as:

[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 ,则可以这样重写代码:

If you can update your code its best not to use ArrayList anymore you could rewrite your code like this:

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

希望这会有所帮助.

这篇关于为什么Web服务中的方法在C#中返回Arraylist时会发生异常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆