UserManager.FindById很慢

7
我使用以下代码(其中上下文为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毫秒。我还通过运行“SELECT... WHERE...”查询来检查我的数据库速度——它确实很快——小于1毫秒。

我还注意到在“输出窗口”中有以下输出:

在System.Data.dll中抛出了'System.Data.SqlClient.SqlException'异常,在EntityFramework.dll中抛出了'System.Data.Entity.Core.EntityCommandExecutionException'异常。线程0x1598以代码0(0x0)退出。在iisexpress.exe(CLR v4.0.30319:/LM/W3SVC/6/ROOT-1-131126169736320764)中加载了'EntityFrameworkDynamicProxies-EntityFramework'和'EntityFrameworkDynamicProxies-ObjectModelLayer',以及'Microsoft.AspNet.Identity.EntityFramework'。
上面的输出是从我的计算机执行此行代码的时间开始收集的:
ApplicationUser appUser1 = await userManager.FindByIdAsync("My user id");

在其他代码行中,输出窗口是空的。(这可以解释它们之所以如此迅速的原因)。

正如您所看到的,许多SqlException在此代码行中抛出。对我来说,这似乎是一种“重试”机制,不断尝试执行某些逻辑,但失败了。我在想这是否是导致需要这么长时间的原因?

我正在寻找:

  1. 查看确切的SqlException是什么?也许我会修复它,这个代码就会运行得更快。
  2. 如何修复FindByIdAsync以使其每次都能快速工作(<5秒)?

感谢您的支持!

更新

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

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

所以,我运行了代码并收集了抛出的异常。18次中有18次是以下异常:

服务器主体“XXX”无法在当前安全上下文下访问数据库“master”。服务器“XXX.net”上的数据库“master”当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并提供“XXXXXXX-68E9-4FDD-9E3D-92BE27438835”的会话跟踪 ID。用户“XXX”登录失败。

我的用户确实没有权限访问“master”表格。所以这很合理。我将我的数据库连接字符串更改为拥有访问权限的另一个用户 - 现在它工作得非常快!(不到3秒)。

授权正确之后,日志中仍然会出现以下异常(7次):

无效的对象名称“dbo.EdmMetadata”。

问题:

  1. 我不明白为什么函数FindByIdAsync需要访问master表格???
  2. 如何修复错误“无效的对象名称‘dbo.EdmMetadata’。”?
1个回答

1

6年后,我仍然在使用最新的身份验证和实体框架库时遇到类似的问题。第一次调用userManager.Get [Something] 大约需要5秒钟; 后续调用只需要3-10毫秒。 这是不是因为身份验证在第一次调用时尝试检查/重新创建底层数据库?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接