SlideShare uma empresa Scribd logo
1 de 34
Baixar para ler offline
Improving ASP.NET MVC
            Application Performance
                          Steve Smith
                        The Code Project
                  SteveSmithBlog.com | @ardalis


www.mvcConf.com
Defining Performance Metrics
• Page Execution Time
• Requests/Sec
• TTLB




 www.mvcConf.com
Defining Performance
                       Requirements
• A given web request (/Home/Index)
• Must return within a given time (TTLB or
  Page Execution Time)
• Under a given load (Requests/Sec + Active
  Users)
• Given system characteristics (50k records)
• Resource constraints (< 400 database
  server requests/sec)
 www.mvcConf.com
Performance Requirement
• /Home/Index
• Must return within 1s Page Execution
  Time
• Given 100 request/sec and base database
• With < 200 database requests/sec


 www.mvcConf.com
Measure Baseline
•     Record the Scenario
•     Set up the Load Test
•     Run the Test
•     Analyze the Results



    www.mvcConf.com
Baseline Measurement: MVC Music Store

DEMO

www.mvcConf.com
www.mvcConf.com
Find the Slowest Pages




www.mvcConf.com
Tuning a Web Application
                     Define Goal


                                       Meets Goal
                   Measure System                       Stop


                  Does Not Meet Goal

                  Form Hypothesis;
                                       Change Only One Thing!
                    Alter System



www.mvcConf.com
Most Common Performance
               Problems
• Database
     – Too many queries
     – Queries Not Optimized
• Network Requests
     – From Server to Services
     – From Browser to Web Server

 www.mvcConf.com
Simple but Important
• Be sure production DLLs are compiled in Release mode!
• Isis.CodePlex.com (still alpha)




 www.mvcConf.com
Caching
• Output Caching
     – [OutputCache] attribute
     – Applies to
             • Action methods within Controller
             • Or Entire Controller




 www.mvcConf.com
Identify Pages To Cache




www.mvcConf.com
Applying Output Caching

DEMO

www.mvcConf.com
www.mvcConf.com
Add Data Caching
•     Apply to Read operations
•     Use where Output Caching can’t be used
•     Consider applying at Repository level
•     Consider using Sql Cache Invalidation or
      short cache duration


    www.mvcConf.com
What About Writes?
• Avoid blocking on writes
     – Send messages
     – Use Async calls on server
     – Use Async/Ajax calls from client

• Logically partition reads and writes
     – Command Query Responsibility Separation
       (CQRS)

 www.mvcConf.com
Other Tools: Profiling




www.mvcConf.com
Tier Interactions




www.mvcConf.com
What about Async?
• Async Actions
• AsyncController

• Improves scalability
• May improve performance

 www.mvcConf.com
Comparing MVC and View
                  Engines
• MVC 2 Template on MVC 2
     – 8135 Requests/sec
• MVC 2 Template on MVC 3
     – 7987 Requests/sec
• MVC 3 Webforms View Engine on MVC 3
     – 7457 Requests/sec
• MVC 3 Razor View Engine on MVC 3
     – 7136 Requests/sec
     http://blogs.msdn.com/b/marcinon/archive/2011/01/17/mvc-3-performance.aspx


 www.mvcConf.com
MVC 3 Performance
• Unobtrusive client-side validation on by default
• Razor view engine imposes small cost over
  webforms view engine
• Performance improved for:
     –    Expression caching (lambdas)
     –    URL generation
     –    Action lookup
     –    Filter invocation

 www.mvcConf.com
MVC Gotchas
• Avoid HttpResponse.WriteSubstitution()
     – Contents may be incorrectly cached
     – http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx
     – May work with MVC3 + ASPX; not supported; definitely not w/Razor



• RenderAction() Cache Bug
     – Calling an action with OutputCache attribute may
       result in entire page being cached
     – http://haacked.com/archive/2009/05/12/donut-hole-caching.aspx



 www.mvcConf.com
MVC Performance Tips
Disable Unused View Engines
• Html.EditorFor, Html.DisplayFor always
  look for templates for each view engine
• Save extra “misses” to disk by removing
  unused view engines.


 www.mvcConf.com
Remove Unused View Engines




www.mvcConf.com
MVC Performance Tips
Avoid Passing Null to Strongly Typed Views
  w/Helpers
• Helpers like Html.TextBoxFor(m =>
  m.Name) will throw
  NullReferenceException
