如何使合同对象模型等同于我在WCF中需要响应XML的样子?

时间:2013-01-22 02:33:43

标签: c# wcf api datacontract

我觉得我已经多次这样做了,但似乎我必须跳过太多的箍,我想知道是否有更简单的方法。

我正在使用WCF构建API(REST和SOAP端点)。我正在构建我希望从我的一个调用中看到的XML响应,并且我想知道获得其等效对象模型(数据合同)的最简单方法。

这是一个示例XML请求,其中GetSectionInvitesResponse是应该从API调用返回的顶级合同。

<GetSectionInvitesResponse>
 <UserID></UserID>
     <OrganizationInvites>
            <SectionInvites>
        <SectionSubscriber>
            <Section>
                <ID></ID>
                <Name></Name>
                <Description></Description>
                <Descriptor></Descriptor>
                <ParentID></ParentID>
            </Section>
            <SectionSubscriberID>
        </SectionSubscriber>
        <SectionSubscriber>
            <Section>
                <ID></ID>
                <Name></Name>
                <Description></Description>
                <Descriptor></Descriptor>
                <ParentID></ParentID>
            </Section>
            <SectionSubscriberID>
        </SectionSubscriber>
    </SectionInvites>
 </OrganizationInvites>
 <OrganizationInvites>
            <SectionInvites>
        <SectionSubscriber>
            <Section>
                <ID></ID>
                <Name></Name>
                <Description></Description>
                <Descriptor></Descriptor>
                <ParentID></ParentID>
            </Section>
            <SectionSubscriberID>
        </SectionSubscriber>
        <SectionSubscriber>
            <Section>
                <ID></ID>
                <Name></Name>
                <Description></Description>
                <Descriptor></Descriptor>
                <ParentID></ParentID>
            </Section>
            <SectionSubscriberID>
        </SectionSubscriber>
        <SectionSubscriber>
            <Section>
                <ID></ID>
                <Name></Name>
                <Description></Description>
                <Descriptor></Descriptor>
                <ParentID></ParentID>
            </Section>
            <SectionSubscriberID>
        </SectionSubscriber>
    </SectionInvites>
 </OrganizationInvites>
</GetSectionInvitesResponse>

修改 因为我在最初的帖子中不够清楚,所以我想更清楚地说明我的目标是从这个问题中获得什么。

我想了解使用最少的重复代码通过SOAP和REST公开此方法的最佳方法,同时遵循上面显示的相同XML模式?

1 个答案:

答案 0 :(得分:0)

理论上你可以:

  1. 将示例xml粘贴到您的favorte xml编辑器中
  2. 让编辑器自动为您生成xml架构。在Visual Studio中,它的XML-&gt;生成模式。例如InvitesResponse.xsd
  3. 从命令提示符运行svcutil /dconly InvitesResponse.xsd /language:C#以创建DataContract文件。
  4. 出于好奇,我经历了这些步骤并发现:

    1. <SectionSubscriberID>未在您的xml中正确关闭。
    2. DataContractSerializer不允许您按照当前的方式定义节点序列。
    3. svcutil输出:

        

      错误:在命名空间''中键入'GetSectionInvitesResponse'不能   进口。元素'OrganizationInvites'上的'maxOccurs'必须为1。   要么改变架构,以便类型可以映射到数据契约   类型或使用ImportXmlType或使用不同的序列化程序。

      所以我发现DataContract Schema Reference指出在复杂类型中必须有maxOccurs = 1。

      如果你想保留DataContract序列化程序而不是切换到XmlSerializer,你可能不得不改变你的架构......如果你刚刚开始编码,你也会发现它。

      正是在这一点上@John Sanders的智慧开始了,我停了下来。