Rob*_*gan 13 c# asp.net-membership transactions
我们正在尝试使用.来的System.Web.Providers会员管理整合到一个事务,并不断收到以下错误信息:
The operation is not valid for the state of the transaction.
Run Code Online (Sandbox Code Playgroud)
包含以下更多令人困惑的消息:
The provider did not return a ProviderManifestToken string.
Run Code Online (Sandbox Code Playgroud)
在有人要求之前,是的,我们已经验证连接字符串是正确的,并且我们用来连接到数据库的用户具有适当的权限.如果我们尝试从TransactionScope块中调用Membership.CreateUser(),它就可以工作.把它放在TransactionScope中它失败了.
关于环球提供商的信息似乎很少.几乎所有你看到的都是NuGet页面的链接和6月份Scott Hanselman的博客文章.
有没有人知道如何让System.Web.Providers参与交易?
谢谢.
这是完整的堆栈跟踪,以防它有用:
System.Data.ProviderIncompatibleException was unhandled by user code
Message=The provider did not return a ProviderManifestToken string.
Source=System.Data.Entity
StackTrace:
at System.Data.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection)
at System.Web.Providers.Entities.ModelHelper.GetStorageMetadata(String providerName, DbConnection connection, String ssdl)
at System.Web.Providers.Entities.ModelHelper.CreateMetadataWorkspace(String providerName, DbConnection connection, String csdl, String ssdl, String msl)
at System.Web.Providers.Entities.ModelHelper.CreateEntityConnection(ConnectionStringSettings setting, String csdl, String ssdl, String msl)
at System.Web.Providers.Entities.ModelHelper.CreateMembershipEntities(ConnectionStringSettings setting)
at System.Web.Providers.DefaultMembershipProvider.Membership_CreateUser(String applicationName, String userName, String password, String salt, String email, String passwordQuestion, String passwordAnswer, Boolean isApproved, DateTime& createDate, Boolean uniqueEmail, Int32 passwordFormat, Object& providerUserKey)
at System.Web.Providers.DefaultMembershipProvider.CreateUser(String username, String password, String email, String passwordQuestion, String passwordAnswer, Boolean isApproved, Object providerUserKey, MembershipCreateStatus& status)
at System.Web.Security.Membership.CreateUser(String username, String password, String email, String passwordQuestion, String passwordAnswer, Boolean isApproved, Object providerUserKey, MembershipCreateStatus& status)
at WcfLoginRegister.RegistrationService.RegisterUser(RegisterUserRequest request) in C:\Users\rmacgrogan\dev\pallas\parthenon\sandbox\FbEntityTypeTester\WcfLoginRegister\RegistrationService.svc.cs:line 43
at SyncInvokeRegisterUser(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
InnerException: System.Transactions.TransactionException
Message=The operation is not valid for the state of the transaction.
Source=System.Transactions
StackTrace:
at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction)
at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.SqlClient.SqlProviderServices.UsingConnection(SqlConnection sqlConnection, Action`1 act)
at System.Data.SqlClient.SqlProviderServices.UsingMasterConnection(SqlConnection sqlConnection, Action`1 act)
at System.Data.SqlClient.SqlProviderServices.GetDbProviderManifestToken(DbConnection connection)
at System.Data.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection)
InnerException:
Run Code Online (Sandbox Code Playgroud)
我做了一个简化的测试以更好地访问真正的底层错误,而Bahri Gungor是正确的,底层问题是MSDTC没有启用.
但是,由于我尝试在Azure项目中运行此代码,并且由于Azure不支持分布式事务,因此我使用了一种丑陋的解决方法.所有成员资格写入必须在单独的事务中发生,这是非常不幸的.
谢谢大家的帮助.
我还没有尝试将 TransactionScope 与 ASPNet 会员服务一起使用,但是,任何将打开另一个事务(甚至是与数据库的第二个连接)的任何内容都将自动初始化 MSDTC 事务。如果机器上没有配置MSDTC(我假设是你的Web服务器),则交易无法成功创建。
在“管理工具”下,有一个名为“组件服务”的管理工具(控制面板 -> 系统和安全 -> 管理工具)。该工具打开后,您将在左侧看到组件服务。打开组件服务 -> 计算机 -> 我的电脑 -> 分布式事务协调器 -> 本地 DTC(右键单击并选择属性)。选择“安全”选项卡。
确保事务管理器通信同时选中“允许入站”和“允许出站”。还应检查网络 DTC 访问。我无法对其他设置进行更具体的说明,因为您的特定环境可能需要其他变量的不同设置。
我相信发生的情况是,您对 ASPNet 会员服务(具有其自己的 SQL Server 配置)的访问正在将事务提升为 MSDTC 事务,而某些设置(MSDTC 的安全性或配置)正在阻止其成功。通过简单的 Google 搜索,您就可以找到各种 MSDTC 故障排除文献(其中许多都在 Stack Overflow 上得到了解决)。但是,我会首先检查您的组件服务配置,并确保您可以执行分布式事务。
| 归档时间: |
|
| 查看次数: |
2204 次 |
| 最近记录: |