• Exceptions will be caught/ignored, but may
  add up to negative performance impact
 www.mvcConf.com
Avoid Passing Null to View




www.mvcConf.com
MVC Performance Tips
Uninstall IIS UrlRewrite Module
• If no applications on the server are using
  it
• No effect in MVC apps before v3
• Enhances speed of URL generation


 www.mvcConf.com
Uninstall UrlRewrite
                      (if not used)




www.mvcConf.com
Applying Performance Fixes

DEMO

www.mvcConf.com
Summary of Perf Gains
300
250
200                                              Base
                                                 Release Mode
150
                                                 No Null ViewModel
100
                                                 1 ViewEngine
 50                                              OutputCache
  0
                    Pages/Sec   Page Time (ms)


 www.mvcConf.com
Summary
•     Set Goals – Don’t Optimize Prematurely
•     Measure and Tune Scientifically
•     Look for big wins first
•     Watch out for Gotchas and apply Tips



    www.mvcConf.com
References
•     http://blogs.msdn.com/b/marcinon/archive/2011/01/17/mvc-3-performance.aspx
•     http://blogs.msdn.com/b/marcinon/archive/2011/02/07/mvc-performance-tips.aspx
•     http://www.asp.net/mvc/tutorials/improving-performance-with-output-caching-cs
•     http://www.asp.net/mvc/tutorials/adding-dynamic-content-to-a-cached-page-cs
•     http://mvcmusicstore.codeplex.com/
•     http://isis.codeplex.com/




    www.mvcConf.com
Questions?
Tweet Your Questions to:
@ardalis How do I…? #mvcconf

Steve Smith
ssmith@lakequincy.com
SteveSmithBlog.com
Twitter: @ardalis

 www.mvcConf.com

Mais conteúdo relacionado

Destaque

3-TIER ARCHITECTURE IN ASP.NET MVC
3-TIER ARCHITECTURE IN ASP.NET MVC3-TIER ARCHITECTURE IN ASP.NET MVC
3-TIER ARCHITECTURE IN ASP.NET MVC
Mohd Manzoor Ahmed
 
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Yoshifumi Kawai
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
Yoshifumi Kawai
 

Destaque (16)

ASP.NET MVC Presentation
ASP.NET MVC PresentationASP.NET MVC Presentation
ASP.NET MVC Presentation
 
3-TIER ARCHITECTURE IN ASP.NET MVC
3-TIER ARCHITECTURE IN ASP.NET MVC3-TIER ARCHITECTURE IN ASP.NET MVC
3-TIER ARCHITECTURE IN ASP.NET MVC
 
Scaling your servers with async and await
Scaling your servers with async and awaitScaling your servers with async and await
Scaling your servers with async and await
 
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)
 
El patrón MVC
El patrón MVCEl patrón MVC
El patrón MVC
 
BUILDING WEB APPS WITH ASP.NET MVC AND NOSQL
BUILDING WEB APPS WITH ASP.NET MVC AND NOSQLBUILDING WEB APPS WITH ASP.NET MVC AND NOSQL
BUILDING WEB APPS WITH ASP.NET MVC AND NOSQL
 
Web API with ASP.NET MVC by Software development company in india
Web API with ASP.NET  MVC  by Software development company in indiaWeb API with ASP.NET  MVC  by Software development company in india
Web API with ASP.NET MVC by Software development company in india
 
OpenROV: Node.js takes a dive into the ocean
OpenROV: Node.js takes a dive into the oceanOpenROV: Node.js takes a dive into the ocean
OpenROV: Node.js takes a dive into the ocean
 
Arquitectura MVC
Arquitectura MVCArquitectura MVC
Arquitectura MVC
 
Sitecore Personalization on websites cached on CDN servers
Sitecore Personalization on websites cached on CDN serversSitecore Personalization on websites cached on CDN servers
Sitecore Personalization on websites cached on CDN servers
 
Complete MVC on NodeJS
Complete MVC on NodeJSComplete MVC on NodeJS
Complete MVC on NodeJS
 
MVC ppt presentation
MVC ppt presentationMVC ppt presentation
MVC ppt presentation
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
 
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
 
RuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for UnityRuntimeUnitTestToolkit for Unity
RuntimeUnitTestToolkit for Unity
 

Mais de Steven Smith

Mais de Steven Smith (20)

