所以我正在开发一个使用MySQL
数据库并对其进行读/写的客户端 - 服务器应用程序。一切都运行得很好,直到我将以下方法添加到interface
的{{1}}。
WCF Service
将此添加到服务合同时,scvutil.exe将失败并指出服务器由于内部错误而无法处理请求。
现在我已经阅读了这个问题:Issue while returning Dataset through WCF Service我很好奇它与我的问题有多紧密相关。我知道返回[OperationContract]
List<MySqlDataAdapter> ShowTables();
不是要走的路,但是究竟是什么导致了这个错误以及将这些信息返回给客户端的可行方法是什么?
感谢您的时间,考虑和帮助。
答案 0 :(得分:1)
要回答您的问题,转换器很可能无法将MySqlDataAdapter成功转换为正确(可怕的钝)XML对象。即使你可能不想使用它,处理数据的性能也不会扩展(并且可能无法达到可接受的标准),除了.NET之外的其他任何东西都不能使用它并且会直接绑定您的UI层到数据库对象及其实现。这对WCF来说不是一个好的开始。
我不确定ShowTables中会出现什么样的数据,但最好的替代方法是创建一个实体,您可以将MySqlDataAdapter中的数据转换为可以正确序列化以供客户端使用的实体。 / p>
例如:
如果您有简单的表格数据:
TableEntity : BaseEntity
{
string TableName { get; set; }
List<TableDataEntity> Data { get; set; }
TableEntity(MySqlDataAdapter dataAdapter)
{
//convert dataAdapter into TableEntity properties
}
}
BaseEntity是可选的,只允许使用公共属性。您的操作将更改为:
[OperationContract]
List<TableEntity> ShowTables();
如果以上听起来比你需要的更多,我会确定你是否需要WCF。
答案 1 :(得分:1)
首先回答你的问题我会说它可能会产生错误,因为MySqlDataAdapter不可序列化和/或它包含在外部库中。关于有关DataSet的问题,可能同样适用,数据适配器更像是包含数据本身的对象的某些数据的包装 - 但是,我读到了你发布的那个问题,他们似乎认为WCF仍然存在允许你返回一个DataSet,这只是非常糟糕的做法。
长期以来做的最好的事情就是周杰伦回答的问题。您的WCF服务充当数据层和应用程序逻辑之间的中间人,因此让它负责读取DataAdapter并将输入转换为一组很好的细线类 - 然后可以通过WCF序列化并传递回到客户端。
答案 2 :(得分:0)
您是否已将 MySqlDataAdapter 和DataMember属性的DataContract属性添加到MySqlDataAdapter类中的每个属性,因为WCF适用于DataContractSerialization并且需要一些其他属性。