2010-09-17 79 views
2

我的要求緩存ASP.NET用戶是從背後ASP.NET代碼中調用WCF Web服務,並通過一些數據,例如:WCF服務中的相關數據

操作
void Add(int x, int y); 

結果應該以某種方式存儲內WCF Web服務(成員變量)。 後來用戶應該能夠調用

double Equals(); 

,並獲得操作的結果。當然,因爲它是一個開放的網站,許多未經過身份驗證的用戶可以打開ASP.NET頁面並調用Web服務。

或者添加方法可以返回一個可用於獲取結果返回「鍵」,例如:

Guid Add(int x, int y); 
double Equals(Guid key); 

我不認爲我可以使用WCF會話,因爲Web服務會認爲只有一個客戶端(Web站點調用IIS中託管的webserivce)。
用戶未通過身份驗證 - 他們是匿名用戶。


我可以使用:(請看看我的編輯)

InstanceContextMode =InstanceContextMode.Single 

的屬性在我的web服務和存儲Dictionary<key, result>但問題是我何時可以從字典中刪除的條目?
我應該使用某種BackgroundWorker來檢查字典嗎? 15分鐘,並刪除舊條目?在這種情況下,我將不得不存儲日期時間對每個條目,但這不是一個問題,如果這是實施此解決方案的最佳方式...

我的示例添加/等方法只是爲了說明問題,真正的需求需要每個用戶更多的數據存儲比簡單double結果

預先感謝所有幫助。

編輯:
考慮更多的InstanceContextMode =InstanceContextMode.Single後,我認爲這不是與ASP.NET使用,因爲如果100個用戶將調用Web服務,同時我會得到100個連續調用這將是最好的選擇導致性能問題。
在這種情況下,你有沒有任何想法如何實現這一點,而無需更改InstanceContextMode設置(默認情況下,PerSession據我所知)?

回答

0

我認爲,保持

InstanceContextMode =InstanceContextMode.Single 

的服務行爲,如果你的建築許可,您可以使用一個靜態類實現的System.Web.Caching.Cache對象(因此,這將是一次實例化),在那裏你可以指定緩存依賴性/到期時間等,因此您可以獲得緩存服務提供的完整功能集,而不是自行實施。

編輯: 如果您的主要目的是關於緩存,那麼您甚至不需要使用實例上下文模式。你可以簡單地實現自己的靜態緩存提供商基礎上System.Web.Caching.Cache並通過cacheKey如下面的示例所示:

public int Add(int a, int b) 
     { 
      string cacheKey = a.ToString()+b.ToString(); 
      if (!CacheProvider.Contains(cacheKey)) 
      { 
       CacheProvider.Add(cacheKey, a + b); 
       return a + b; 
      } 
      else 
      { 
       return (int)CacheProvider.GetValue(cacheKey); 
      } 

     } 

的CacheProvider在上面的代碼是靜態實現您的緩存提供商。

+0

感謝您的回覆。我正在考慮InstanceContextMode.Single,現在我想我不能使用它...請參閱我的編輯瞭解更多詳細信息。如果您有任何其他想法如何實施,請讓我知道。謝謝 – Lucas 2010-09-17 10:49:21

+0

您可以考慮更改節流行爲和併發模式。 – 2010-09-17 10:56:31

+0

請參閱我以前的答案的編輯,如果解決方案可以解決您的問題,那麼請不要忘記標記爲答案:-)) – 2010-09-17 11:36:04