【发布时间】:2012-08-10 13:56:03
【问题描述】:
在 .NET 4.0 项目中,我遇到在 System.Transactions.TransactionScope 中对 System.Web.Security.Roles.RoleExists 的调用失败,原因是我的开发计算机上未启用 MSDTC。角色管理器的数据源是 LocalDB,提供者的类型是 System.Web.Providers.DefaultRoleProvider。我已经安装了 NuGet 包 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();
}
【问题讨论】:
标签: .net asp.net-membership transactionscope msdtc localdb