2013-09-25 110 views
1

我們正在將舊的.Net Remoting服務遷移到WCF。在閱讀了這個主題之後,我偶然發現了這個元數據對話並在客戶端動態構建代理:它看起來很有希望。服務器和客戶端上的簡化WCF配置

如果可能,我想實現的目標是以最少的配置(即配置文件上沒有明確的<services>節點)在一個Web應用程序上公開服務,並在客戶端構建代理(通過共享接口)也用最少的配置。

我知道可以在默認情況下爲所有服務公開元數據,但這似乎工作的方式是無用的,因爲它爲每個服務生成不同的URL,然後我需要在我的服務器上維護幾十個硬編碼字符串客戶。

這是我目前的配置文件:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

我想有服務器(可能是基址本身,'http://localhost/VirtualDir「)上的單個網址,並使用該端點自動解決來自任何服務接口客戶。我碰到this somewhat old post,這或多或少是我想達到的。當時,似乎沒有任何方法可以優雅地做到這一點。

是不是有辦法在服務器上暴露單個MEX端點,然後解析其上的任何合約接口?這樣,我將能夠:

  1. 店客戶
  2. 在單個URL使用MetadataResolver類給定接口
  3. 獲取端點創建使用解決端點
  4. 使用 ChannelFactory<T>代理

我想在某種工廠類中做到這一點,並將其與Unity IoC容器一起使用。

我想我仍然可以使用某種約定來構建使用已知格式的許多實際端點地址。我想盡量避免這種情況,因爲它仍然會導致問題。

回答

1

有兩種方法我能想到的,你怎麼能處理這個:

  1. 使用WCF路由服務和基於SOAP動作,或其他內容採用filters路由。
  2. 創建一個端點,它在請求中處理Message個實例,然後在內部處理它們的convert

WCF路由的缺點是,這本身就是另一個WCF服務。而且我不確定選項2是否可能完全如你所描述的你想要的。

請檢查這個MSDN magazine article

此外,MetadataResolver主要用於在調用它們之前在客戶端上動態解析服務上的端點。正如你所描述的,我沒有在服務端看到過這一點。

此外,還有一個小點,WCF旨在用於定義兩個應用程序通信的顯式邊界。這種分離是明確的,並表達爲相互接受抽象的,詳細的外部合同。在我看來,試圖擺脫這種明確的契約會讓人質疑爲什麼你首先需要邊界。如果可以的話,調用正在運行的服務幾乎總是更好。

+0

我想你誤解了我的問題。我不打算在服務器上使用MetadataResolver。我想要實現的是到服務器的單個URL,然後在客戶端上使用Resolve,通過所需的接口。至於進行中的電話,我不確定我是否明白你的意思。我們需要這些調用是遠程調用,因爲服務器是一個Web應用程序,客戶端可能是其他Web應用程序,Windows服務或桌面應用程序。我會看看這個路由選項如何工作,謝謝你的提示。 – julealgon

+0

剛開始閱讀有關路由服務後,我看到它只支持SOAP消息?由於我們在某些地方使用泛型列表,因此SOAP序列化程序無法處理泛型類(目前我們在所有服務中都使用二進制序列化),所以這會成爲一個難題。 – julealgon

+0

無賴 - 很抱歉,我無法提供更多幫助。關於正在進行的事情 - 注意到人們在不需要它們的地方引入服務邊界 - 但聽起來像你不是其中之一;) –

相關問題