从WCF服务返回类型化DataSet导致找不到'xs:string'

时间:2011-03-15 18:20:14

标签: c# xml wcf

考虑通过WCF公开服务的服务器。其中一个OperationContract返回一个名为TraceDataSet的类型化DataSet,其中包含服务器上跟踪的快照。

返回数据集时,方法ReadXml中自定义Visual Studio工具生成文件中发生的ReadXmlSerializable会抛出

  

未定义的数据类型:'xs:string'。

我在客户端和服务器上添加了WCF跟踪,但WCF通信工作正常。

我做了一些研究,但没有任何结论,我也从MSDN论坛得到404错误。

我检查了XmlReader后面的流,它确实包含xmlns:xs命名空间的声明,所以我在那里有点困惑。

如果我将DataSet序列化到服务器上的文件(在本地运行以进行调试)并且我从客户端读取该文件,它确实有效,所以我怀疑通过WCF通信发生了某些事情,即使它没有失败。

类型化DataSet在共享程序集中声明,该程序集由客户端和服务器引用。我们没有使用/ References文件夹中由代理创建的重新生成的DataSet。

直到最近,我们从未对跟踪产生过任何问题,遗憾的是,我们无法指出导致此功能崩溃的变化。

是否有人知道为什么ReadXml无法找到xs:string数据类型?

4 个答案:

答案 0 :(得分:0)

我在论坛和其他网站上搜索,我发现这似乎是System.Data中某些环境中序列化的一个错误。我不知道如何修复这个bug,但我发现了一个工作:

将数据集放在一个字符串中(在traceData上使用getXml()),并将其发送到客户端。客户端收到字符串并重建数据集。这不是一个修复,但它是一个解决方法,它适用于我。

答案 1 :(得分:0)

使用不会导致特定数据类型的SQL语句时遇到同样的错误,例如:

SELECT SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS CurrentMachineName

我通过SQL查询更改为指定我想要的数据类型,例如:

SELECT CAST(SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS varchar(255)) AS CurrentMachineName

并且纠正了这个问题。现在,数据集被赋予了特定的数据类型,而不是通用的" anytype"它在XML中被翻译为xs:string。

答案 2 :(得分:0)

我遇到了同样的问题。问题是,DataSet中的某些表将列的属性 DataType 设置为Object类型。该类型不可序列化。

在所有表的所有列中检查 DataType 属性的值(如果它是可序列化的)。如果没有,请将其更改为可序列化类型或删除这些列。这应该可以解决问题。

答案 3 :(得分:-1)

我可能错了,但我不认为WCF支持DataSet。每当我使用WCF时,我只使用POCO类。我想你想要将数据复制到Trace类,然后返回一个Trace对象数组。