如何正確服務位於專用局域網內的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