2011-03-07 31 views
1

這篇文章有點連接到我以前的帖子在這裏 - How to create custom WCF binding which effectively reverses the communication?有沒有可能有一個WCF服務主機沒有綁定到任何特定的服務類型?

總之,我試圖建立一個反向輪詢http綁定主機輪詢其客戶端的請求。我使用http://archive.msdn.microsoft.com/duplexhttp的代碼作爲我的參考。現在,在這個綁定中,主機實際上是一個客戶端,客戶端實際上是服務器。這意味着,使用此反向輪詢http綁定的客戶端必須以提供通道泵設施的隱藏服務主機結束。

現在,使用ServiceHost類型的通常模式要求存在實際的WCF服務實現。在我的情況下,ServiceHost在客戶端是開放的 - 它沒有服務實現,並且是正確的。

我想知道什麼是解決這個問題的最好方法?

理想情況下,此服務主機不需要任何服務。輪詢主機發送未映射到任何服務合約的消息實例。這些消息由專用通道請求和回覆 - 分別爲HttpPollingRequestChannel和HttpPollingReplyChannel。但是我需要它實施的通道泵設備的服務主機。

任何幫助表示讚賞。

EDIT1

我想更多的背景信息是必要的,以澄清該圖片。我們的系統由客戶端,服務器和代理組成。客戶與服務器交談,後者將他們的請求傳達給代理,代理將結果傳回服務器。所有的頻道都是直接的HTTP - 簡單明瞭。

但是,需要能夠在防火牆後面部署代理,而無需打開入站端口。這意味着,服務器 - >代理通信不再可能。正如我所看到的,我有兩種選擇:

  1. 重新設計服務器 - >代理協議以使其使用輪詢。
  2. 實現低級綁定,它將在內部使用輪詢。

你會做出什麼樣的選擇?儘管第二選擇很難實現,但這是一次性努力。但它有很多好處。可能嗎?我認爲是的,因爲輪詢雙向http綁定已經存在於Silverlight和.NET中 - 請參閱本文開頭的鏈接。

EDIT2

我願再次強調,這我不想雙工。在雙工通信中,回調是在請求的上下文中執行的,這意味着代理髮送請求,服務器執行回叫。我的情況不同。代理髮送任何東西服務器決定與代理進行溝通。代理沒有主動請求。所以,現有的雙工綁定對我來說並不好,但我正試圖從中學習如何實現輪詢。

總體情況是這樣的:

  • 代理不斷地輪詢服務器
  • 如果服務器想將消息發送到代理,爲下一個輪詢請求和遊樂設施的代理頂部有消息等待的輪詢請求答覆。

輪詢請求不是任何接口的一部分,它們在低級綁定基礎結構中實現。

+0

如果代理在防火牆後面,它必須是啓動連接的人員=它必須是託管在服務器上的服務的客戶端。 – 2011-03-07 15:07:36

+0

我想保持儘可能低的投票隱藏。當它在綁定中時。如果沒有防火牆問題,它可以讓我快速重新配置代理以使用常規綁定。 – mark 2011-03-07 15:40:10

+0

仍然不明白。誰在開始溝通,你的要求/限制是什麼。 – 2011-03-07 17:42:39

回答

0

首先,如果I would not採用雙相我是你。

除了線程問題一大堆,如果服務器和客戶機的重量和權威的術語是等同的,我會用2個獨立的接口,一個用於服務器到客戶端和其他客戶端發送回服務器。

WCF可能不準確,如果你需要的信息充分的靈活性要走的路。 CQRS + NServiceBus可能更適合於定義命令,並且每條消息都會規定需要對其執行的操作。

+0

在問題的正文中增加了說明。 – mark 2011-03-07 15:05:19

0

在我看來,你是在浪費你的時間。該技術尚未準備好。如果要與客戶端進行雙向通信,請使用發佈/訂閱模式。如果你只想讓服務器調用客戶端,在客戶端和用戶服務器上公開服務作爲該服務的客戶端。

爲什麼?

  1. 這將節省您的時間和預算
  2. 它將工作enourmous量 - 它是由成千上萬的現實世界的解決方案
  3. 人們會理解和幫助你,如果你有麻煩測試。

如果你真的需要按照你的情況放棄WCF和使用其他編程模型 - 可能直接插座。

編輯:

好吧,如果你仍然想使用雙工服務,我有這樣的想法:

  • 使用WsDualHttpBinding當代理不是在防火牆後面
  • 使用PollingDualHttpBinding當代理防火牆後面 - 要獲得此綁定,您必須安裝Silverlight 4 SDK。它在單獨的程序集System.ServiceModel.PollingDuplex.dll中。如果要在配置文件中使用它,則必須將綁定註冊爲新的綁定擴展。
+0

在問題的主體中增加了說明。 – mark 2011-03-07 15:05:02

+0

再次編輯我的問題。 – mark 2011-03-09 09:55:49

+0

@mark:在這種情況下,您可以反向工程'PollingDualHttpBinding',但我以前的答案仍然有效 - 我99%確定您正在浪費您的時間。 – 2011-03-09 10:00:09

0

防火牆是爲什麼複式HTTP不工作的原因。鑑於這個問題出現的次數,我真的希望微軟從來沒有創建dualHttpBinding。

對此的解決方案是使用類似NetTcpBinding的代替,作爲一個允許在單一連接(一個客戶端創建)實際雙工通信,從而解決了防火牆的問題。如果由於某種原因需要使用HTTP,則唯一的選擇是讓代理程序對服務進行輪詢。

+0

如何使用net.tcp://?它是利用端口80嗎?因爲如果不是這樣,那麼由於防火牆的原因,它根本無法工作。通常只有端口80和443是開放的,甚至它們有時僅對出站開放。 – mark 2011-03-07 19:46:03

+0

我想你可以把它放在80端口,如果你想和服務器上沒有網絡服務器,但你告訴我,你的服務器只有端口80打開,你不能改變它?客戶端不需要開放端口,他們只需要能夠創建出站連接,並且大多數防火牆應該允許這樣做,除非它們被設置爲非常嚴格。 – Tridus 2011-03-07 20:04:00

+0

我不是在談論客戶。服務器有80和/或443,入站和出站 - 就是這樣。沒有人會讓您在企業中添加更多端口。代理有80和/或443出站,有時有80和/或443入站,但有時不是。除了專門用於特定業務應用程序的端口外,其他所有的端口都關閉,並且不會爲我們的應用程序打開,應用程序應該可以通過HTTP(S)完成。 – mark 2011-03-07 20:30:48

相關問題