2014-04-03 131 views
1

我有一个包含多个服务的.NET服务器端项目。每个服务的处理与各自己的一套方法,但是这些方法共享相同的类型:在服务器端共享相同类型的多个WCF服务共享相同的XSD架构

  • Customer.svc包含的方法如GETCUSTOMER,它返回客户(包括客户的地址)数据
  • 订单.SVC包含的方法如Getorder返回有关订单数据(包括送货地址)

当我访问Customer.svc?WSDL和Order.svc?WSDL他们每个人引用了自己的XSD文件和地址类型在它们中被定义。

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

问题:如何强制WCF到共享类型/ XSD之间的WSDLs(在服务器端!)。请不要问我如何在客户端上共享类型(这可以通过svcutil/reference switch来实现)。

回答

1

控制的唯一途径意味着手工制作的“元数据”(WSDL + XSD),然后通过自定义配置曝光。您必须确保将常见XSD(s)外部化,然后从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”,以查看人们遇到的其他问题并筛选它们,因为它们可能适用于您的特定场景。

+0

谢谢。我使用IIS作为主机。由于其他要求,我们使用代码优先方法*而不是模式优先(。手工制作XSD和WDSL,并且使用externalMetaDataLocation是不可接受的。我通过实现IWsdlExportExtension来实现它,使用WsdlExporter收集所有模式,修复在XSD中导入WSDL中的引用,并实现自定义IHTTPHandler以从单个位置提供服务XSD。 – matra