【问题标题】:xsd.exe - schema to class - for use with WCFxsd.exe - 到类的架构 - 用于 WCF
【发布时间】:2011-01-24 08:33:18
【问题描述】:

我创建了一个架构,作为我们公司与外部公司之间商定的接口。我现在正在创建一个 WCF C# Web 服务来处理接口。

我运行了 XSD 实用程序,它创建了一个 C# 类。该架构是在 BizTalk 中构建的,并引用了其他架构,因此总共生成了超过 15 个类。

我将 [DataContract} 属性放在每个类的前面。 我必须将 [DataMember] 属性放在每个属性上吗?
当我生成一个测试客户端程序时,代理没有这 15 个类中的任何一个的任何代码。

我们曾经在使用 .asmx 服务时使用过这种技术,但不确定它是否能与 WCF 一样工作。如果我们更改架构,我们会想要重新生成 WCF 类,然后我们每次都必须使用所有 [DataMember] 属性重新装饰它?是否有类似于 XSD.exe 的更新工具可以更好地与 WCF 配合使用?

谢谢,

尼尔·沃尔特斯

解决方案(埋在 Saunders 答案/cmets 之一中):

将 XmlSerializerFormat 添加到接口定义中:

    [OperationContract]
    [XmlSerializerFormat]     // ADD THIS LINE 
    Transaction SubmitTransaction(Transaction transactionIn);

两个注意事项: 1)在我这样做之后,我在我的代理(服务参考)测试客户端程序中看到了更多的.xsds,但是我没有在我的智能感知中看到新的类。 2) 出于某种原因,在我对项目进行构建之前,我没有得到智能感知中的所有类(不知道为什么)。

【问题讨论】:

    标签: c# wcf xsd schema


    【解决方案1】:

    使用[DataContract] 的类将序列化为非常有限的模式。例如,没有属性,只有元素。这是有意为之,是为了提高性能和互操作性。

    一般来说,您可能正在使用的那种模式可能要复杂得多。这样的模式将不能用于 Data Contract Serializer。您将需要改用 XML 序列化程序。

    尤其不要编辑由 XSD.EXE 创建的类。事实上,您永远不应该编辑生成的代码,因为一旦再次生成代码,您的编辑就会被删除。这些类应该已经具有 WCF 使用它们所需的属性。

    如果你按原样使用它们会发生什么?

    【讨论】:

    • 1) 当我生成一个测试客户端程序时,代理没有这 15 个类中的任何一个的任何代码。我的理解是 WCF 需要 [DataContract] 和 [DataMember] 正确公开。所有元素对我来说都很好。 2)我完全同意不想更改代码,这就是我发布问题的原因。 3) 我应该搜索什么来了解有关 XmlSerializer 的更多信息?它是否从 .xsd 文件生成 C# 代码?我可能在最后一个客户上使用过它,但需要访问我的 gmail(在此处被阻止)。
    • 对每个需要 XML 序列化的 Web 服务操作使用 [XmlSerializerFormat]。 XSD 实用程序已经为您完成了所有其他工作。
    • 我没有投票反对 - 但是 - 你似乎错过了我的观点。我有一个现有的已批准 XSD,我需要在 WCF 中将其用作 C# 类。我习惯于先做模式,然后是 c# web-service,然后再构建 WSDL。 [我在 Blackberry 上发现了那封电子邮件,在以前的公司中,使用了 svcutil.exe /serializer:xmlserializer,但这是一个不同的问题。我们遇到了一个复杂的 C# 类无法正确序列化到正在消耗 WCF 的 BizTalk 的问题。]
    • 我明白你的意思。使用由 XSD.EXE 生成的类,但您必须通过使用 [OperationContract] 上的 [XmlSerializerFormat] 属性将每个操作配置为使用 XML 序列化程序。这样做有问题吗?这将为 Web 服务的特定操作(方法)打开 XML 序列化器。
    • @Neal:XSD.EXE 与 WCF 无关。它与旧的 XML 序列化技术有关。因为数据协定序列化不支持任意架构,所以 WCF 可以在必要时使用 XML 序列化。为此,有必要根据具体情况告诉 WCF 使用 XML 序列化程序而不是数据协定序列化程序。
    【解决方案2】:

    Neal,除了 John 为您提供的所有选项外,您还应该查看 Codeplex 上的 WCSF.blue 工具:http://wscfblue.codeplex.com/

    这是执行 WCF 的“合同优先”方法,它提供的众多选项之一是从 XSD 创建 WCF DataContract 文件:

    然后会弹出一个对话框,您可以在其中设置一系列有关如何从 XSD 创建 C# 类文件的参数:

    非常有用,即使您只想将 XSD 转换为可用作 WCF DataContracts 的 C# 类 :-)

    有关 XSD DataContract 生成过程的更多说明,另请参阅 blog post

    【讨论】:

    【解决方案3】:

    我很震惊没有人向我指出这个实用程序,我相信这就是我所要求的:

    http://msdn.microsoft.com/en-us/library/system.runtime.serialization.xsddatacontractimporter.aspx

    我还没有尝试过,但看起来 XsdDataContractImporter 是我正在寻找的东西,或者带有 /dataContractOnly 标志的 SVCUTIL。

    我昨天在面试候选人时了解到这一点。她说 DataContract 序列化速度更快,并且会被首选使用。

    尼尔

    【讨论】:

      【解决方案4】:

      Re:您的后续行动中提到的您的 XsdDataContract 类,IMO,这是一个利基类(如 ServiceContractGenerator 等),所以我并不惊讶没有人指出它。 您仍然需要将其打包以使其真正有用。我很确定代码示例仅涵盖非常基本的用例,因此我希望对其进行大量工作以使其处于正确的工作状态。 .就像我在 WSCF 论坛上提到的,Svcutil、wscf、xsd.exe 等都在代码生成过程中使用了这个类和相关类。

      关于序列化器的性能,Youssef Moussaoui 的博客上有关于不同序列化器及其性能的非常好的帖子,尤其是 http://blogs.msdn.com/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx

      关于两个序列化程序(XS 和 DCS)的 Connect 上也有一个非常好的讨论,并且有用的一点是 XS 仍然是 WSDL/XSD First 开发的前进方向,因为 DCS 仅旨在支持简化的编程模型因此不支持各种 xml 结构。 http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=451277

      希望这会有所帮助, 干杯, 本杰

      【讨论】:

      • 谢谢,上周我们一直在讨论 DataContract 与 XmlSerializer 的优缺点。我们新的 WCF 专家似乎认为使用 XmlSerializer 并没有充分利用 WCF 功能。你认为这是真的吗?我要去阅读你现在提到的博客。
      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 2011-10-27
      • 2021-07-26
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      相关资源
      最近更新 更多