Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在TransactionScope中登记System.Web.Providers_C#_Transactions_Asp.net Membership - Fatal编程技术网

C# 在TransactionScope中登记System.Web.Providers

C# 在TransactionScope中登记System.Web.Providers,c#,transactions,asp.net-membership,C#,Transactions,Asp.net Membership,我们正在尝试使用System.Transactions.TransactionScope将System.Web.Providers成员身份管理集成到事务中,并不断收到以下错误消息: The operation is not valid for the state of the transaction. 在异常中包含以下更令人困惑的消息: The provider did not return a ProviderManifestToken string. 在任何人询问之前,是的,我们已验证连

我们正在尝试使用System.Transactions.TransactionScope将System.Web.Providers成员身份管理集成到事务中,并不断收到以下错误消息:

The operation is not valid for the state of the transaction.
在异常中包含以下更令人困惑的消息:

The provider did not return a ProviderManifestToken string.
在任何人询问之前,是的,我们已验证连接字符串是否正确,以及用于连接到db的用户是否具有适当的权限。如果我们尝试从TransactionScope块中调用Membership.CreateUser(),它就会工作。把它放在TransactionScope中,它就会失败

关于环球供应商的信息似乎少得惊人。你看到的几乎都是NuGet页面的链接和Scott Hanselman 6月份的博客文章

有人知道如何让System.Web.Providers参与交易吗

谢谢

以下是完整的stacktrace,以防有用:

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: 
更新 我做了一个简化的测试,以便更好地访问真正的底层错误,Bahri Gungor认为底层问题是没有启用MSDTC是正确的

然而,由于我试图在Azure项目中运行这段代码,而且Azure不支持分布式事务,所以我一直在使用一种难看的解决方法。所有成员身份写入必须在单独的事务中进行,这是非常不幸的


感谢大家的帮助。

这可能是由于您使用嵌套的TransactionScope造成的:

        using (var ts = new TransactionScope())
        {
            using(var tsInner1 = new TransactionScope())
            {
                //OOPS, I forgot to call Complete() or Rollback()
            }
            using (var tsInner2 = new TransactionScope())
            {
                //Any db action followed by a "Complete" will cause this error
                tsInner2.Complete();
            }
        }

但是,如果没有看到生成错误的代码,我无法确定。

我没有尝试将TransactionScope与ASPNet Membership Services一起使用,但是,任何将打开另一个事务(即使是与数据库的第二个连接)的操作都会自动初始化MSDTC事务。如果机器上未配置MSDTC(我假设您的web服务器),则无法成功创建事务

在管理工具下,有一个名为组件服务的管理工具(控制面板->系统和安全->管理工具)。工具打开后,您将在左侧看到组件服务。打开组件服务->计算机->我的计算机->分布式事务协调器->本地DTC(右键单击并选择属性)。选择安全选项卡

确保事务管理器通信同时选中了允许入站和允许出站。还应检查网络DTC访问。对于其他设置,我不能再详细说明了,因为您的特定环境可能需要对其他变量进行不同的设置


我相信现在发生的情况是,您对ASPNet成员资格服务(具有自己的SQL Server配置)的访问正在将事务升级为MSDTC事务,而某些设置(安全或MSDTC配置)正在阻止它成功。您可以通过简单的谷歌搜索找到各种MSDTC疑难解答文献(其中许多是通过堆栈溢出解决的)。但是,我会首先检查您的组件服务配置,并确保您可以执行分布式事务

我想知道您是否可以发布您正在尝试执行的操作的代码?看看这个,它可能有助于扫描您发布用于调用
Membership.CreateUser()
?问题的根源在于内部异常。这是一个非常普遍的异常,意味着基础事务有一些问题。。。这可能意味着MSDTC未运行或无法访问(防火墙等)。您能否尝试一个简单的“纯”SQL操作和一个事务范围,看看它是否有效?它也可能因为超时而发生。请参阅更改默认tx TimeOuts是否已正确配置组件服务以允许MSDTC事务?若要创建错误,请尝试在事务作用域一侧的asp.net成员资格提供程序(使用SQL Server的提供程序)上调用create user。此外,请确保“分布式事务协调器”在管理工具/服务下启动服务