2013-01-23 85 views
1

有沒有可能在構造函數中識別我的服務的哪個方法被調用?WCF服務 - 瞭解構造函數中調用哪個方法

我的例子: 我想建立一個服務,可以通過SetPauseService(true)暫停,這樣他暫停時不會做任何工作。我不想檢查每個方法中的暫停標誌,所以我試圖將它存檔在構造函數中。 我的問題是,用戶必須在服務暫停時再撥打SetPauseService(false)以再次激活服務。

[ServiceContract] 
public class MyService 
{ 

    private static bool isPaused; 

    public MyService() 
    { 
     if (/*<Pseudo>*/ InvokedMethod != "SetPauseService" /*</Pseudo>*/) 
     { 
      if (isPaused) 
      { 
       throw new Exception("Cannot be executed, service is paused!"); 
      } 
     } 
    } 

    [OperationContract] 
    public void SetPauseService(bool status) 
    { 
     isPaused = status; 
    } 

    [OperationContract] 
    public void DoWork() 
    { 
     /* ... */ 
    } 
} 

回答

5

我相信你在找什麼可以發現:

OperationContext.Current.IncomingMessageHeaders.Action 

這將會使所謂的操作。 這是你需要的嗎?

+0

這就是我一直在尋找的。謝謝! –

+0

我的榮幸:P tho @daryal似乎也指出了實施的一個好方向。無論如何高興地幫助。 – JanivZ

2

我認爲在這種情況下有三種選擇;

  1. 編寫WCF實例行爲以檢查服務是否已暫停。 我假設WCF服務的實例上下文模式不是每次調用(例如,您沒有爲每個調用創建一個新的服務實例)。然後,你可以實現一個實例行爲來返回你的服務類的實例,爲什麼實現你將有權訪問請求。您可以檢查被調用的方法,並可能處理該響應或僅放棄該請求。也許你可以使用其他行爲類型來實現這一點;可能會有更合適的(你可以在這裏查看http://msdn.microsoft.com/en-us/magazine/cc163302.aspx)。

  2. 在您的方法中使用屬性來檢查服務是否暫停。您可以在調用方法之前使用PostSharp並注入代碼。您可以在方法調用之前檢查暫停狀態並決定是否執行。請參閱postsharp

  3. 在某些操作中封裝方法代碼以檢查服務是否已暫停。您可以編寫一個接受Action s作爲參數的通用函數;防爆。

    public void CheckPauseStatusAndExecuteIfTrue(Action action) 
    { 
        if (!this.isPaused) 
        { 
         action(); 
        } 
    } 
    

    ...

    [OperationContract] 
    public void DoWork() 
    { 
        this.CheckPauseStatusAndExecuteIfTrue(() => 
        { 
         //// write your method behavior 
        }); 
    } 
    
0

如果它確實存在,它可能在OperationContext.Current。我只是不會依賴於此:該建築由WCF控制。如果您嘗試,請確保您使用'PerCall'模式。

更好的方法是實現自定義參數檢查器。 (實現IParameterInspector並將其綁定到行爲中)您可以使用方法對象BeforeCall(字符串操作名,對象[]輸入)來完成這項工作。

無論採用哪種方式,我都會反對'暫停'服務,因爲連接會從客戶端堆積起來。簡單地停止服務主機,處理客戶端中的「暫停」並在完成工作後再次啓動它可能會更好。

相關問題