Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC EF一直在寻找代价高昂的用户ID_C#_Sql Server_Asp.net Mvc_Performance_Entity Framework - Fatal编程技术网

C# MVC EF一直在寻找代价高昂的用户ID

C# MVC EF一直在寻找代价高昂的用户ID,c#,sql-server,asp.net-mvc,performance,entity-framework,C#,Sql Server,Asp.net Mvc,Performance,Entity Framework,也许我的代码中有一些错误的逻辑,但我在C#中首先使用了最新的MVC EF代码。当我查看sql profiler和昂贵的查询时,我注意到它正在获取如下查询: exec sp_executesql N'SELECT [UserId] FROM [Users] WHERE (UPPER([Email]) = @0)', N'@0 nvarchar(71)',@0=N'myRegisteredEmail@someDomain.com' 这是不是因为我经常请求WebSecurity.CurrentUse

也许我的代码中有一些错误的逻辑,但我在C#中首先使用了最新的MVC EF代码。当我查看sql profiler和昂贵的查询时,我注意到它正在获取如下查询:

exec sp_executesql N'SELECT [UserId] FROM [Users] WHERE (UPPER([Email]) = @0)',
N'@0 nvarchar(71)',@0=N'myRegisteredEmail@someDomain.com'
这是不是因为我经常请求
WebSecurity.CurrentUserId
?我以为只要一次就好了?(但我在一页中看到多个调用)。可能每个对
WebSecurity.CurrentUserId
的请求都会导致系统从数据库中获取ID,并将
Email
作为识别用户的主要案例(我希望不是这样)

我有一些查询,其中一些外键是用户,
users
表的主键是
UserId
,而不是email。为什么它会一直试图通过电子邮件取回它呢?所以我也有了这个想法

因此,我无法追查它会多次出现的原因


最后,这些查询需要四分之一秒的时间。添加几次,页面加载速度就会非常慢。

根据您给出的内容,它看起来像WebSecurity.CurrentUserId每次都调用数据库。为了最小化数据库调用,应该将该值存储到会话变量中。查看以前关于会话安全性的讨论


如果您的应用程序(例如银行web应用程序)中的安全性是最高的,那么您可以考虑使会话安全性更加健壮

如果您拥有最新的MVC+EF,这是否意味着您也在使用最新的身份框架Microsoft.AspNet.identity

如果是这样,您可以按如下方式获取用户id:

User.Identity.GetUserId();
…其中,用户是控制器、HttpContext等的IPrincipal。我非常确定,为了实现这一点,您必须使用OWIN代替FormsAuthentication


这不会每次都命中数据库,因为用户id存储为声明;OWIN IPrincipal是ClaimsPrincipal。

WebSecurity.CurrentUserId的代码是什么?它可能每次都在调用数据库。@rikitikitik好吧,我不知道,这是来自系统的值,我对它没有控制权。如果是这样的话,你可能应该将得到的值存储到会话中,这样你就不会一直调用它了。如果不知道CurrentUserId中发生了什么,我们对此无能为力。@rikitikitik我需要知道的最后一件事是:将CurrentUserId存储到会话中是否安全?例如,我将使用新方法查询该用户的好友列表:会话中的值。它是否可以被恶意更改,从而访问该用户的所有数据,或者我可以相信它会像以前一样安全,每次我需要它时都会拉CurrentUserId?如果安全级别没有降低,请复制粘贴您在上一条评论中所说的内容,我很乐意接受这一正确答案。请查看。我尝试了基于会话的方法,它对特定应用程序非常有用,tho它不适用于signalr hubs:/从技术上讲,如果您不使用self-host,您可以让session与signalr一起使用,尽管这既不简单,也不推荐。您是对的,我没有使用asp.net.identity,它似乎没有给出任何建议,而是提供了更多关于如何开发我即将推出的项目的想法。我将很快用signalr测试它,它是我应用程序的主要工具之一,希望它也能使用:)谢谢你的回答:)另一个选择是将用户ID写入加密的cookie,signalr可以访问该cookie,因为它是随web请求而来的。但是,我有一种强烈的感觉,如果您使用OWIN+Microsoft.AspNet.Identity,您将不必这样做。感谢您的回复,是的,我确实希望我将使用Identity的下一个项目,我将与Signal保持良好关系。不过,我肯定会看看我当前的加密cookie,因为我不会将其升级为identity。再次感谢。你真的很擅长为我指出重要的事情。是的,我终于找到了时间并进行了测试,信号员对新的身份系统做得很好。非常感谢。