Clean architecture with asp.net core by Ardalis
Clean architecture with asp.net core by ArdalisClean architecture with asp.net core by Ardalis
Clean architecture with asp.net core by Ardalis
 
Finding Patterns in the Clouds - Cloud Design Patterns
Finding Patterns in the Clouds - Cloud Design PatternsFinding Patterns in the Clouds - Cloud Design Patterns
Finding Patterns in the Clouds - Cloud Design Patterns
 
Introducing domain driven design - dogfood con 2018
Introducing domain driven design - dogfood con 2018Introducing domain driven design - dogfood con 2018
Introducing domain driven design - dogfood con 2018
 
Design Pattern Mastery - Momentum Dev Con 19 Apr 2018
Design Pattern Mastery - Momentum Dev Con 19 Apr 2018Design Pattern Mastery - Momentum Dev Con 19 Apr 2018
Design Pattern Mastery - Momentum Dev Con 19 Apr 2018
 
Introducing Domain Driven Design - codemash
Introducing Domain Driven Design - codemashIntroducing Domain Driven Design - codemash
Introducing Domain Driven Design - codemash
 
Most Useful Design Patterns
Most Useful Design PatternsMost Useful Design Patterns
Most Useful Design Patterns
 
Improving the Design of Existing Software
Improving the Design of Existing SoftwareImproving the Design of Existing Software
Improving the Design of Existing Software
 
Introducing ASP.NET Core 2.0
Introducing ASP.NET Core 2.0Introducing ASP.NET Core 2.0
Introducing ASP.NET Core 2.0
 
Decoupling with Domain Events
Decoupling with Domain EventsDecoupling with Domain Events
Decoupling with Domain Events
 
Improving the Quality of Existing Software
Improving the Quality of Existing SoftwareImproving the Quality of Existing Software
Improving the Quality of Existing Software
 
Improving the Quality of Existing Software
Improving the Quality of Existing SoftwareImproving the Quality of Existing Software
Improving the Quality of Existing Software
 
Breaking Dependencies to Allow Unit Testing - DevIntersection Spring 2016
Breaking Dependencies to Allow Unit Testing - DevIntersection Spring 2016Breaking Dependencies to Allow Unit Testing - DevIntersection Spring 2016
Breaking Dependencies to Allow Unit Testing - DevIntersection Spring 2016
 
Improving the Quality of Existing Software - DevIntersection April 2016
Improving the Quality of Existing Software - DevIntersection April 2016Improving the Quality of Existing Software - DevIntersection April 2016
Improving the Quality of Existing Software - DevIntersection April 2016
 
Breaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit TestingBreaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit Testing
 
Improving the Quality of Existing Software
Improving the Quality of Existing SoftwareImproving the Quality of Existing Software
Improving the Quality of Existing Software
 
A Whirldwind Tour of ASP.NET 5
A Whirldwind Tour of ASP.NET 5A Whirldwind Tour of ASP.NET 5
A Whirldwind Tour of ASP.NET 5
 
Domain events
Domain eventsDomain events
Domain events
 
My Iraq Experience
My Iraq ExperienceMy Iraq Experience
My Iraq Experience
 
Add Some DDD to Your ASP.NET MVC, OK?
Add Some DDD to Your ASP.NET MVC, OK?Add Some DDD to Your ASP.NET MVC, OK?
Add Some DDD to Your ASP.NET MVC, OK?
 
Domain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVCDomain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVC
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 

