2010-09-08 70 views
0

在c#中使用asp.net MVC,我使用Linq將存儲過程調用到我的SQL成員表中。我沒有內部緩存的應用程序,已經檢查,以確保它關閉。使用Linq ASP.NET MVC奇怪的緩存問題

測試案例: 我將我的用戶名設置爲test1。在網站上,我將用戶名更改爲test2。該網站仍顯示test1。我去了Management Studio並運行名爲MemberByEmail的存儲過程,它正確顯示了test2。

我開始簡單,刷新我的頁面,看看它是否是瀏覽器緩存,仍然是test1。我去調試和遍歷代碼,並發現它去正確地一路這裏調用數據庫:

/// <summary>Method that is mapped to the dbo.MemberByEmail database procedure.</summary> 
    /// <returns></returns> 
    [System.Data.Linq.Mapping.Function(Name="dbo.MemberByEmail")] 
    public System.Data.Linq.ISingleResult<BookCrossing.Data.Member> MemberByEmail(
     [System.Data.Linq.Mapping.Parameter(DbType="nvarchar(100)")] string email) 
    { 
     var methodInfo = (System.Reflection.MethodInfo)System.Reflection.MethodInfo.GetCurrentMethod(); 
     var result = this.ExecuteMethodCall(this, methodInfo, email); 

     return ((System.Data.Linq.ISingleResult<BookCrossing.Data.Member>)(result.ReturnValue)); 
    } 

我打開探查我的SQL數據庫,它實際上顯示MemberByEmail條目,並且返回的結果集具有username = test1。

我再次通過Management Studio運行存儲過程,並且它以test2作爲用戶名。我等了15分鐘,每隔5次刷新一次網頁,並且它從未清除過,並從db中提供正確的test2。最後一個奇怪的部分,我運行IISReset並刷新頁面,test2被返回。

我猜這個我只是忽略了一些明顯的東西。任何幫助或建議都會很棒。謝謝

更新:我創建了一個控制檯應用程序來取出它的web部分。直接從控制檯應用程序訪問時,問題也是一樣,沒有變化。

+0

您是否緩存網頁?在頁面指令中,您可以設置緩存... – 2010-09-08 05:41:39

+0

感謝您的評論。頁面緩存已關閉。我已經開啓了調試過程,並逐步排除了這一過程,並將其排除在外。它一路走到SQL(探查器有它的記錄),當它回來時,我可以用username = test1而不是test2來查看我的成員對象。 – Matt 2010-09-08 12:53:16

回答

0

花了一段時間,但我們得到了這個解決。數據訪問是通過項目中的MemberRepository完成的,我們在MembershipProvider類中加載了成員資源庫。問題是MembershipProvider類在應用程序的開始時被加載並且從未被移除,因此所有MemberRepository調用都是通過相同的上下文完成的。奇怪的部分是調用一直到SQL(正如我們可以在Profiler中看到的那樣),但是代碼的結尾部分取回了結果集,但是使用了第一個調用結果集並將其發回給我們。

因此,通過將存儲庫移動到所需的方法或我們的MembershipProvider中,它在每次調用後都被銷燬並解決了問題。我不知道這是特定於我們的設置,但希望它能幫助未來的人。

0

你是怎麼從網頁調用這個的?如果通過Ajax調用,IE可以幫你緩存結果...

+0

這個不是由Ajax調用的,它是整個頁面重新加載的一部分。 – Matt 2010-09-08 12:50:45