我在服务实现中声明了字段“_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
}
}
答案 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会话。