Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
WCF和事务处理的问题_Wcf - Fatal编程技术网

WCF和事务处理的问题

WCF和事务处理的问题,wcf,Wcf,我已经在服务实现中声明了字段“\u accessToken”,并在方法调用GetToken()中初始化它。GetToken是客户端调用的第一个方法。当客户端第一次调用带有事务注释的GetEmployees方法时,它返回数据。它检查GetEmployees方法中的_accesstoken值,该值在第一次调用期间不为null,但在后续调用中变为null 有什么问题?谁能告诉我 服务合同: [ServiceContract(SessionMode = SessionMode.Required)] pu

我已经在服务实现中声明了字段“\u 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
    }
}

我不确定这是否与事务有关,而是与您的服务实例管理有关。我怀疑您正在使用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会话