【问题标题】:DataContractException in hosted WCF service托管 WCF 服务中的 DataContractException
【发布时间】:2014-03-19 09:10:07
【问题描述】:

我正在尝试托管一个服务,其中有一个返回以下类型的方法:

[DataContract]
[Obfuscation(ApplyToMembers = true, Exclude = true)]
[Serializable]
public class Output
{
    [DataMember]
    public DataSet dsOutput{get;set;}
}

方法签名如下:

[OperationContract]
[WebGet]
function Output matchData(DataSet pDSSide1,DataSet pDSSide2)
{
   return new Output();
}

在浏览服务时遇到以下异常:

System.InvalidOperationException:调用 WSDL 导出扩展时引发异常:System.ServiceModel.Description.DataContractSerializerOperationBehavior 合约:http://tempuri.org/:TesterTool ---->

System.Runtime.Serialization.InvalidDataContractException:无法序列化类型“System.Data.DataRow”。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。如果该类型是一个集合,请考虑使用 CollectionDataContractAttribute 对其进行标记。有关其他支持的类型,请参阅 Microsoft .NET Framework 文档。 `

任何建议。

【问题讨论】:

  • 是的,不返回DataSet,框架如何解析所有可能的DataSet?

标签: wcf serialization datacontractserializer datacontract


【解决方案1】:

通过服务发送 DataTable 不是一个好习惯。

正如 govindaraj here 所说:

最好的方法是使用自定义对象的自定义集合。

如果您使用的是 2.0,那么您可以使用泛型集合而不是 自定义集合以减少代码。

怎么做?

  1. 创建一个自定义数据对象(仅包含每个字段的私有字段和公共属性),该对象类似于 数据表。

  2. 创建一个层,该层将对自定义对象进行所有数据库(在本例中为数据集)访问和转换。

  3. 所有客户端代码都将访问该层。

【讨论】:

  • 复制别人的话,你绝对必须像我上面那样提供出处。以后请务必这样做。
猜你喜欢
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多