我使用此代码(其中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执行某些逻辑但是失败的机制。我想知道这是否是为什么这么长时间?
我在寻找:
SqlException
是什么意思?也许我会解决这个问题,这段代码运行得更快。感谢您的支持!
我找到了一种捕获第一次机会异常的有用方法。使用此代码:
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;。
问题:
FindByIdAsync
需要访问主表???