Простой вопрос: как кэшировать список <> в ASP.Net? - PullRequest
1 голос
/ 27 ноября 2009

Я загружаю список таблицы базы данных через Linq в страницу загрузки моего сайта.

Теперь я должен кэшировать список, потому что я снова буду использовать их в WebMethod. (Я не могу загрузить их новыми, потому что там могут быть изменения).

Как кэшировать список <> и вернуть его обратно в WebMethod?

Ответы [ 6 ]

4 голосов
/ 27 ноября 2009

Я бы сделал это с ASP.NET Cache API - вот как.

Imports System.Web

Public Class CacheManager

Private ListKey As String = "MyList"

Public Shared ReadOnly Property TypedList As List(Of Integer)

    Dim cachedObject As Object  
    Dim myList As List (Of Integer)  
    Dim userCacheKey As String = ListKey & HttpContext.Current.User.Identity.Name

    'First check to see if List is in the cache already
    cachedObject = HttpRuntime.Cache.Get(userCacheKey)

    If cachedObject Is Nothing Then
       'If List isn't in the cache already then get it...
       myList = Code to retrieve list members goes here
       ' ...and now we've got it put it in the cache
       HttpRuntime.Cache..Add(key:=userCacheKey, value:=myList, absoluteExpiration:=HttpRuntime.Cache.NoAbsoluteExpiration, slidingExpiration:=New TimeSpan(0,5,0), dependencies:=Nothing, onRemoveCallback:=Nothing, priority:=CacheItemPriority.Default)
    Else
        'List is already in the cache but everything comes out of the cache as System.Object so cast it to List (Of Integer)  
        myList = DirectCast(cachedObject, List (Of Integer))
    End If

    'Now we have List, return it to the caller
    Return myList

End Property

End Class

Это дает нам класс, который будет хранить экземпляр List <> на пользователя, который существует в памяти в течение пяти минут после последнего обращения к нему - вы можете сделать это, просто изменив длину объекта TimeSpan в slideExpiration параметр при добавлении списка в кэш.

Тогда ваше использование на странице просто:

Public Sub Page_Load (arguments)

Dim myList As List(Of Integer)  
...
myList = CacheManager.TypedList
...
End Sub

<WebMethod()> Public Sub MyEventMethod(arguments)

Dim myList As List(Of Integer)
...
myList = CacheManager.TypedList
...

End Sub

Из вашего вопроса не совсем понятно (для меня), могут ли пользователи изменять свой индивидуальный список или глобальный список. Если они изменяют свой индивидуальный список, который легко обслуживать - измените свойство TypedList следующим образом:

Imports System.Web

Public Class CacheManager

Private ListKey As String = "MyList"

Public Shared Property TypedList As List(Of Integer)
Get
    Dim cachedObject As Object  
    Dim myList As List (Of Integer)  
    Dim userCacheKey As String = ListKey & HttpContext.Current.User.Identity.Name

    'First check to see if List is in the cache already
    cachedObject = HttpRuntime.Cache.Get(userCacheKey)

    If cachedObject Is Nothing Then
       'If List isn't in the cache already then get it...
       myList = Code to retrieve list members goes here
       ' ...and now we've got it put it in the cache
       HttpRuntime.Cache.Add(key:=userCacheKey, value:=myList, absoluteExpiration:=HttpRuntime.Cache.NoAbsoluteExpiration, slidingExpiration:=New TimeSpan(0,5,0), dependencies:=Nothing, onRemoveCallback:=Nothing, priority:=CacheItemPriority.Default)
    Else
        'List is already in the cache but everything comes out of the cache as System.Object so cast it to List (Of Integer)  
        myList = DirectCast(cachedObject, List (Of Integer))
    End If

    'Now we have List, return it to the caller
    Return myList
End Get
Set (ByVal value As List(Of Integer))

    Dim userCacheKey As String = ListKey & HttpContext.Current.User.Identity.Name

    HttpRuntime.Cache.Insert(key:=userCacheKey, value:=value, absoluteExpiration:=HttpRuntime.Cache.NoAbsoluteExpiration, slidingExpiration:=New TimeSpan(0,5,0), dependencies:=Nothing, onRemoveCallback:=Nothing, priority:=CacheItemPriority.Default)

End Set
End Property

End Class

Если какой-либо пользователь, вносящий изменения в список, изменит его для всех, я бы посмотрел на использование CacheDependency .

3 голосов
/ 27 ноября 2009

Я бы сказал, что Сессия будет вашим лучшим выбором.

Пример

Хранение:

var list = new List<int>() { 1, 2, 3, 4, 5 };
Session["ListOfIntegers"] = list;

Получение:

var list = (List<int>)Session["ListOfIntegers"];
1 голос
/ 27 ноября 2009

Я предполагаю, что вы хотите кэшировать (или, скорее, сохранить) это отдельно для пользователя, так как вы упоминаете, что могут быть изменения.

Сохраните список в переменной Session и включите состояние сеанса для веб-метода с помощью атрибута [WebMethod(EnableSession:=True)].

Учитывайте количество используемой памяти. Помещение списка в переменную сеанса сохранит его в памяти надолго. (20 минут - это время в рамках веб-приложения, где объекты обычно выживают всего несколько миллисекунд ...)

0 голосов
/ 10 мая 2019
[WebMethod(EnableSession = true)]
public void SetCache()
{
    LoginData userList = new LoginData
    {
        Status = "Success",
        LastLogin = DateTime.Now.ToString("yyyyMMdd-HHMMss"),
        UserName = "Some User"
    };
    HttpRuntime.Cache["loggedIn"] = userList;
}
public class LoginData
{
    public string Status { get; set; }
    public string UserName { get; set; }
    public string LastLogin { get; set; }
}

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

0 голосов
/ 27 ноября 2009

Я предлагаю использовать класс System.Web.Caching.Cache.

См http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

Это не зависит от сеанса пользователя, но в вашем случае я думаю, что лучше, потому что вы находитесь внутри WebMethod.

Davide

0 голосов
/ 27 ноября 2009

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

List<goof> data {
    get {
        List<goof> data = Session["data"] as List<goof>;
        if (data == null) Session["data"] = LINQstuff;

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