簡體   English   中英

使用CallContext為WCF存儲HttpContext

[英]Using the CallContext to store the HttpContext for WCF

我目前有一個WCF服務,用於執行一些數據庫查詢和發送郵件。 長話短說,這兩種方法都是異步使用HttpContext.Current實現的。

我的最初問題是,在第一次awaitHttpContext.Current變為null,因此第二次操作失敗。 我現在在Google上搜索了幾個小時,然后測試了所有發現的內容...自定義同步上下文,web.config中的appSettings,針對.NET 4.5,啟用了ASP.NET兼容性,但沒有任何效果。

然后,我發現這篇關於CallContext 帖子 基本上,這個想法是將HttpContext.Current存儲在CallContext 我進行了測試,並把它工作了。 但是,由於我CallContext知道什么是CallContext ,因此我進行了閱讀。

我不確定我是否真正正確地理解了所有內容,但是閱讀后,我會感到擔憂。 我可能是錯的,但似乎無法保證異步調用完成后恢復的線程與初始線程相同。 問題是我在HttpContext存儲了多個值,並且恐怕第一個方法使用用戶A值執行,然后,一旦異步調用完成,第二個方法將使用用戶B值執行(如HttpContext會不一樣)。

我想人們會很想告訴我只將這些值存儲在CallContext但是在遇到WCF問題之前我創建了一個完整的體系結構,所以我不想對其進行全面的審查,這就是為什么CallContext可以派上用場的原因變化很小。

有人可以告訴我我的理論是否正確?

您應該更改服務,以使其不依賴於HttpContext.Current 最好不要完全依賴HttpContext

HttpContext.Current是UI線程的服務器端等效項。 只是不要在不需要依賴它的代碼上使用它。

WCF幾乎是完整的SOA體系結構,具有多種協議支持,並且所有內容都是可配置的,此外您還可以擴展自定義所有內容。 因此,獲取所有信息非常棘手。

WCF 並發的三種類型是:

單個 :單個請求可以在給定的時間訪問WCF服務對象。

多個 :在這種情況下,WCF服務對象可以在任何給定時間處理多個請求。

可重入 :單個請求線程可以訪問WCF服務對象,但是該線程可以退出WCF服務以調用另一個WCF服務,或者還可以通過回調和重新進入WCF客戶端而沒有死鎖。

看起來很簡單,但是請等待它具有不同於並發的 實例化 模式

-每次調用為每個客戶端請求創建一個新的InstanceContext(以及服務對象)。

-每個會話都會為每個新的客戶端會話創建一個新的InstanceContext(並因此創建服務對象),並在該會話的生命周期內進行維護(這需要支持會話的綁定)。

-單個實例 :單個InstanceContext(以及因此的服務對象)在應用程序的生存期內處理所有客戶端請求。

默認實例模式為每會話,默認並發模式為單個

這意味着對於WCF服務,直到您更改服務為止,該服務僅具有一個實例上下文,一次最多允許一個線程在該實例上下文中處理消息。 希望使用相同實例上下文的其他線程必須阻塞,直到原始線程退出實例上下文為止

因此,您擔心的事情似乎是不可能的,除非您對此進行了代碼更改並希望它能夠實現。

有關更多詳細信息,請參見: MSDN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM