WCF和事务的问题

时间:2011-02-20 17:17:58

标签: wcf

我在服务实现中声明了字段“_accessToken”,并在方法调用GetToken()中初始化它。 GetToken是客户端调用的第一个方法。当客户端第一次调用以事务注释的GetEmployees方法时,它返回数据。它检查GetEmployees方法中的_accesstoken值,该方法在第一次调用期间不为null但在后续调用中变为null!

有什么问题?谁能告诉我。

服务合同:

[ServiceContract(SessionMode = SessionMode.Required)]
public interface IEmployeeService
{
    [OperationContract]
    LoginResponse Getoken(LoginRequest request);

    [OperationContract]
    [TransactionFlow(TransactionFlowOption.Mandatory)]    
    EmployeeResponse GetEmployees(EmployeeRequest request);
}

服务实施

private string _accessToken;

public TokenResponse GetToken(TokenRequest request)
{
    _accessToken = new Guid();
}

[OperationBehavior(TransactionScopeRequired = true,TransactionAutoComplete = true)] 
public EmployeeResponse GetEmployees(EmployeeRequest request)
{
    if (_accessToken != null)
    {
         // Do processing
    }
}

2 个答案:

答案 0 :(得分:1)

我不确定这与事务有什么关系,而是与服务实例管理有关。我怀疑你正在使用percall,在这种情况下,所有调用都会获得自己的服务实例。尝试使用每个会话,这应该可以解决您的问题。

以下是一些阅读材料:http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

HTH,

史蒂夫

答案 1 :(得分:0)

问题出在 ServiceBehaviorAttribute ReleaseServiceInstanceOnTransactionComplete 中,默认情况下设置为true。启用该属性时,服务实例将在任何事务后被销毁。

您可以将该属性设置为false,但是它会产生非常复杂的解决方案,是糟糕的架构。 例如,您的服务有两种方法:

public void Method1()
{
 //transaction
 //use data base resources table1;
}
public void Method2()
{
 //transaction
 //use data base resources table1;
}

如果客户端调用Method1,然后调用Method2,在某些情况下可能会出现死锁,或者Method2将等待Method1释放table1。

更好地使用默认设置。或者在为每次调用重新创建会话实例时使用PerCall会话。