【问题标题】:Why does System.Web.Security.Roles.RoleExists in combination with LocalDB source require MSDTC?为什么 System.Web.Security.Roles.RoleExists 结合 LocalDB 源需要 MSDTC?
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多