为服务器端共享相同类型的多个WCF服务共享相同的XSD架构

时间:2014-04-03 20:45:40

标签: web-services wcf xsd wsdl

我有一个包含多个服务的.NET服务器端项目。每个服务都处理每组自己的方法,但方法共享相同的类型:

  • Customer.svc包含GetCustomer等方法,可返回有关客户的数据(包括客户的地址)
  • Order.svc包含Getorder等返回订单数据的方法(包括送货地址)

当我访问Customer.svc?WSDL和Order.svc?WSDL时,每个人都引用自己的XSD文件,并在这两个文件中定义了地址类型。

因此,如果外部客户端引用两个端点,他将获得两个包含相同类型的不同XSD文件。

问题:如何强制WCF 在WSDL之间共享类型/ XSD (在服务器端!)。请注意,我不是在询问如何在客户端上共享类型(这可以通过svcutil / reference switch实现)。

1 个答案:

答案 0 :(得分:1)

控制此方法的唯一方法是手工制作“元数据”(WSDL + XSD),然后通过自定义配置公开它。您必须确保外部化公共XSD,然后从Customer和Order wsdl文件中正确引用它们(基于您计划相对于WSDL的位置发布它们的位置)。

查看serviceMetadata文档,尤其是externalMetadataLocation属性。下面的示例向您展示了它的要点(您可以尝试使用和不使用externalMedatadataLocation属性的绝对URL,并查看它是如何工作的):

<serviceBehaviors>
    <behavior name="CustomMetadata">
        <serviceMetadata httpGetEnabled="true" externalMetadataLocation="https://.../mywsdl.wsdl"/>
        <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
</serviceBehaviors>

根据您的特定部署(自托管,IIS,Windows服务等),您可能遇到应该能够通过其他行为解决的各种问题。搜索“自定义wsdl WCF”或“externalMetadataLocation示例外部XSD”以查看人们遇到的其他问题,并筛选它们,因为它们可能适用于您的特定方案。