2008-11-08 61 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