小编Ola*_*ers的帖子

安装KB2993928后,ASP.NET MVC4解决方案无法构建

我们有一个ASP.NET MVC 4解决方案,其中有两个参考文献已经建立了大约2年没有问题.但是,在今天早上安装KB2993928KB2993937后,我们无法在Windows 7机器上运行此解决方案的FxCop.

我有一种感觉这是因为此更新更改了GAC中System.Web.Mvc程序集的DLL版本.这是因为在GAC中我现在可以找到3个不同的System.Web.Mvc DLL,它们今天都在更新.

我们在构建中收到的错误如下:

6>MSBUILD : error : CA0001 : The following error was encountered while reading module 'FrontEnd.Implementation': Assembly reference cannot be resolved: System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. [C:\Project\FrontEnd\02-Implementation\02-Implementation.csproj]
6>MSBUILD : error : CA0058 : The referenced assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' could not be found. This assembly is required for analysis and was referenced by: S:\Deliverables\FrontEnd\bin\FrontEnd.Implementation.dll. [C:\Project\FrontEnd\02-Implementation\02-Implementation.csproj]
Run Code Online (Sandbox Code Playgroud)

由于我们使用ASP.NET MVC 4,因此我们的一个引用间接引用了此3.0版DLL.例如,RazorGenerator引用了3.0.0.0版.也可能是其他人.据我所知,没有新版本的RazorGenerator.

我在GAC中看到的System.Web.Mvc版本是:3.0.50813.1,4.0.40804.0和5.0.20821.0.

我从项目中删除了对System.Web.Mvc的引用,并将Mvc添加为NuGet包.这修复了我们的编译,但由于间接引用,FxCop仍然无法正常工作.

如果需要任何其他信息,请告诉我.

msbuild asp.net-mvc gac fxcop windows-update

11
推荐指数
1
解决办法
6560
查看次数

LINQ to Entities查询需要很长时间才能编译,SQL运行速度很快

我正在编写一段代码,由同事编写,与我们公司使用的CRM应用程序连接.在这段代码中有两个LINQ to Entities查询在我们的应用程序中执行了很多次,并且我被要求优化它们,因为其中一个非常慢.

这些是查询:

第一个查询,这个编译几乎立即.它从CRM数据库获取关系信息,按应用程序给出的关系ID列表进行过滤:

from relation in context.ADRELATION
where ((relationIds.Contains(relation.FIDADRELATION)) && (relation.FLDELETED != -1))
join addressTable in context.ADDRESS on relation.FIDADDRESS equals addressTable.FIDADDRESS
   into temporaryAddressTable
from address in temporaryAddressTable.DefaultIfEmpty()
join mailAddressTable in context.ADDRESS on relation.FIDMAILADDRESS equals
   mailAddressTable.FIDADDRESS into temporaryMailAddressTable
from mailAddress in temporaryMailAddressTable.DefaultIfEmpty()
select new { Relation = relation, Address = address, MailAddress = mailAddress };
Run Code Online (Sandbox Code Playgroud)

第二个查询,编译大约需要4-5秒,并从数据库中获取有关人员的信息(再次按ID列表过滤):

from role in context.ROLE
join relationTable in context.ADRELATION on role.FIDADRELATION equals relationTable.FIDADRELATION into temporaryRelationTable
from relation in temporaryRelationTable.DefaultIfEmpty()
join personTable in …
Run Code Online (Sandbox Code Playgroud)

c# linq-to-entities sql-server-2008-r2

6
推荐指数
1
解决办法
1311
查看次数

在global.asax中设置的用户仅在下一个请求后可用

我正在使用带有Windows身份验证的ASP.NET MVC 4构建Intranet应用程序.在global.asax文件中,我实现了这个方法:

protected void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs args)
Run Code Online (Sandbox Code Playgroud)

在这个方法中,我创建一个新的ClaimsIdentity并设置args.User为它,就像在MSDN上示例.稍后在应用程序中,在其中一个控制器中,我需要从数据库中获取一些数据.由于我已经有一个执行此操作的API操作,因此我从Controller调用该API(同步).

API使用ApiController.User属性获取当前用户的声明.但是,这些声明不是我在global.asax中设置的声明.实际上,它们是在此请求之前对用户的声明.

奇怪的是(对我来说)是下次我打电话给应用程序时,新的声明到位了.所以在我的情况下,我更改后来决定哪些按钮对用户可见的声明,但只有在用户向应用程序发出另一个请求之后,才会更新这些按钮.

如何确保我在global.asax中设置的声明立即生效?

额外信息:

我没有按照每个请求设置索赔.当这个方法执行时,我检查一些事情,看看用户是否仍然有效:cookie,用户不是匿名的,用户仍然是"有效的".后者由缓存决定 - 我保留一份仍然有效的用户列表,如果有人通过用户界面更新了他们的权限,他们将失效并在下一个请求中收到新的声明.

我已经附加了一个调试器,我看到我的代码被执行,主体获得了我希望它仍然在这个方法中的所有声明.当我达到控制器操作时,ApiController.User请在此之前提出请求.当我发出另一个请求时,将跳过身份验证方法(因为用户名现在位于缓存中),并且在控制器中ApiController.User具有正确的声明.

.net asp.net asp.net-mvc claims-based-identity global-asax

5
推荐指数
1
解决办法
966
查看次数