UserManager.FindById很慢

时间:2016-07-10 09:45:15

标签: c# asp.net asp.net-identity asp.net-membership

我使用此代码(其中context是OAuthGrantCustomExtensionContext):

var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
ApplicationUser appUser1 = await userManager.FindByIdAsync("My user id"); // 31 seconds to execute
ApplicationUser appUser2 = await userManager.FindByIdAsync("My user id"); // 1 milisecond to execute

第一次执行FindByIdAsync函数需要31秒。在第二次执行时,它只需要<1 MS。我还通过运行&#34; SELECT ... WHERE ...&#34;来检查我的数据库有多快。查询 - 它真的很快 - &lt; 1 MS。

我也在输出窗口&#34;中找到了这个输出:

  

抛出异常:&#39; System.Data.SqlClient.SqlException&#39;在   抛出System.Data.dll异常:&#39; System.Data.SqlClient.SqlException&#39;   在System.Data.dll抛出异常:   &#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll异常中   抛出:&#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll中   抛出异常:&#39; System.Data.SqlClient.SqlException&#39;在   抛出System.Data.dll异常:&#39; System.Data.SqlClient.SqlException&#39;   在System.Data.dll抛出异常:   &#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll异常中   抛出:&#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll中   抛出异常:&#39; System.Data.SqlClient.SqlException&#39;在   抛出System.Data.dll异常:&#39; System.Data.SqlClient.SqlException&#39;   在System.Data.dll抛出异常:   &#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll异常中   抛出:&#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll中   线程0x1598已退​​出,代码为0(0x0)。抛出异常:   &#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll异常中   抛出:&#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll中   抛出异常:&#39; System.Data.SqlClient.SqlException&#39;在   抛出System.Data.dll异常:&#39; System.Data.SqlClient.SqlException&#39;   在System.Data.dll抛出异常:   &#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll异常中   抛出:&#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll中   抛出异常:&#39; System.Data.SqlClient.SqlException&#39;在   抛出System.Data.dll异常:&#39; System.Data.SqlClient.SqlException&#39;   在System.Data.dll抛出异常:   &#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll异常中   抛出:&#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll中   抛出异常:&#39; System.Data.SqlClient.SqlException&#39;在   抛出System.Data.dll异常:&#39; System.Data.SqlClient.SqlException&#39;   在System.Data.dll抛出异常:   &#39; System.Data.Entity.Infrastructure.RetryLimitExceededException&#39;在   EntityFramework.dll&#39; iisexpress.exe&#39; (CLR v4.0.30319:   / LM / W3SVC / 6 / ROOT-1-131126169736320764):已加载   &#39; EntityFrameworkDynamicProxies-的EntityFramework&#39 ;.抛出异常:   &#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll异常中   抛出:&#39; System.Data.SqlClient.SqlException&#39;在System.Data.dll中   抛出异常:&#39; System.Data.SqlClient.SqlException&#39;在   抛出System.Data.dll异常:&#39; System.Data.SqlClient.SqlException&#39;   在System.Data.dll抛出异常:   &#39; System.Data.Entity.Core.EntityCommandExecutionException&#39;在   抛出EntityFramework.dll异常:   &#39; System.Data.Entity.Core.EntityCommandExecutionException&#39;在   抛出EntityFramework.dll异常:   &#39; System.Data.Entity.Core.EntityCommandExecutionException&#39;在   抛出EntityFramework.dll异常:   &#39; System.Data.Entity.Core.EntityCommandExecutionException&#39;在   EntityFramework.dll&#39; iisexpress.exe&#39; (CLR v4.0.30319:   / LM / W3SVC / 6 / ROOT-1-131126169736320764):已加载   &#39; EntityFrameworkDynamicProxies-ObjectModelLayer&#39 ;. &#39; iisexpress.exe&#39;   (CLR v4.0.30319:/ LM / W3SVC / 6 / ROOT-1-131126169736320764):已加载   &#39; EntityFrameworkDynamicProxies-Microsoft.AspNet.Identity.EntityFramework&#39;

上面的输出是从我的机器执行此行的时间收集的:

ApplicationUser appUser1 = await userManager.FindByIdAsync("My user id");

在其他代码行中,输出窗口为空。 (这可以解释为什么它们如此之快)。

正如您所看到的,在此代码行中抛出了很多SqlException。在我看来,它似乎是一个&#34;重试&#34;尝试使用agian和agian执行某些逻辑但是失败的机制。我想知道这是否是为什么这么长时间?

我在寻找:

  1. 如何看待这个SqlException是什么意思?也许我会解决这个问题,这段代码运行得更快。
  2. 如何修复FindByIdAsync以使其每次都快速运行(<5秒)?
  3. 感谢您的支持!

    更新

    我找到了一种捕获第一次机会异常的有用方法。使用此代码:

    AppDomain.CurrentDomain.FirstChanceException +=
    (object source, FirstChanceExceptionEventArgs e) =>
    {
        Console.WriteLine("FirstChanceException event raised in {0}: {1}", AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
    };
    

    所以,我运行代码并收集抛出的异常。得到以下例外18次:

      

    服务器主体&#34; XXX&#34;无法访问数据库&#34; master&#34;   在当前的安全背景下。数据库&#39; master&#39;在服务器上   &#39; XXX.net&#39;目前无法使用。请重试连接   后来。如果问题仍然存在,请联系客户支持并提供   他们的会话跟踪ID为&#39; XXXXXXX-68E9-4FDD-9E3D-92BE27438835&#39;。   用户登录失败&#39; XXX&#39;。

    我的用户真的不被允许访问&#34; master&#34;表。所以,这是有道理的。我将我的数据库连接字符串更改为另一个有权访问&#34; master&#34;桌子 - 现在它工作得很快! (不到3秒)。

    在给出正确的权限后,我仍然在日志中遇到此异常(7次):

      

    无效的对象名称&#39; dbo.EdmMetadata&#39;。

    问题:

    1. 我不明白为什么函数FindByIdAsync需要访问主表???
    2. 如何解决错误&#34;无效的对象名称&#39; dbo.EdmMetadata&#39;。&#34;?

0 个答案:

没有答案