在 .NET 4.0 项目中,由于我的开发机器上未启用MSDTC,我遇到了对 inside 的调用System.Web.Security.Roles.RoleExists
失败。角色管理器的数据源是 LocalDB,提供者的类型是。我已经安装了 NuGet package ,我相信它提供了角色管理器的提供程序。System.Transactions.TransactionScope
System.Web.Providers.DefaultRoleProvider
Microsoft.AspNet.Providers.LocalDB
是什么导致需要 MSDTC?
代码
失败的调用:
using (var ts = new TransactionScope())
{
Roles.RoleExists("Administrator");
}
web.config 中的相关配置部分:
<connectionStrings>
<clear />
<add name="MembershipConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=MyDB;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\mydb.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>
<roleManager enabled="true" defaultProvider="DefaultRoleProvider">
<providers>
<remove name="AspNetSqlRoleProvider" />
<add connectionStringName="MembershipConnection" applicationName="/" name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</providers>
</roleManager>
测试项目
我创建了一个测试 ASP.NET MVC 4 Internet 应用程序来演示该问题。下载TestBundles Visual Studio 2012 解决方案,调试应用程序并单击“登录”链接。由于我已经使该Login
操作尝试验证角色,除非您在计算机上启用了 MSDTC,否则您应该会收到异常。
public ActionResult Login(string returnUrl)
{
using (var ts = new TransactionScope())
{
Roles.RoleExists("Administrator");
}
ViewBag.ReturnUrl = returnUrl;
return View();
}