{"id":5561,"date":"2015-02-09T09:29:00","date_gmt":"2015-02-09T09:29:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/webdev\/2015\/02\/09\/asp-net-mvc-5-2-3-web-pages-3-2-3-and-web-api-5-2-3-release\/"},"modified":"2015-02-09T09:29:00","modified_gmt":"2015-02-09T09:29:00","slug":"asp-net-mvc-5-2-3-web-pages-3-2-3-and-web-api-5-2-3-release","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet\/asp-net-mvc-5-2-3-web-pages-3-2-3-and-web-api-5-2-3-release\/","title":{"rendered":"ASP.NET MVC 5.2.3, Web Pages 3.2.3 and Web API 5.2.3 Release"},"content":{"rendered":"<p>While the MVC team is working hard on MVC 6 as part of the ASP.NET 5 effort, we also keep working on the 5.x packages. Today we are releasing ASP.NET MVC 5.2.3, Web Pages 5.2.3 and Web API 5.2.3.<\/p>\n<p>This release addresses 13 issues. Here is the full <a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/list\/advanced?keyword=&amp;status=Closed&amp;type=All&amp;priority=All&amp;release=v5.2.3%20Beta%7Cv5.2.3%20RTM&amp;assignedTo=All&amp;component=Unassigned%7CFacebook%7CGeneral%7CMVC%7CWeb%20API%7CWeb%20Pages%2FRazor&amp;sortField=LastUpdatedDate&amp;sortDirection=Descending&amp;page=0&amp;reasonClosed=Fixed\">list<\/a>.<\/p>\n<h2>Highlight of issues fixed<\/h2>\n<h3>Web API Issues<\/h3>\n<p><a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2092\">2092<\/a> Significant performance improvement in the default overload for <em>System.Net.HttpFormatting.ReadAsAsync<\/em> by caching the default JSON formatter. This can result in improvements of 100s of milliseconds on the second call to <em>ReadAsAsync<\/em> (or similarly to the write method).<\/p>\n<p><a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2103\">2103<\/a> Batch&#8217;s inner request&#8217;s Url not being decoded in WebHost scenarios.<\/p>\n<p><a title=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2101\" href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2101\">2101<\/a> Error parsing MIME multipart when using irregular mime types<\/p>\n<h3>MVC Issues<\/h3>\n<p><a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2155\">2155<\/a> Remote attribute does not work boolean fields and <em>Html.CheckBoxFor<\/em><\/p>\n<p><a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2081\">2081<\/a> Performance improvement in <em>OutputCacheAttribute<\/em> for child action<\/p>\n<p><a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2136\">2136<\/a> Attribute routing does not set <em>ControllerContext.IsChild<\/em> correctly<\/p>\n<p><a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2172\">2172<\/a>, <a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2048\">2048<\/a> &ndash; Unobtrusive validation fixes<\/p>\n<h3>MVC and Web Pages Issues<\/h3>\n<p><a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2085\">2085<\/a> Performance improvement in rendering Razor views<\/p>\n<p><a href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2119\">2119<\/a> Performance improvement in rendering attributes in Razor<\/p>\n<h3>Shout Out<\/h3>\n<p>We want to convey a big thank you to <strong>Nick Craver <\/strong>and<strong> Marc Gravell<\/strong>, who reported two of the performance issues we resolved in this release and provided a pretty cool Pull Request to fix one of them.<\/p>\n<h3>Issue 2085 in detail<\/h3>\n<p>Issue <a title=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2085\" href=\"https:\/\/aspnetwebstack.codeplex.com\/workitem\/2085\">2085<\/a> was about the fact the MVC copied <em>ViewData<\/em> for partial views, and templated helpers. In a reasonably large page with a reasonable amount of data in the <em>ViewBag<\/em> this proves out to be rather costly. We are now using a copy on write strategy instead. We took this improvement over to MVC 6 as well.<\/p>\n<h4>The Test<\/h4>\n<p>We built a test site, that put about 50 items in the <em>ViewBag<\/em>. For each of these items we rendered a partial view. This is similar to having 50 templated helpers (such as <em>DisplayFor<\/em> and <em>EditorFor<\/em>) used on a page.<\/p>\n<p>We ran two types of tests:<\/p>\n<p>1. Load the site with a constant stream of requests at the rate of 100 requests\/second, and compare memory utilization and garbage collection characteristics for MVC 5.2.2 and MVC 5.2.3.<\/p>\n<p>2. Load the site with maximum amount of requests and compare the requests\/second rate between MVC 5.2.2 and MVC 5.2.3.<\/p>\n<h5>Results<\/h5>\n<p><strong>Test 1<\/strong><\/p>\n<p>The interesting data in this scenario as the reduction of time spent in GC and reduction in overall allocations. Note that Gen2 garbage collection count went down from 57 to 1! And the time in GC was sliced almost three fold.<\/p>\n<table style=\"width: 599px\" border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td valign=\"bottom\" width=\"182\">  <strong>Area<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"145\">\n<p><strong>5.2.2<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"188\">\n<p><strong>5.2.3<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"82\">\n<p><strong>Delta %<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"181\">\n<p>Total request (count)<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"144\">\n<p align=\"right\">2,911<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"187\">\n<p align=\"right\">2,869<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"84\">&nbsp;<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"181\">\n<p>Trace duration (seconds)<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"144\">\n<p align=\"right\">30<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"186\">\n<p align=\"right\">30<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"86\">&nbsp;<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"180\">\n<p>Request\/second<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"143\">\n<p align=\"right\">97.03<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"186\">\n<p align=\"right\">95.63<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"88\">&nbsp;<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"180\">\n<p><strong>GC CPU Samples (msec)<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"143\">\n<p align=\"right\"><strong>12,139.00 <\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"185\">\n<p align=\"right\"><strong>6,682.00<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"89\">\n<p align=\"right\"><strong>45%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"180\">\n<p><strong>Total allocations (MB)<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"143\">\n<p align=\"right\"><strong>&nbsp;&nbsp;&nbsp; 18,049.79<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"185\">\n<p align=\"right\"><strong>12,602.08<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"90\">\n<p align=\"right\"><strong>30%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"180\">\n<p><strong>Total GC Pause (msec)<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"143\">\n<p align=\"right\"><strong>1,103.20<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"184\">\n<p align=\"right\"><strong>663.00<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"91\">\n<p align=\"right\"><strong>40%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"179\">\n<p>Gen0 GC (count)<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"142\">\n<p align=\"right\">76<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"184\">\n<p align=\"right\">107<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"91\">\n<p align=\"right\">-41%<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"179\">\n<p>Gen1 GC (count)<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"142\">\n<p align=\"right\">317<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"184\">\n<p align=\"right\">106<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"91\">\n<p align=\"right\">67%<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"179\">\n<p><strong>Gen2 GC (count)<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"142\">\n<p align=\"right\"><strong>57<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"184\">\n<p align=\"right\"><strong>1<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"91\">\n<p align=\"right\"><strong>98%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"179\">\n<p><strong>CPU \/ request (msec\/req)<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"142\">\n<p align=\"right\"><strong>4.17<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"184\">\n<p align=\"right\"><strong>2.33<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"91\">\n<p align=\"right\"><strong>44%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"179\">\n<p><strong>% CPU Time spent on GC<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"142\">\n<p align=\"right\"><strong>6.40%<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"184\">\n<p align=\"right\"><strong>2.30%<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"92\">\n<p align=\"right\"><strong>64%<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Test 2<\/strong><\/p>\n<p>In this scenario the number of requests\/sec went up 70%, and less time was spent in GC.<\/p>\n<table style=\"width: 599px\" border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td valign=\"bottom\" width=\"183\">\n<p><strong>Area<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"142\">\n<p><strong>5.2.2<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"184\">\n<p><strong>5.2.3<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"88\">\n<p><strong>Delta %<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"185\">\n<p>Total request (count)<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"141\">\n<p align=\"right\">5,246<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"182\">\n<p align=\"right\">8,895<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"90\">&nbsp;<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p>Trace duration (seconds)<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"140\">\n<p align=\"right\">30<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"181\">\n<p align=\"right\">30<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"92\">&nbsp;<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p><strong>Request\/second<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"139\">\n<p align=\"right\"><strong>174.87<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"180\">\n<p align=\"right\"><strong>296.50<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"93\">\n<p align=\"right\"><strong>70%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p><strong>GC CPU Samples (msec)<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"139\">\n<p align=\"right\"><strong>39,615<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"180\">\n<p align=\"right\"><strong>34,704<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"94\">\n<p align=\"right\"><strong>12.40%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p><strong>Allocations\/Request (MB\/Request)<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"139\">\n<p align=\"right\"><strong>6.382<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"179\">\n<p align=\"right\"><strong>4.739&nbsp; <\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"95\">\n<p align=\"right\"><strong>34.66<\/strong>%<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p><strong>Total GC Pause (msec)<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"139\">\n<p align=\"right\"><strong>2,974.60<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"179\">\n<p align=\"right\"><strong>3,215.70<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"96\">\n<p align=\"right\"><strong>-8.11%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p>Gen0 GC (count)<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"138\">\n<p align=\"right\">76<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"179\">\n<p align=\"right\">99<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"96\">\n<p align=\"right\">-30.26%<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p>Gen1 GC (count)<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"138\">\n<p align=\"right\">317<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"179\">\n<p align=\"right\">368<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"96\">\n<p align=\"right\">-16.09%<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p><strong>Gen2 GC (count)<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"138\">\n<p align=\"right\"><strong>57<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"179\">\n<p align=\"right\"><strong>45<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"96\">\n<p align=\"right\"><strong>21.05%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p>CPU \/ request (msec\/req)<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"138\">\n<p align=\"right\">87.42<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"179\">\n<p align=\"right\">155.63<\/p>\n<\/td>\n<td valign=\"bottom\" width=\"96\">\n<p align=\"right\">-78.03%<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"bottom\" width=\"186\">\n<p><strong>% CPU time spent on GC<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"138\">\n<p align=\"right\"><strong>8.60%<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"179\">\n<p align=\"right\"><strong>7.80%<\/strong><\/p>\n<\/td>\n<td valign=\"bottom\" width=\"97\">\n<p align=\"right\"><strong>9.30%<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>We hope you enjoy these performance and functionality improvements!<\/h3>\n","protected":false},"excerpt":{"rendered":"<p>While the MVC team is working hard on MVC 6 as part of the ASP.NET 5 effort, we also keep working on the 5.x packages. Today we are releasing ASP.NET MVC 5.2.3, Web Pages 5.2.3 and Web API 5.2.3. This release addresses 13 issues. Here is the full list. Highlight of issues fixed Web API [&hellip;]<\/p>\n","protected":false},"author":407,"featured_media":58792,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[197],"tags":[4,31,7434,7333,7470,34,7286,7439,7230,7432,7495],"class_list":["post-5561","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aspnet","tag-net","tag-asp-net","tag-asp-net-4-5","tag-asp-net-mvc","tag-asp-net-mvc-facebook","tag-asp-net-web-api","tag-mvc","tag-mvc-5","tag-web-api","tag-webapi","tag-webstack"],"acf":[],"blog_post_summary":"<p>While the MVC team is working hard on MVC 6 as part of the ASP.NET 5 effort, we also keep working on the 5.x packages. Today we are releasing ASP.NET MVC 5.2.3, Web Pages 5.2.3 and Web API 5.2.3. This release addresses 13 issues. Here is the full list. Highlight of issues fixed Web API [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/5561","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/users\/407"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/comments?post=5561"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/5561\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media\/58792"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media?parent=5561"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/categories?post=5561"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/tags?post=5561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}