2012-06-19 44 views
1

我正在開發一個客戶端/服務項目,其中客戶端將位於具有不會靜態的IP的防火牆後面。客戶會調用服務。然後,該服務在稍後數小時後可以在客戶端有數據時聯繫客戶端。每項服務會有很多客戶。解耦的異步調用 - WCF或WF

我看了幾個WCF樣本,似乎保持連接打開,我不想這樣做。在我看到的幾個WF示例中,看起來服務可以在超時過期之後聯繫客戶端,可以假定在不同的連接上。

我對這些技術很陌生,但花了無數個小時來研究和測試樣品。似乎我讀得越多,我就越不清楚自己是否有最好的解決方案。 WF對我來說是最好的解決方案,還是有可能通過WCF實現我想要的結果?

回答

1

如果您想聯繫客戶端,但不要保持連接處於打開狀態,客戶端將不得不發佈端點供您使用。這可能不是客戶端直接,而是您可能讓客戶端向內部服務器註冊自己,然後該服務器公開端點,並在從您接收數據時將呼叫路由到客戶端。

但是,如果沒有他們暴露某個端點,您將無法聯繫客戶端。

這有道理嗎?

WF vs. WCF 另外,請記住,WCF是終端可以被暴露和使用的通信框架。 WF是一個工作流框架,可以通過WCF端點自行公開。他們是完全不同的技術,一個不依賴於另一個 - 因爲WF可以在沒有WCF的情況下運行。

+0

是否需要靜態IP來暴露端點?作爲最後的手段,保持連接活着,如DurableDuplex是一個選項? – Daniel

+0

我將取決於這些客戶端的「關鍵任務」。例如,我可以通過IP向家中的計算機公開WCF端點,我的ISP將我租用。該IP在租用的時間段內是「靜態」的。如果這些客戶端端點是「關鍵任務」,那麼我會建議爲他們獲取靜態IP,或者您可以在客戶端上編寫.NET程序,並按計劃運行並驗證IP,並將該信息發送到服務器,以便讓您客戶端IP地址已更新。 –

+0

感謝您的輸入。我可能只能使用wcf duplex來保持打開30個最大連接,並在需要時推送數據。 – Daniel

0

請記住,WF仍然通過WCF暴露於外部世界。考慮到它的「小時後」方面,其實際上有兩個方面:客戶端和WCF服務之間的來回工作方式以及處理本身的過程(需要幾個小時的部分)。作爲一個漫長的過程,第二個可能對WF有意義。第一個可能會更好地處理像SignalR這樣的框架。

1

更好的解決方案是在這種情況下使用隊列。我會使用ServiceBus並將消息發送到客戶端準備好的隊列中。您也可以使用MSMQ來執行相同的操作,甚至可以將數據庫用作隊列。

+0

Ron,我看過你的一些視頻和文章 - 非常豐富。隊列設置可能是要走的路,但我試圖減少對服務器的所有輪詢,並查詢數據庫以查看是否有可用於客戶端的數據。 – Daniel

+0

@RonJacobs現在這是一個有趣的方法,並且真的很輕。我會牢記這一點。 –