Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# 从事务中排除操作_C#_.net_Wcf - Fatal编程技术网

C# 从事务中排除操作

C# 从事务中排除操作,c#,.net,wcf,C#,.net,Wcf,给定启用了事务流的事务感知绑定和具有TransactionFlowOption.Allowed的操作Op1,是否可以使从操作Op1调用的其他操作Op2不参与事务,以便在操作Op1中出现故障时,任何操作Op2都不会回滚 插图 // Op1: LogOnUser OperationBehavior(TransactionScopeRequired = true)] public bool LogOnUser(String username, String password) { // Aud

给定启用了事务流的事务感知绑定和具有TransactionFlowOption.Allowed的操作Op1,是否可以使从操作Op1调用的其他操作Op2不参与事务,以便在操作Op1中出现故障时,任何操作Op2都不会回滚

插图

// Op1: LogOnUser
OperationBehavior(TransactionScopeRequired = true)]
public bool LogOnUser(String username, String password)
{
    // AuditWriteProxy declaration and instantiation
    var valid = false;

    /* Validation logic */

    // If validation failed
    if(!valid)
    {
        // Invoke an op in an Audit Service. 
         // Op2 = AuditService.Write
        // **MUST NOT BE ROLLED BACK EVEN AFTER WE [throw]**
       AuditServiceProxy.Write("Authentication failed for user " + username);

        throw new FaultException<AuthenticationFault>("Validation failed");
        // After throw, we expect everything transactional to rollback
    }

    AuditServiceProxy.Write("User " + username + " authenticated successfully");

    return true;
}
//Op1:LogOnUser
操作行为(TransactionScopeRequired=true)]
public bool LogOnUser(字符串用户名、字符串密码)
{
//AuditWriteProxy声明和实例化
var-valid=false;
/*验证逻辑*/
//如果验证失败
如果(!有效)
{
//在审核服务中调用op。
//Op2=AuditService.Write
//**即使在我们【投掷】之后,也不得回滚**
AuditServiceProxy.Write(“用户身份验证失败”+用户名);
抛出新的FaultException(“验证失败”);
//抛出后,我们希望所有事务都回滚
}
AuditServiceProxy.Write(“用户”+用户名+“已成功验证”);
返回true;
}
注:

  • AuditService.Write操作使用msmq绑定,是单向的
  • 我在AuditService上尝试了TransactionFlowOption.NotAllowed。在实现上写入操作契约以及TransactionScopeRequired=false

  • 您可以使用
    TransactionScope选项。在
    TransactionScope中抑制

    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
       AuditServiceProxy.Write("Authentication failed for user " + username); 
    } 
    

    或者将此抑制代码放入
    非TransactionAllogingService
    方法调用中

    感谢Mitch的帮助。我已经试过了,而且成功了。我觉得有点傻-应该问问自己TransactionScopeOption.Suppress做了什么:)很抱歉。。。错误的按钮我想投赞成票,但现在得到一条信息:你上一次投票是在7小时前。除非编辑此答案,否则您的投票现在已锁定。似乎被一个愚蠢的功能卡住了:(如果你知道一个解决方案,请通知我。我差点错过了,下次再提我的名字,希望下次不会有…+1是非常简单的答案。