ASP.NET MVC使用Linq的奇怪缓存问题

时间:2010-09-08 05:31:48

标签: asp.net-mvc linq caching

在c#中使用asp.net MVC,我正在使用Linq调用存储过程到我的SQL Members表中。我没有在应用程序上进行内部缓存,已经检查以确保它已关闭。

测试用例: 我的用户名设置为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 db的探查器,它实际上显示了MemberByEmail的一个条目,并且返回的结果集有username = test1。

我再次通过Management Studio运行存储过程,并将test2作为用户名。我等了15分钟,每隔5个左右刷新一次网页,它从未清除并从数据库中提供正确的test2。最后一个奇怪的部分,我运行了IISReset并刷新了页面,返回了test2。

我猜这是我只是忽略了一些明显的东西。任何帮助或建议都会很棒。感谢

更新:我创建了一个控制台应用程序来取出它的网页。直接从控制台应用程序访问时问题也是一样,没有变化。

2 个答案:

答案 0 :(得分:0)

你是如何从网页上调用的?如果通过Ajax调用,IE可以帮助您缓存结果......

答案 1 :(得分:0)

花了一段时间但我们解决了这个问题。数据访问是通过我们项目中的MemberRepository完成的,我们在MembershipProvider类中加载了成员存储库。问题是MembershipProvider类在应用程序的开头加载并且从未被删除,因此所有MemberRepository调用都是通过相同的上下文完成的。奇怪的是,调用一直到SQL(如前所述,我们能够在profiler中看到请求),但是代码的大部分返回了结果集,而是使用了第一个调用结果集并将其发回给我们

因此,通过将存储库移动到所需的方法或我们的MembershipProvider,它在每次调用后被销毁并解决了问题。我不知道这是我们设置的具体内容,但希望将来可以帮助某人。