C# 从事务中排除操作
给定启用了事务流的事务感知绑定和具有TransactionFlowOption.Allowed的操作Op1,是否可以使从操作Op1调用的其他操作Op2不参与事务,以便在操作Op1中出现故障时,任何操作Op2都不会回滚 插图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
// 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;
}
注:
您可以使用
TransactionScope选项。在TransactionScope中抑制:
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
{
AuditServiceProxy.Write("Authentication failed for user " + username);
}
或者将此抑制代码放入非TransactionAllogingService
方法调用中感谢Mitch的帮助。我已经试过了,而且成功了。我觉得有点傻-应该问问自己TransactionScopeOption.Suppress做了什么:)很抱歉。。。错误的按钮我想投赞成票,但现在得到一条信息:你上一次投票是在7小时前。除非编辑此答案,否则您的投票现在已锁定。似乎被一个愚蠢的功能卡住了:(如果你知道一个解决方案,请通知我。我差点错过了,下次再提我的名字,希望下次不会有…+1是非常简单的答案。