2008-11-08 58 views
8

如何正确服务位于专用局域网内的WCF Web服务的WSDL,从公共IP上的反向代理监听?WCF Web服务背后的公共反向代理

我有一个配置为反向代理模式的Apache web服务器,它侦听公共IP地址上的请求,并从内部IIS主机提供服务。 WCF webservice使用LAN主机的FQDN地址生成WSDL,当然这些地址不能被互联网Web服务客户端读取。

是否有任何设置可以在wcf应用程序的web.config或IIS中配置,以便自定义生成的包含主机地址的WSDL并将公有地址改为?

回答

9

为您服务类添加属性:

<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)> 

这使得服务客户端的HTTPS来解决:// ...但HTTP的托管服务:// .....请参阅this answer了解如何创建扩展以允许AddressFilterMode.Any通过配置指定而不需要代码属性。

在服务主机的web.config中,端点元素必须在地址属性中具有绝对URL,该属性是客户端将使用的公用URL。在同一个端点元素中,将listenUri属性设置为服务主机正在侦听的绝对URL。我确定主机监听的默认绝对URI的方式是在客户端应用程序中添加一个服务引用,该客户端应用程序指向托管服务的物理服务器。客户端的web.config将有一个服务地址。然后我将它复制到主机web.config中的listenUri属性中。

在服务行为的配置添加的元素serviceMetaData与属性httpGetEnabled =真

所以你必须是这样的:

<serviceBehaviors> 
    <behavior name="myBehavior"> 
    <serviceMetadata httpGetEnabled="true" /> 
    </behavior 
</serviceBehaviors> 
... 
<services> 
    <service name="NamespaceQualifiedServiceClass" behavior="myBehavior" > 
    <endpoint address="https://www.sslloadbalancer.com" binding="someBinding" contract="IMyServiceInterface" listenUri="http://www.servicehost.com" ... /> 
    </service> 
</services> 

我不知道这是否与消息安全或运输安全。对于这个特定的应用程序,证书作为DataContract的一部分传递,所以我们使用basicHttpBinding安全模式= none。由于传输是安全的(对于SSL负载均衡器),因此没有安全问题。

也可以将listenUri属性留空,但它必须存在。

不幸的是,WCF中存在一个错误,其中WSDL中导入的模式的基地址具有listenUri基地址而不是公有基地址(使用端点的地址属性配置的地址)。要解决该问题,您需要创建一个IWsdlExportExtension实现,它将导入的模式直接引入WSDL文档并删除导入。这里提供的一个例子是http://winterdom.com/2006/10/inlinexsdinwsdlwithwcf。另外,你可以有从BehaviorExtensionElement的例子类继承并完成了两个新的方法有:

Public Overrides ReadOnly Property BehaviorType() As System.Type 
    Get 
     Return GetType(InlineXsdInWsdlBehavior) 
    End Get 
End Property 

Protected Overrides Function CreateBehavior() As Object 
    Return New InlineXsdInWsdlBehavior() 
End Function 

这将允许你在config文件添加扩展行为,并使用配置中添加行为,而不是创建一个服务工厂。

的system.servicemodel配置元素下添加:

<endpointBehaviors> 
    <behavior name="SSLLoadBalancerBehavior">   
     <flattenXsdImports/> 
    </behavior> 
    </endpointBehaviors> 
     </behaviors> 
<extensions> 
    <behaviorExtensions> 
    <!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1--> 
    <add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>   
    </behaviorExtensions> 
</extensions> 

,然后使用behaviorConfiguration属性

<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior"> 
+1

我只想说明这个答案是基于WCF 3.5的。我没有机会检查WCF 4.0是否纠正了其中一些问题。我知道一些增强功能可以更好地支持反向代理服务器场景。 – 2010-11-02 13:29:03