2012-09-05 88 views
4

我開始制定如下方案(Visual Studio 2010中,WCF):不同的客戶我們的網絡會打電話是我公司開發自己的網絡服務,其託管的的一部分,一個Windows服務,所以我們正在討論一個Windows服務中的自託管的WCF Web服務。與自我的併發請求處理託管WCF Web服務

,自我承載的WCF Web服務將依次作出外部Web服務調用,因此表現得像一種門面。

很明顯,我自己託管的WCF Web服務將需要接受併發呼叫,這裏出現了我的問題:我打算在從我自己託管的WCF Web服務的不同客戶端調用的操作中,我簡單地爲外部Web服務創建客戶端,調用外部Web服務,從外部Web服務獲取同步響應,然後回覆調用客戶端。

聽起來簡單,但有什麼我需要考慮關於多線程進入我的服務主機?顯然,我需要小心主機本身中的任何「全局」變量,但是如果我簡單地在被調用的Web服務的不同操作中創建外部Web服務客戶端,或者我忽略了某些內容,我應該保存它們嗎?

謝謝大家!

乾杯, 斯特沃

回答

10

你有幾個選擇這裏,尤其是涉及到WCF實例化和併發性。

實例化:在這裏你的選擇是

  • PerCall:一個新的InstanceContext(因此服務對象)爲每個客戶端請求創建。
  • PerSession:爲每個新的客戶端會話創建一個新的InstanceContext(並因此服務對象),並在該會話的生命週期內維護(這需要支持會話的綁定)。
  • :單個的InstanceContext(因此服務對象)處理用於應用的生命週期的所有客戶端的請求。

併發:

  • :每個實例的上下文被允許具有最多一個線程處理的消息中在一個時間實例上下文。希望使用相同的實例上下文中的其他線程必須阻塞,直到原線程退出的實例上下文
  • :每個服務實例可以有多個線程同時處理消息。服務實現必須是線程安全的才能使用此併發模式。
  • 折返:每個服務實例一次處理一個消息,但接受重入操作調用。該服務在通過WCF客戶端對象調用時僅接受這些調用。

讓我們看一下第一個實例化:

每次呼叫:基本上,這裏發生的事情是,如果兩個客戶對您的服務電話,爲您服務的2個不同的實例被創建,然後銷燬,一旦通話結束

每學期:如果這兩個客戶端使每2個呼叫通過代理,您的主機對於這兩個電話上創建的WCF實例將是相同的(每個代理,這樣2個實例服各2但每個調用者都去相同的實例),然後去stroyed

單個:兩個代理/客戶端將使用相同的實例,因此調用者1調用操作,然後調用者2發出呼叫,這個相同的實例將被重用。

非常直截了當。

就併發而言,它一次在上述實例上下文中活動的線程數。在這裏我帶着經驗和MSDN,其中指出「理解和開發安全使用多個線程的代碼可能很難寫」(但不是不可能

因此根據您的要求,由於您正在服務多個代理服務器,並且您不需要共享任何需要單實例模式的全局數據,因此最可能的解決方案是:

[ServiceBehavior 
(ConcurrencyMode.Single, 
InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService: IYourService 
{ 
} 
[ServiceBehavior 
(ConcurrencyMode.Single, 
InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService: IYourService 
{ 
} 
+0

非常感謝,這正是我一直在尋找的。 – ManOnAMission