Запрет перекрывающихся вызовов службы из приложения ASP.NET при обновлении сеанса службы - PullRequest
1 голос
/ 13 марта 2012

У меня есть веб-приложение ASP.NET, которое представляет данные, полученные из веб-службы.

Прежде чем получать фактические данные из службы, необходимо получить токен, вызвав определенный метод в этой службе. Этот токен должен быть предоставлен при любых последующих вызовах методов данных. Срок действия этого токена истекает через некоторое время, и вызов метода данных с токеном с истекшим сроком действия приводит к ошибке, и для дальнейшего обмена данными необходимо получить новый токен. Активный токен хранится в глобальной переменной приложения ASP.NET.

Это все хорошо, но как я могу предотвратить повторное обновление токенов? Запрос от одного пользователя к сайту инициирует вызов службы, это приводит к ошибке, и новый токен извлекается и помещается в кэш, но в то же время другой пользовательский запрос обнаруживает, что токен истек, и также обновляет токен.

Здесь нет проблемы? Я не могу обернуть голову вокруг этого.

1 Ответ

1 голос
/ 13 марта 2012

Вы можете сделать это, заблокировав (Срок действия = 2 часа):

static class TokenGenerator
{
    private static object tokenLock = new object();
    private static DateTime tokenExp = DateTime.MinValue;
    private static string token = null;

    public static string GetToken()
    {
        if(tokenExp >= DateTime.UtcNow)
            return token;

        lock(tokenLock)
        {
            if(tokenExp >= DateTime.UtcNow)
                return token;

            // generate token
            token = GenerateToken();

            tokenExp = DateTime.UtcNow.AddHours(2);
        }
    }
}

public static string GenerateToken()
{
    // generate and return token
}

Хотя использование такого глобального токена может оказаться не лучшим решением.

Также этот код блокирует все другие запросы токенов во время регенерации токена, в зависимости от того, сколько времени занимает генерация токена, это может быть неприемлемым.

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