WCF和事务处理的问题
我已经在服务实现中声明了字段“\u accessToken”,并在方法调用GetToken()中初始化它。GetToken是客户端调用的第一个方法。当客户端第一次调用带有事务注释的GetEmployees方法时,它返回数据。它检查GetEmployees方法中的_accesstoken值,该值在第一次调用期间不为null,但在后续调用中变为null 有什么问题?谁能告诉我 服务合同:WCF和事务处理的问题,wcf,Wcf,我已经在服务实现中声明了字段“\u accessToken”,并在方法调用GetToken()中初始化它。GetToken是客户端调用的第一个方法。当客户端第一次调用带有事务注释的GetEmployees方法时,它返回数据。它检查GetEmployees方法中的_accesstoken值,该值在第一次调用期间不为null,但在后续调用中变为null 有什么问题?谁能告诉我 服务合同: [ServiceContract(SessionMode = SessionMode.Required)] pu
[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
}
}
我不确定这是否与事务有关,而是与您的服务实例管理有关。我怀疑您正在使用percall,在这种情况下,所有调用都会获得自己的服务实例。尝试使用每个会话,这将解决您的问题 以下是一些阅读材料: 嗯, Steve问题在于ServiceBehaviorAttributeReleaseServiceInstanceOnTransactionComplete,默认设置为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会话