2011-11-07 81 views
0

我會用一些方法創建一個WCF服務。其中一種方法(即Connect方法)應該是第一個爲了使用服務而調用的方法:換句話說,在使用所有其他服務方法之前,必須將其稱爲Connect方法。出於這個原因,我將其定義爲IsInitiating屬性設置爲true,並且我已將此屬性設置爲false定義了其他方法。拒絕與服務的連接

此外,提供服務的節點必須能夠拒絕來自其他節點的連接請求(例如,如果其他節點已經在使用該服務):是否有辦法阻止使用該服務?

非常感謝!

回答

1

好吧,當然。

首先明白,默認情況下,WCF服務是一個「實例每請求」結構; IIS在應用程序池中維護的HttpApplications將「新建」您的服務合同類的副本,進行與請求有關的調用,然後該對象將超出範圍並被銷燬。現在

[ServiceContract(SessionMode = SessionMode.Required)] 
public interface IMyServiceContract 
{ 
    ... 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class MyServiceImplementation: IMyServiceContract 
{ 
    ... 
} 

,當你的服務被稱爲,「會話」的客戶端和服務器之間建立,以及單:您可以指出您的服務應該在「實例每次會話」模式下運行覆蓋此您的課程副本將被創建並保留在該會話的整個生命週期內(除非應用程序池被刷新,這可能會自動發生或通過IIS內的手動操作)。這是第一步。現在

,你可以做兩件事情之一:

  • 任何方法簡單地檢查,除了連接()是否連接()被調用的自成立以來,該實例。如果沒有,扔掉。

  • 讓Connect()方法返回客戶端必須傳遞給所有其他方法調用的一些實例作用域標記或GUID。如果調用者提供的GUID與實例內存中保存的GUID不匹配,則拋出該方法。

瞭解會話可以在請求之間超時。如果發生這種情況,您當前的實例將離開作用域並被銷燬,並且將創建一個新實例來處理後續請求。因此,即使系統可以根據他們的會話識別實例,我也會選擇第二種選擇; GUID確保自上次調用以來客戶端和服務實例都沒有更改。

+0

** 1)**關於第二個選項,爲什麼客戶端或服務實例會更改? ** 2)**由於會話可以在請求之間超時,我可以更改此超時嗎?另外,我可以手動結束會話嗎?我可以通過聲明一個Disconnect方法並將IsTerminating屬性設置爲true來手動結束會話嗎? ** 3)**如果連接應該被拒絕,我如何關閉TCP會話? – enzom83

+1

1)如果服務超時,服務實例可能會改變。 Web服務的基本架構意味着客戶可能不知道這是否發生,但在這種情況下,他們需要。 2)是的,你可以改變超時。您也可以手動結束會話。 3)如果Web服務拋出,TCP連接將被終止。 – KeithS