2011-03-27 16 views
2

如果我創建一個實現IParameterInspector的類,並使用自定義的ServiceBehavior將其插入到WCF管道中,調用BeforeCall和AfterCall時將使用該類的同一個實例嗎?換句話說,我可以在BeforeCall期間建立關於當前調用的狀態,我可以在AfterCall中訪問,並確保響應會來到同一個實例嗎?WCF會使用相同的ParameterInspector實例來處理BeforeCall和AfterCall嗎?

請注意下面示例代碼中的_stateValue?我能依賴這樣的機制嗎?

class OperationParameterInspector : IParameterInspector 
{ 
    public int _stateValue; 

    public object BeforeCall(string operationName, object[] inputs) 
    { 
     _stateValue = (int) inputs[0]; 
     return null; 
    } 

    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState) 
    { 
     int originalInput = _stateValue; 
     return; 
    } 
} 
+1

我對此的思考越多,似乎所有請求中只有一個類的實例,這意味着內部狀態不起作用,因爲所有請求和響應都將通過,可能在多個線程中傳遞。如果任何人都瞭解如何在傳入的WCF請求之前和之後在管道中建立和維護狀態,我想在此討論它。 – Christopher 2011-03-27 16:42:04

+1

[Make Object ID](http://blogs.msdn.com/b/zainnab/archive/2010/03/04/make-objectid-vstipdebug0015.aspx)在嘗試確定這類問題時非常有用。 – Will 2011-03-27 16:44:42

+0

我也不知道這種行爲。即使每次調用都將服務配置設置爲實例,截取也會發生在單個實例上。很難預測。幾個美好的日子,把我的頭撞到牆上。 – 2016-11-10 11:57:56

回答

2

相關的特定呼叫穿過狀態是從BeforeCall的返回值和AfterCallcorrelationState參數的目的。 WCF基礎結構確保在操作完成後,您從BeforeCall返回的任何對象將通過correlationState傳遞到AfterCall

隨着您的後續評論的建議,在檢查器對象中使用實例狀態的問題是在某些情況下可能會在併發請求之間共享實例。但是,我不認爲在BeforeCall和AfterCall中有不同的參數檢查器對象會提供單個操作請求。

相關問題