0

.NET 4.0プロジェクトで、開発マシンでMSDTCが有効になっていないためにSystem.Web.Security.Roles.RoleExists、内への呼び出しSystem.Transactions.TransactionScopeが失敗することがあります。ロールマネージャーのデータソースはLocalDBであり、プロバイダーのタイプはです。NuGetパッケージをインストールしました。これは、ロールマネージャーのプロバイダーを提供すると思います。System.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.NETMVC4インターネットアプリケーションを作成しました。TestBundles Visual Studio 2012ソリューションをダウンロードし、アプリをデバッグして、[ログイン]リンクをクリックします。アクションでロールの検証を試みたので、マシンでMSDTCを有効にしてLoginいない限り、例外が発生するはずです。

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 に答える