Improving ASP.NET MVC Application Performance

  • 1. Improving ASP.NET MVC Application Performance Steve Smith The Code Project SteveSmithBlog.com | @ardalis www.mvcConf.com
  • 2. Defining Performance Metrics • Page Execution Time • Requests/Sec • TTLB www.mvcConf.com
  • 3. Defining Performance Requirements • A given web request (/Home/Index) • Must return within a given time (TTLB or Page Execution Time) • Under a given load (Requests/Sec + Active Users) • Given system characteristics (50k records) • Resource constraints (< 400 database server requests/sec) www.mvcConf.com
  • 4. Performance Requirement • /Home/Index • Must return within 1s Page Execution Time • Given 100 request/sec and base database • With < 200 database requests/sec www.mvcConf.com
  • 5. Measure Baseline • Record the Scenario • Set up the Load Test • Run the Test • Analyze the Results www.mvcConf.com
  • 6. Baseline Measurement: MVC Music Store DEMO www.mvcConf.com
  • 8. Find the Slowest Pages www.mvcConf.com
  • 9. Tuning a Web Application Define Goal Meets Goal Measure System Stop Does Not Meet Goal Form Hypothesis; Change Only One Thing! Alter System www.mvcConf.com
  • 10. Most Common Performance Problems • Database – Too many queries – Queries Not Optimized • Network Requests – From Server to Services – From Browser to Web Server www.mvcConf.com
  • 11. Simple but Important • Be sure production DLLs are compiled in Release mode! • Isis.CodePlex.com (still alpha) www.mvcConf.com
  • 12. Caching • Output Caching – [OutputCache] attribute – Applies to • Action methods within Controller • Or Entire Controller www.mvcConf.com
  • 13. Identify Pages To Cache www.mvcConf.com
  • 16. Add Data Caching • Apply to Read operations • Use where Output Caching can’t be used • Consider applying at Repository level • Consider using Sql Cache Invalidation or short cache duration www.mvcConf.com
  • 17. What About Writes? • Avoid blocking on writes – Send messages – Use Async calls on server – Use Async/Ajax calls from client • Logically partition reads and writes – Command Query Responsibility Separation (CQRS) www.mvcConf.com
  • 20. What about Async? • Async Actions • AsyncController • Improves scalability • May improve performance www.mvcConf.com
  • 21. Comparing MVC and View Engines • MVC 2 Template on MVC 2 – 8135 Requests/sec • MVC 2 Template on MVC 3 – 7987 Requests/sec • MVC 3 Webforms View Engine on MVC 3 – 7457 Requests/sec • MVC 3 Razor View Engine on MVC 3 – 7136 Requests/sec http://blogs.msdn.com/b/marcinon/archive/2011/01/17/mvc-3-performance.aspx www.mvcConf.com
  • 22. MVC 3 Performance • Unobtrusive client-side validation on by default • Razor view engine imposes small cost over webforms view engine • Performance improved for: – Expression caching (lambdas) – URL generation – Action lookup – Filter invocation www.mvcConf.com
  • 23. MVC Gotchas • Avoid HttpResponse.WriteSubstitution() – Contents may be incorrectly cached – http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx – May work with MVC3 + ASPX; not supported; definitely not w/Razor • RenderAction() Cache Bug – Calling an action with OutputCache attribute may result in entire page being cached – http://haacked.com/archive/2009/05/12/donut-hole-caching.aspx www.mvcConf.com
  • 24. MVC Performance Tips Disable Unused View Engines • Html.EditorFor, Html.DisplayFor always look for templates for each view engine • Save extra “misses” to disk by removing unused view engines. www.mvcConf.com
  • 25. Remove Unused View Engines www.mvcConf.com
  • 26. MVC Performance Tips Avoid Passing Null to Strongly Typed Views w/Helpers • Helpers like Html.TextBoxFor(m => m.Name) will throw NullReferenceException • Exceptions will be caught/ignored, but may add up to negative performance impact www.mvcConf.com
  • 27. Avoid Passing Null to View www.mvcConf.com
  • 28. MVC Performance Tips Uninstall IIS UrlRewrite Module • If no applications on the server are using it • No effect in MVC apps before v3 • Enhances speed of URL generation www.mvcConf.com
  • 29. Uninstall UrlRewrite (if not used) www.mvcConf.com
  • 31. Summary of Perf Gains 300 250 200 Base Release Mode 150 No Null ViewModel 100 1 ViewEngine 50 OutputCache 0 Pages/Sec Page Time (ms) www.mvcConf.com
  • 32. Summary • Set Goals – Don’t Optimize Prematurely • Measure and Tune Scientifically • Look for big wins first • Watch out for Gotchas and apply Tips www.mvcConf.com
  • 33. References • http://blogs.msdn.com/b/marcinon/archive/2011/01/17/mvc-3-performance.aspx • http://blogs.msdn.com/b/marcinon/archive/2011/02/07/mvc-performance-tips.aspx • http://www.asp.net/mvc/tutorials/improving-performance-with-output-caching-cs • http://www.asp.net/mvc/tutorials/adding-dynamic-content-to-a-cached-page-cs • http://mvcmusicstore.codeplex.com/ • http://isis.codeplex.com/ www.mvcConf.com
  • 34. Questions? Tweet Your Questions to: @ardalis How do I…? #mvcconf Steve Smith ssmith@lakequincy.com SteveSmithBlog.com Twitter: @ardalis www.mvcConf.com