0

在 .NET 4.0 项目中,由于我的开发机器上未启用MSDTC,我遇到了对 inside 的调用System.Web.Security.Roles.RoleExists失败。角色管理器的数据源是 LocalDB,提供者的类型是。我已经安装了 NuGet package ,我相信它提供了角色管理器的提供程序。System.Transactions.TransactionScopeSystem.Web.Providers.DefaultRoleProviderMicrosoft.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();
}
4

1 回答 1

1

我遇到了同样的问题。然后我发现这只发生在第一次初始化会员资格时。如果您在进入 TransactionScope 之前对任何 Membership 方法进行任何调用,它将不必初始化并提升为 DTC。

作为一个小技巧(效果很好),将以下内容添加到您的应用启动中:

    protected void Application_Start()
    {
        Membership.GetNumberOfUsersOnline();
    }

这将导致成员资格被初始化,然后您将不必从那时起在事务范围内登记 DTC。

于 2013-03-01T12:43:09.780 回答