2010-09-08 67 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