c# - 数据契约(Contract)问题

标签 c# wcf

我需要开发一个 web 服务,它将通过 SOAP 暴露给 java 客户端。我们有一个定义明确的模式,我们用它来在两个系统之间进行通信。现在我需要在我的 WCF 契约(Contract)上公开一个操作,该操作采用 Schema 对象并将其存储在我们的数据库中。

我遵循以下内容来开发网络服务。

  • 在 wcf 中通过 basichttp 托管它
  • 使用 xsd.exe 创建模式的对象模型
  • 将模式作为操作的参数,例如 DoThis(SchemaObject schema)

由于这将在 WCF 中公开,因此我已经修改了 xsd 工具生成的对象模型。我们的模式具有多级嵌套,并且是 4 个不同模式链接在一起的组合。 xsd工具生成的对象图有抽象类、继承等。

为此,我已经在每个类上定义了 DataContract 属性,并向其添加了 namespace ,该 namespace 已经存在于 XmlTypeAttribute 中。我还为每个属性添加了 DataMemebers。

模式中的某些属性是工具使用 xmlarrayitem 属性定义的数组。

现在,当我使用 SOAP UI 发送请求时,对象没有按预期进行反序列化。几乎所有的字段都是空的,它具有某种继承层次结构。我已将 KnownType 属性添加到适当的数据契约(Contract),但仍然无法正常工作。

我的问题是:

  • 这是开发网络服务的正确方法吗?

  • 有没有办法避免放置数据协定和数据成员,而只使用 xsd 工具添加的序列化属性?

  • 是否有必要使用 datacontract 属性,它不会像在 xml 反序列化中那样与 xmlserialization 属性一起工作吗?

最佳答案

WCF 支持两种类型的序列化 - DataContractSerializerXmlSerializer

XSD.exe 生成具有所有必需的 XmlSerializer 属性的强类型实体。您无需添加任何 DataContractDataMemeber 属性即可在 WCF 中使用生成的类。

有关详细信息,请参阅 MSDN - http://msdn.microsoft.com/en-us/library/ms733901.aspx

还要非常小心 xsd.exe 生成的实体。正如您可能已经看到的那样,WCF 服务器将吃掉许多您可以在这些文件中执行的序列化更改,但这将对客户端造成破坏性更改,因为它们在 XSD 上进行中继。

如果可能的话,我会保留这些自动生成的实体而不做任何更改,以保证界面不会被破坏。您可以引入单独的 DTO 类以在业务层中使用。您可以在那里实现继承层次结构。

如果您觉得需要更改自动生成的类,单元测试组可以提供帮助。这些测试用例应生成不同的数据集,将它们序列化为 XML 并通过 XSD 检查该 XML。

关于c# - 数据契约(Contract)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11962766/

相关文章:

silverlight - WCF 和 Silverlight 4 的另一个 "The maximum string content length quota (8192) has been exceeded while reading XML data."问题

WCF RIA Silverlight 部署问题

c# - IIS session 在发布 Web 上丢失

c# - 如何在 C# 中定义我自己的 LINQ 结构?

c# - 线程未按预期启动

c# - 更好的做法 : CheckBox DataBindings vs CheckedChanged event

c# - 是否有理由让每个 WCF 调用异步?

asp.net - "ServiceHost only supports class service types"

c# - 杂项功能静态类的理想类名

asp.net - 使 WCF 服务工作