Проблемы с WCF и транзакциями - PullRequest
0 голосов
/ 20 февраля 2011

Я объявил поле "_accessToken" в моей реализации сервиса и инициализировал его внутри вызова метода GetToken ().GetToken - это первый метод, вызываемый клиентом.Когда клиент впервые вызывает метод GetEmployees, аннотированный транзакцией, он возвращает данные.Он проверяет значение _accesstoken внутри метода GetEmployees, значение которого не равно нулю при первом вызове, но становится равным нулю при последующих вызовах!

В чем проблема?Может кто-нибудь сказать мне.

Договор на обслуживание:

[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 ]

1 голос
/ 21 февраля 2011

Я не уверен, что это как-то связано с транзакциями, а скорее с управлением вашими службами. Я подозреваю, что вы используете percall, и в этом случае все вызовы получают собственный экземпляр службы. Попробуйте использовать для каждой сессии, это должно решить вашу проблему.

Вот некоторые материалы для чтения: http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

НТН,

Steve

0 голосов
/ 28 января 2012

Проблема в 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 будет ожидать освобождения table1 с помощью Method1.

Лучше использовать настройки по умолчанию.Или используйте сеанс PerCall, когда экземпляр сеанса воссоздается для каждого вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...