83 messaggi dal 30 luglio 2003
Ciao a tutti,
Sto provando a cimentarmi nell?output caching utilizzando sia le nozioni del libro asp.net 4.0 che cercando sul web.
Tar le varie prove fatte c?è questa che però non mi funziona :

file di markup:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ OutputCache VaryByParam="None" Duration="600000" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:GridView ID="GridView1" runat="server">
        </asp:GridView>
        <%=DateTime.Now %>
    
    </div>
    </form>
</body>
</html>



file di codice:

using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Web.Caching;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
        using (SqlConnection _connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connDB"].ConnectionString))
        {
            using (SqlCommand _command = new SqlCommand())
            {
                _command.Connection = _connection;
                _command.CommandText = "SELECT * FROM tabTop WHERE TipoTop lIKE '%venduti%'";

                SqlCacheDependency _dep = new SqlCacheDependency(_command);

                _connection.Open();
                GridView1.DataSource = _command.ExecuteReader();
                GridView1.DataBind();
                this.Response.AddCacheDependency(_dep);
            }
        }
    }
}

in più ho aggiunto al global.asax nell'Application_Start:

System.Data.SqlClient.SqlDependency.Start(ConfigurationManager.ConnectionStrings["connDB"].ConnectionString);


Se eseguo la pagina e faccio refresh l'ora visualizzata cambia invece di rimanere fissa che cosa ho sbagliato?

Grazie 1000
710 messaggi dal 13 novembre 2008
Contributi
che cosa vuoi fare?
un conto è l'OutputCache, uno l'SqlCacheDependency


con OutputCache impostato ad esempio così

<%@ OutputCache Duration="60" VaryByParam="none" %>

imposti la durata della memorizzazione nella cache di output di una pagina (in secondi occhio) o un controllo utente

riferimento

http://msdn.microsoft.com/it-it/library/hdxfb6cy.aspx

esempio

http://www.4guysfromrolla.com/articles/121306-1.aspx


con SqlCacheDependency

stabilisci una relazione con item memorizzato nella cache dell'applicazione e una specifica tabella di SQLServer; cioè se cambiano dati avviene l'invalidazione della cache

e qui hai il riferimento

http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx

http://www.aspitalia.com/articoli/asp.net2/caching.aspx
Modificato da teo prome il 26 novembre 2010 08.53 -
83 messaggi dal 30 luglio 2003
Grazie pe la risposta.
Spiego quello che vorrei realizzare:
nel mio sito (in aggiornamento alla versione 4.0 di .net dalla 1.1.4...) ho delle classifiche top ten che vengono aggiornate normalmente una volta a settimana. La classifica è realizzata mediante un custom control che legge i dati dal DB e li formatta. Si può creare un custom control che metta in cache direttamente output generato legato però alla variazioni dei dati della tabella da cui dipende? Se si come lo dovrei gestire?

Grazie 1000
710 messaggi dal 13 novembre 2008
Contributi
prego

con SqlCacheDependency

segui l'esempio postato è completo
83 messaggi dal 30 luglio 2003
Ho fatto un po' di prove utilizzando il codice preso dal link:
http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx

<%@ Page Language="C#" Debug="true" %>
<%@ import Namespace="System.Data.SqlClient" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    public void Page_Load(object Src, EventArgs E) 
    { 
        // Declare the SqlCacheDependency instance, SqlDep. 
        SqlCacheDependency SqlDep = null; 

        // Check the Cache for the SqlSource key. 
        // If it isn't there, create it with a dependency 
        // on a SQL Server table using the SqlCacheDependency class. 
        if (Cache["SqlSource"] == null) { 

            // Because of possible exceptions thrown when this 
            // code runs, use Try...Catch...Finally syntax. 
            try { 
                // Instantiate SqlDep using the SqlCacheDependency constructor. 
                SqlDep = new SqlCacheDependency("Northwind", "Categories"); 
            } 

            // Handle the DatabaseNotEnabledForNotificationException with 
            // a call to the SqlCacheDependencyAdmin.EnableNotifications method. 
            catch (DatabaseNotEnabledForNotificationException exDBDis) { 
                try { 
                    SqlCacheDependencyAdmin.EnableNotifications("Northwind"); 
                } 

                // If the database does not have permissions set for creating tables, 
                // the UnauthorizedAccessException is thrown. Handle it by redirecting 
                // to an error page. 
                catch (UnauthorizedAccessException exPerm) { 
                    Response.Redirect(".\\ErrorPage.htm"); 
                } 
            } 

            // Handle the TableNotEnabledForNotificationException with 
            // a call to the SqlCacheDependencyAdmin.EnableTableForNotifications method. 
            catch (TableNotEnabledForNotificationException exTabDis) { 
                try { 
                    SqlCacheDependencyAdmin.EnableTableForNotifications("Northwind", "Categories"); 
                } 

                // If a SqlException is thrown, redirect to an error page. 
                catch (SqlException exc) { 
                    Response.Redirect(".\\ErrorPage.htm"); 
                } 
            } 

            // If all the other code is successful, add MySource to the Cache 
            // with a dependency on SqlDep. If the Categories table changes, 
            // MySource will be removed from the Cache. Then generate a message 
            // that the data is newly created and added to the cache. 
            finally { 
                Cache.Insert("SqlSource", Source1, SqlDep); 
                CacheMsg.Text = "The data object was created explicitly."; 

            } 
        } 

        else { 
            CacheMsg.Text = "The data was retrieved from the Cache."; 
        } 
    } 
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
        <p>
        </p>
        <p>
            <asp:SqlDataSource id="Source1" runat="server" SelectCommand="SELECT * FROM [Categories]" UpdateCommand="UPDATE [Categories] SET [CategoryName]=@CategoryName,[Description]=@Description,[Picture]=@Picture WHERE [CategoryID]=@CategoryID" ConnectionString="<%$ ConnectionStrings:Northwind %>"></asp:SqlDataSource>
            <asp:GridView id="GridView1" runat="server" DataKeyNames="CategoryID" AllowSorting="True" AllowPaging="True" DataSourceID="Source1"></asp:GridView>
        </p>
        <p>
        </p>
        <p>
            <asp:Label id="CacheMsg" runat="server" AssociatedControlID="GridView1"></asp:Label>
        </p>
   </form>
</body>
</html>



Non sembra che funzioni bene. Mi spiego:

1) eseguo la pagina
2) viene creato ogg in cache correttamente
3) viene mostrato mess "The data object was created explicitly."
4) faccio aggiorna e viene mostrato mess "The data was retrieved from the Cache."
5) vado sul db modifico dati e faccio aggiorna viene mostrato ancora mess "The data was retrieved from the Cache." anche se i dati visualizzati sono quelli aggiornati

Come è possibile? L'oggetto in cache non dovrebbe essere distrutto e poi ricreato?
710 messaggi dal 13 novembre 2008
Contributi
torin.it ha scritto:

5) vado sul db modifico dati e faccio aggiorna viene mostrato ancora mess "The data was retrieved from the Cache." anche se i dati visualizzati sono quelli aggiornati

Come è possibile? L'oggetto in cache non dovrebbe essere distrutto e poi ricreato?



certo, se però non modifichi a mano la tabella...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.