【问题标题】:SOAP exception in WPF Application while accessing Web Service访问 Web 服务时 WPF 应用程序中的 SOAP 异常
【发布时间】:2017-01-16 07:07:50
【问题描述】:

我正在学习 C#,在其中一项作业中,我必须在使用 WPF 应用程序和 Web 参考单击按钮时将 Access 文件中的数据显示到 DataGrid 中。

有一个我无法解决的 SOAP 异常,感谢任何帮助,在此先感谢 -

Web 参考 asmx 文件包含以下方法,在按钮单击时调用 -

[WebMethod]
    public ArrayList queryDB()
    {
        string selectStmt = "select * from Students";
        OleDbConnection conn_obj = new DBConnect().checkDBStatus(databaseLocation);
        conn_obj.Open();

        OleDbCommand query = new OleDbCommand(selectStmt, conn_obj);
        OleDbDataReader dbReader = query.ExecuteReader();

        ArrayList dbRecordList = new ArrayList();

        foreach (DbDataRecord dbRecord in dbReader)
        {
            dbRecordList.Add(dbRecord);
        }

        conn_obj.Close();
        return dbRecordList;
    }

WPF文件代码如下-“按钮点击方法”

    private void GetData_Click(object sender, RoutedEventArgs e)
    {
        ArrayList datagridList = (ArrayList) websrvc.queryDB();
        dataGrid.ItemsSource = datagridList;
    }

上面的代码正在创建一个错误 - 无法将类型'object[]'隐式转换为'System.Collections.ArrayList'

因此根据网络上的建议,将代码更改如下 -

private void GetData_Click(object sender, RoutedEventArgs e)
    {
        object obj = websrvc.queryDB();
        ArrayList datagridList = (ArrayList) obj;
        dataGrid.ItemsSource = datagridList;
    }

现在,似乎没有错误,但下面的代码行出现异常,我无法解决 -

object obj = websrvc.queryDB();

{"System.Web.Services.Protocols.SoapException: 服务器无法处理请求。---> System.InvalidOperationException: 生成 XML 文档时出错。---> System.InvalidOperationException: System.Data .Common.DataRecordInternal 无法序列化,因为它没有无参数构造函数。\n 在 System.Xml.Serialization.TypeDesc.CheckSupported()\n 在 System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)\n 在 System.Xml.Serialization.XmlSerializationWriter.CreateUnknownTypeException(Type type)\n 在 System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType)\n 在 Microsoft .Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)\n 在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write2_queryDBResponse(Objec t[] p)\n 在 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer1.Serialize(Object objectToSerialize, XmlSerializationWriter writer)\n 在 System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle , String id)\n --- 内部异常堆栈跟踪结束 ---\n 在 System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)\n 在 System .Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)\n 在 System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)\n 在 System.Web.Services.Protocols。 WebServiceHandler.Invoke()\n --- 内部异常堆栈跟踪结束 ---"}

【问题讨论】:

  • 我认为您在这里查看了错误的异常。重要的似乎是System.Data.Common.DataRecordInternal cannot be serialized because it does not have a parameterless constructor。这基本上意味着您尝试序列化的某些类使用DataRecordInternal,它没有无参数构造函数,因此无法序列化。您需要将数据保存在不同的(自制)类中。
  • dataGrid.ItemsSource = websrvc.queryDB(); 怎么样?
  • 我认为您的解决方案已经在这里了:stackoverflow.com/questions/26546339/…

标签: c# asp.net wpf web-reference


【解决方案1】:
  1. 在 Web 服务端创建一个名为 Student 的类,其中包含您要发送给客户端的所有属性。
  2. 将此类标记为可序列化。
  3. 将 DB 对象属性一一映射到此 Student 类。
  4. 从服务中,不返回 ArrayList,而是返回 ArrayList();

让我知道这是否有效。

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多