Caching an ASP.Net page October 6, 2010
Posted by fofo in asp.net, VB 2005, VB 2008, VB 9.0, Visual Basic 10.0, Visual Studio 2005, Visual Studio 2008, Visual Studio 2010, VS 2010.Tags: caching
1 comment so far
The issue of “caching” keeps coming up in my asp.net seminars so I though it would be a good idea to write a post. I know it is a well documented feature and widely used but I really believe most people will be able to use this rather simple example and understand the concepts behind caching.
You can use any of the versions of Visual studio (VS 2005,VS2008,VS2010 express editions work fine).
I will use VS 2010 Ultimate edition and VB.net as the .Net language of choice.
1) Create an Asp.net web site and name it as you want.
2) In the default.aspx page add a new paragraph or header with content of your choice.In my case i have added something like this
<h2>Caching is really useful!!!!</h2>
3) Let’s think simple at first. We do want to cache the entire page (default.aspx)
Just below the Page directive ( top of the page ) you add the following bit of code:
<%@ OutputCache Duration="20" VaryByParam="none" %>
We do cache the page for 20 seconds. That is determined by the Duration Attribute.
4) Save your work and run your application. The first time we see the output of the asp.net page, this is served directly from the asp.net engine.
If you hit refresh for a period for less than 20 seconds the page is served from the Cache.
5) Let’s see a more complex scenario involving query strings and how we can make a decision on whether to cache the page or not based on the value of the query string. Add a new label control to the .aspx page
<asp:Label ID="mylabel" runat="server"></asp:Label>
In the Page_Load event handler routine add the code
If (Not Request("id") Is Nothing) Then
mylabel.Text = " The query string value is " + Request("id").ToString()
End If
6) Change the OutputCache directive to
<%@ OutputCache Duration="20" VaryByParam="id" %>
7) Run your application and type in the url address bar http://localhost:6141/caching/Default.aspx?id=5. See the results. If you hit refresh right away the page is refreshed from the cache and it is not reloaded.
If you type this http://localhost:6141/caching/Default.aspx?id=6 ( within the 20 seconds period ) it senses that the id has changed now and it re-renders the page. It also sets a new caching period of 20 seconds.
8) What is really interesting to bear in mind ( and not many people know ) is that you can have different caching settings depending on the client’s browser.The first step is to change the OutputCache directive to this
<%@ OutputCache Duration="20" VaryByParam="id" VaryByCustom="browser" %>
9) Basically we say “Continue to cache the page as long as the clients use the same browser”. So if you have 3 people in a row that have IE8 hitting your page, will all get the same cached version of the page.
If someone hits our page with Firefox or Chrome, they will a brand new rendered page. At this time it will be created a 20 seconds cache window period specific for each browser.This functionality is built into the caching module, and will insert separate cached versions of the page for each browser name and major version.
10) Now if we need to apply the caching techniques we just learnt in all pages of our asp.net application we will have to make a few modifications in the web.config file.We will add something that is called “Cache Profiles”
Just below the <system.web> add this snippet
<caching> <outputCacheSettings> <outputCacheProfiles> <add name="basic" duration="20" varyByParam="id" varyByCustom="browser" /> </outputCacheProfiles> </outputCacheSettings> </caching>
So we have created a new profile that is called “basic”. Now let’s apply this cache profile to one or more pages in our website.
So we switch back to our default.aspx page and in the OutputCache directive, type
<%@ OutputCache CacheProfile="basic" %>
Run your application again and you will see that we do have the same caching effects.
Obviously you can create different cache profiles and apply them to various pages.
I will have more posts on caching shortly.
Hope it helps!!!
Caching an asp.net page depending on the user’s browser language October 6, 2010
Posted by fofo in asp.net, VB 2005, VB 2008, Visual Studio 2008, Visual Studio 2010.Tags: browser, caching
add a comment
This is my second post regarding caching in asp.net applications.
A friend of mine asked me if he can control caching of an asp.net page depending on the user’s language browser.
Let’s see how we can accomplish that with a step by step example.
You can use any of the versions of Visual studio (VS 2005,VS2008,VS2010 express editions work fine).
I will use VS 2010 Ultimate edition and VB.net as the .Net language of choice.
We will identify the language of the user’s browser from the HTTP headers.
More specifically we will look at the Accept-Language header item.
1) Create an Asp.net web site and name it as you want.Add a label web server control to your default.aspx page.
2) In the default.aspx just below the Page directive ( top of the page ) you add the following bit of code:
<%@ OutputCache Duration="50" VaryByHeader="Accept-Language" VaryByParam="none" %>
We want to use VaryByHeader and assign it to the header item Accept-Language that we want to vary caching by.
So now this page is going to be cached based on the language of the user’s browser.
3) Now switch back to the code behind and in the Page_Load event handling routine type the following
If Not (Request.Headers("Accept-Language")) Is Nothing Then
mylabel.Text = "language of the user is " +
Request.Headers("Accept-Language").ToString
End If
4) Run your application and see the result-your browser’s language. In most cases it will be something like “en-us“, or anything else that the HTML page will output. So if now we have 20 people
hitting our page – within the 50 seconds cache period – and all of them have “en-us” as their browser’s language they are going to get the cached version of the page. The page will not be re-rendered through the whole
page events-lifecycle.
5) If we have people hitting our page with a browser with a different language (.eg fr,es ) the Asp.Net would cache a second version of the page in french. So now we would have 2 cached versions of the page, one in english and one in french.So the first french person (browser language) to hit the page, he would see the page rendered to him ( the whole page lifecycle will run ) and at the same time it will be cached so subsequent requests from french people-users-browsers will be served from the cache.
If you need the code, just email me.
Hope it helps !!!
Linq to Objects in ASP.Net October 6, 2010
Posted by fofo in asp.net, C#, LINQ, Visual Studio 2008, Visual Studio 2010.Tags: LINQ to objects
1 comment so far
In this post I would like to talk about Linq to Objects in an ASP.Net application.
In all my classes people seem to have the following answer to this question, “What kind of data can we query with LINQ?“
Most people say “Well, we can query an SQL server database” . I am not very pleased when people forget the other flavors.
LINQ to Objects allow us to write “queries” over collections of objects.This is the first and most basic flavor of LINQ. LINQ to Objects enables you to perform
complex query operations against any enumerable object. By that I mean any object that implements the IEnumerable interface.
I will use Visual Studio 2010 Ultimate edition.You can use VS 2010/VS2008 Professional edition.
VS 2010/VS2008 Epxress editions will be fine for this example. I am using C# for this one.
1) Fire VS and create a new asp.net website with a name of your choice. Choose local filesystem as the location of your website files.
2) Add a GridView web server control to the Default.aspx page.
3) Add a Class file in your website ( Add – > New item ) . I am going to have data related to football so i named it Football.cs
4) Inside the public class Football type
public string FootballTeamName { get; set; }
public string Manager { get; set; }
public string TeamCaptain { get; set; }
public int ChampionshipsWon { get; set; }
5) Now that we have a class to work with, we should create a simple generic List of the Football objects and then bind that list to the Gridview control.
6) This is the code for the generic list of the Football objects. We place this code in the Default.aspx page.
public List<Football> GetFootballData()
{
return new List<Football> {
new Football { FootballTeamName="Liverpool", Manager="Roy Hodgson",
TeamCaptain="Steven Gerrard",ChampionshipsWon=18 },
new Football { FootballTeamName="ManUtd", Manager="Alex Ferguson",
TeamCaptain="Rio Ferdinand", ChampionshipsWon=18},
new Football { FootballTeamName="Chelsea", Manager="Carlos Ancelotti",
TeamCaptain="Frank Lampard",ChampionshipsWon=4 },
new Football { FootballTeamName="Everton", Manager="David Moyes",
TeamCaptain="Phil Neville",ChampionshipsWon=9 }
};
}
7) Now we add the code in the Page_Load() event handling routine. We just type
var football = GetFootballData(); this.GridView1.DataSource = football; this.GridView1.DataBind();
8) Run your application and see the results in the web browser.
9) Imagine we want to filter our data. Let’s write the query first in a non-LINQ way.
Comment out the code in the Page_Load event handling routine.We want to query the data where the Manager is “Roy Hodgson”.
In the Page_Load event handling routine type
var football = GetFootballData();
var query = new List<Football>();
foreach (var f in football)
{
if (f.Manager == "Roy Hodgson" ) query.Add(f);
}
this.GridView1.DataSource = query;
this.GridView1.DataBind();
10) Run your application and see the in the browser the record that satisfies the criteria.
11) If we want to have more complex queries (grouping or sorting ) then the code becomes a bit hard to follow and maintain.
12) Now we will write a number of queries the “LINQ” way. We do not have to worry anymore on exactly how a query is going to be executed.
We just need to define what the query should return. The compiler must come up with a way and determine how the query will be executed.
13) Comment out the code inside the Page_Load event handling routine and type this code
var football = GetFootballData(); var query = from f in football select f; this.GridView1.DataSource = query; this.GridView1.DataBind();
14) Run your application and see the results. We use the GetFootballData() method to obtain the generic list collection.Then we use the simplest LINQ query to select all the Football objects from the generic collection.
We do have new language keywords like select and from.
15) Now let’s say that we want only the Manager and FootballTeamName values. Comment out the code inside the Page_Load event handling routine and type this code
var football = GetFootballData();
var query = from f in football
select new { f.FootballTeamName, f.Manager };
this.GridView1.DataSource = query;
this.GridView1.DataBind();
Run your application and see the results.What we did here is called Projection and contains the Manager and FootballTeamName values for all the objects.
16) If we want to have some ordering(get the values back according to the object Manager descending) of the data we just re-write the code above
var football = GetFootballData();
var query = from f in football
orderby f.Manager descending
select new { f.FootballTeamName, f.Manager };
this.GridView1.DataSource = query;
this.GridView1.DataBind();
Run your application and see the results.
17) We do have query filters in LINQ. We can use the where clause.If we want to find how many teams won more than 10 championships we should type ( after commenting out all our code in the Page_Load )
var football = GetFootballData(); var query = from f in football where f.ChampionshipsWon > 10 select f; this.GridView1.DataSource = query; this.GridView1.DataBind();
Run your application and see the results.
18) If we want to get only the Manager name and the team captain name for the last 2 records we should type (after commenting out all our code in the Page_Load)
var football = GetFootballData();
var query = (from f in football
select new { f.Manager, f.TeamCaptain }).Reverse().Take(2);
this.GridView1.DataSource = query;
this.GridView1.DataBind();
Run your application and see the results. We use the Reverse() method that inverts the order of the elements in a sequence.
We also use the Take() method to return a specified number of elements from the start of a sequence.
This post can be very useful to people that begin to learn LINQ.Email me if you want the source code.
Hope it helps!!!












