2010-11-02 34 views
5

我目前正試圖讓我的頭部圍繞ASP.NET開發環境的WCF服務,並且我相信我做得很好,除了一件讓我難以置信的事情。如何獲取我的WCF服務構造函數?

基本上,我有一個WCF服務設置(讓我們的默認,與添加的構造函數):

public class MyService : IMyService 
{ 
    public MyService() { /* blah */ } 
    public DoWork() { /* blah */ } 
} 

IMyService接口,定義爲[OperationContract]DoWork()方法,因爲它應該。

所以我在另一個項目(比如說[單元]測試項目)中通過在VS2010 UI上添加了服務參考。這會創建一個MyServiceClient的引用,它會公開我的WCF服務方法,因爲它應該如此。

然而,當我做這在我的測試項目:

ServiceReference.IMyService service; 
service = new ServiceReference.MyServiceClient(); 

...的MyService()構造函數不被調用,主要是因爲我在實例化一個MyServiceClient,不是MyService本身。

我該如何着手調用構造函數?我打算將它用於初始化目的(例如,可能在分層實現中抓取一個圖層?)。

回答

6

當您向客戶端提出請求時,將在服務器上調用該構造函數。

創建對Web服務(然後使用客戶端類)的「引用」與引用常規.DLL非常不同。所有的服務代碼都將在服務器端運行,但不會在服務調用之前運行...

+0

所以基本上,你是說,而不是_Add服務參考_,我應該去一個良好的醇'__參考_服務項目,然後直接訪問服務類? – 2010-11-02 15:45:27

+3

不,添加服務引用是正確的...但是服務類中的構造函數不會作爲本地代碼的一部分運行 - 當您調用服務時,它會在IIS服務器上運行。它會*在您的任何服務方法運行之前被調用,而不是在您創建客戶端對象時調用。 – 2010-11-02 16:18:03

+0

Gotcha。當我意識到我尚未在我的測試項目中實際調用任何服務方法時,正在使用您的解決方案。 :D謝謝! – 2010-11-03 07:25:47

1

爲每個請求調用服務器端構造函數的唯一方法是將InstanceContextMode設置爲PerCall(在ServiceBehavior屬性中)。

+1

沒錯,但我認爲你的意思是ServiceBehavior屬性。 :) – 2010-11-02 15:55:01