Кэширование данных, связанных с пользователями ASP.NET, в службе WCF - PullRequest
2 голосов
/ 17 сентября 2010

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

void Add(int x, int y);

Результат операции должен каким-то образом храниться в веб-службе WCF (переменная-член).Позже пользователь сможет позвонить

double Equals();

и получить результат операции.Конечно, поскольку это открытый веб-сайт, многие пользователи, не прошедшие проверку подлинности, могут открыть страницу ASP.NET и вызвать веб-службу.

В качестве альтернативы метод Add может возвращать «ключ», который можно использовать для получения результата, например:

Guid Add(int x, int y);
double Equals(Guid key);

Я не думаю, что смогу использовать сеансы WCF, так как в Интернетеслужба будет думать, что существует только 1 клиент (WebSite, вызывающий webserivce, размещенный в IIS).Пользователи не аутентифицированы - они анонимные пользователи. Я мог бы использовать: (пожалуйста, посмотрите на мой РЕДАКТИРОВАТЬ)

InstanceContextMode =InstanceContextMode.Single

как атрибут моего веб-сервиса и хранить Dictionary<key, result>, но проблема в том, когда я могу удалить запись из словаря?Должен ли я использовать какой-то BackgroundWorker для проверки словаря каждые 15 минут и удаления старых записей?В этом случае мне придется хранить DateTime для каждой записи, но это не проблема, если это лучший способ реализовать это решение ...

Мой пример методов Add / Equals предназначен только для иллюстрации проблемы, реальнотребование хранить гораздо больше данных на пользователя, чем простой double результатЗаранее спасибо за помощь.

РЕДАКТИРОВАТЬ: Подумав больше о InstanceContextMode =InstanceContextMode.Single, я думаю, что это не лучший вариант для использования с ASP.NET, поскольку, если 100 пользователей будут одновременно вызывать веб-службу, я получу 100 последовательных вызовов, которые вызовут проблемы с производительностью.В этом случае у вас есть идеи, как реализовать это, не меняя настройки InstanceContextMode (насколько я знаю, по умолчанию это PerSession)?

1 Ответ

0 голосов
/ 17 сентября 2010

Я думаю, сохраняя

InstanceContextMode =InstanceContextMode.Single 

в качестве поведения службы, если позволяет ваша архитектура, вы можете использовать объект System.Web.Caching.Cache, реализованный в статическом классе (так, чтобы он был создан только один раз), где вы можете указать зависимость / срок действия кэша и т.д. и, следовательно, вы можете получить полный набор функций, предлагаемых службой кэширования, вместо того, чтобы реализовывать их самостоятельно.

Edit: Если ваше основное намерение связано с кэшированием, вам даже не нужно использовать режим контекста экземпляра. Вы можете просто реализовать свой собственный поставщик статического кэша на основе System.Web.Caching.Cache и передать cacheKey, как показано в следующем примере:

 public int Add(int a, int b)
        {
            string cacheKey = a.ToString()+b.ToString();
            if (!CacheProvider.Contains(cacheKey))
            {
                CacheProvider.Add(cacheKey, a + b);
                return a + b;
            }
            else
            {
                return (int)CacheProvider.GetValue(cacheKey);
            }

        }

CacheProvider в приведенном выше коде является статической реализацией вашего поставщика Cache.

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