如何正确服务位于专用局域网内的WCF Web服务的WSDL,从公共IP上的反向代理监听?WCF Web服务背后的公共反向代理
我有一个配置为反向代理模式的Apache web服务器,它侦听公共IP地址上的请求,并从内部IIS主机提供服务。 WCF webservice使用LAN主机的FQDN地址生成WSDL,当然这些地址不能被互联网Web服务客户端读取。
是否有任何设置可以在wcf应用程序的web.config或IIS中配置,以便自定义生成的包含主机地址的WSDL并将公有地址改为?
如何正确服务位于专用局域网内的WCF Web服务的WSDL,从公共IP上的反向代理监听?WCF Web服务背后的公共反向代理
我有一个配置为反向代理模式的Apache web服务器,它侦听公共IP地址上的请求,并从内部IIS主机提供服务。 WCF webservice使用LAN主机的FQDN地址生成WSDL,当然这些地址不能被互联网Web服务客户端读取。
是否有任何设置可以在wcf应用程序的web.config或IIS中配置,以便自定义生成的包含主机地址的WSDL并将公有地址改为?
我有类似的问题,其中之一是解决公共和服务器地址。这解决了这个问题,虽然我仍然有几个身份验证问题。
OMG史蒂夫,非常感谢这个链接,我在过去的几个小时里疯了。 – 2010-03-30 17:35:06
为您服务类添加属性:
<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">
我只想说明这个答案是基于WCF 3.5的。我没有机会检查WCF 4.0是否纠正了其中一些问题。我知道一些增强功能可以更好地支持反向代理服务器场景。 – 2010-11-02 13:29:03
该内容似乎已经转移到HTTP引用您的端点配置新的端点行为: //msdn.microsoft.com/en-us/magazine/cc163412.aspx。 – JohnW 2009-12-09 02:59:26