2011-08-17 58 views
1

我有一個攔截器,從WCF請求的消息頭中選取數據。請看下圖:您可以在WCF中使用訪問HttpContext.Current.Items的靜態方法嗎?

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
{ 
    _CurrentRequest = request; 
    SetupSecurityPrincipal(); 
    ThreadExtension.PersonID = GetIntHeader(HeaderKeys.PersonID); 
    return null; 
} 

ThreadExtension(忽略的名字,意味着什麼)是提供一個get /設置爲HttpContext.Current靜態屬性的類。請看下圖:

public class ThreadExtension 
{ 
    public static int? PersonID 
    { 
     get { return (int?)HttpContext.Current.Items["PersonID"]; } 
     set { HttpContext.Current.Items["PersonID"] = value; } 
    } 
} 

所以,問題是從我們的Web請求結束我們的WCF Web服務,有時ThreadContext變化的信息,如果我們有2個要求是足夠接近發生一起,造成一人在另一數據人的會議。

所以我的問題是,我們做錯了什麼?這裏使用靜態屬性不是正確的方法嗎?理想情況下,我們只需要一些與WCF中的請求相關的東西,這樣我們就可以在幾個地方找到它,而無需一直傳遞數據。

任何幫助或建議,你可以提供將不勝感激。

+0

爲什麼該屬性是靜態的,如果它依賴於會話? – Yahia

+0

我們正嘗試在一次呼叫的整個生命週期中訪問這些值,而不必爲每個呼叫傳遞值。我可能會想到這個錯誤,但我的印象是靜態屬性是一個傳遞給HttpContext。有沒有更好的辦法? –

+1

您的WCF是否使用會話(例如使用netTCP綁定)?您如何將「PersonID」與整個通話相關聯?任何不直接使用HttpContext.Current.Items [「PersonID」]的理由? – Yahia

回答

2

犯罪嫌疑人行:

_CurrentRequest = request; 

WCF消息督察通常是單身所以實例變量實際是靜態的。設置這個,然後從課程的其他地方讀取標題將導致你看到的非確定性行爲。

+2

是的,工作。謝謝你隨機的陌生人......我欠你一個。 –

相關問題