1. “This One Goes Up To 11”
or
How to write scalable ASP.NET
Phil Pursglove
phil@philippursglove.com
http://diaryofadotnetdeveloper.blogspot.com
http://www.philippursglove.com/ScalableASPNET
http://twitter.com/philpursglove
2. About Me
• Senior .NET Developer
• MBCS
• MCSD
• VBUG East Anglia Co-ordinator
• Written for VB Developer and SQL
Server Pro
4. What is Scalability?
• “The ability to handle growing amounts
of work in a graceful manner” Wikipedia
• What affects scalability?
• Everything you see this evening
applies to .NET 2.0 and higher
6. Why Cache?
• Because there’s a credit crunch!
• Building a page is an expensive
process
– Database calls across servers
– Web Service calls
– AD lookups
• Returning a stored page from a cache
is much cheaper!
7. Caching 1: OutputCache
• Caches the rendered HTML from your
page
– Duration is in seconds
– VaryByParam allows you to cache several
versions
– Location means you can cache on the
web server, client, downstream machines
or all of these
– CacheProfiles mean you have fine config-
based control
8. Caching 2: Caching API
• Store objects in memory and pull them
out when you need them
• For data objects, you have to use
DataSets and DataTables, not
DataReaders
9. Caching 2: CacheDependency
• Objects in the cache can be dependent on
other objects
– When the dependency changes, the cached item
is removed
– Not very useful in .NET 1.1
• .NET 2.0 introduced SqlCacheDependency
– Cached objects can be dependent on SQL tables
– Enable using the ASPNET_REGSQL tool
– Or programmatically with the
SqlCacheDependencyAdmin object
10. Caching 3: Velocity
• Velocity
– Distributed cache
• One logical cache split across several servers
• PowerShell management console
– CTP2 released at PDC
– CTP3 releasing at Mix 09
– Doesn’t have dependencies – yet
– The future: automatic caching?
12. Caching 4: Donut Caching
• aka Post-Cache Substitution
• Inject dynamic content into a cached
page before it is returned to the client
– <asp:substitution>
– Must use static methods with a
HttpContext
13. Paging
• Default GridView paging behaviour reads the
entire dataset every time
– For 100 000 rows this probably isn’t so good
• Write your own paging mechanism
• For custom paging DataGrids are better than
GridViews
• In SQL 2005 the ROW_NUMBER function is
your friend!
• LINQ
– Skip
15. ViewState 1
Viewstate Size
in bytes
HTML Table (built in-line) 52
HTML Table (built in code-behind) 52
DataList 6628
Repeater 6600
DataGrid 10592
GridView 10928
16. ViewState 2
• Taming Viewstate
– Can be disabled per-control
– ZIP it up and put the zipped version on the
page
– Keep it on the web server
17. Compression 1
• All modern browsers will accept
compressed content
– Content is compressed on the server /
decompressed by the browser
– Can be enabled in IIS
or
– Use the HttpCompress library
21. Load Balancing
• Synchronise machineKey (in
machine.config)
• Don’t use basic Session state
– SQL Server Session State
– ASP.NET State Service
– Velocity ASP.NET Session state
22. Summary
• Cache is King!
• Paging is good for your pages!
• Viewstate doesn’t have to be evil!
24. Resources
• DotNetRocks
– http://www.dotnetrocks.com/default.aspx?showNum=24
– http://www.dotnetrocks.com/default.aspx?showNum=367
• Books
– Essential ASP.NET by Fritz Onion
– The ASP.NET 2.0 Cookbook by Michael Gittel & Geoffrey
LeBlond
– The ASP.NET Anthology by Scott Allen et al
• MSDN White Paper on .NET Performance &
Scalability
– http://msdn.microsoft.com/en-us/library/ms998530.aspx