<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><language>en</language><title>Blog posts by Per Bjurström</title> <link>https://world.optimizely.com/blogs/Per-Bjurstrom/</link><description></description><ttl>60</ttl><generator>Optimizely World</generator><item> <title>Visual Studio 2019 and Windows Server 2019</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2019/4/visual-studio-2019-and-windows-server-2019/</link>            <description>&lt;p&gt;The &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=EPiServer.EpiserverCMSVisualStudioExtension&quot;&gt;Visual Studio integration&lt;/a&gt;&amp;nbsp;now supports Visual Studio 2019, it should shortly be available in the Visual Studio Marketplace (the &quot;Manage Extensions&quot; menu option inside Visual Studio 2019). The Alloy sample templates that is shipped as part of the Visual Studio integration is also available as an &lt;a href=&quot;https://github.com/episerver/alloy-mvc-template&quot;&gt;open-source project on Github&lt;/a&gt; in case you missed that.&lt;/p&gt;
&lt;p&gt;Our QA teams have also completed testing the different Episerver products on Windows Server 2019 and its now an officially&amp;nbsp;&lt;a href=&quot;/link/df75ea624a1243cba22a46114e9f4934.aspx&quot;&gt;supported operating system.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/link/e0cb977682234ede9f4b591c370a92bc.aspx&quot; /&gt;&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2019/4/visual-studio-2019-and-windows-server-2019/</guid>            <pubDate>Mon, 15 Apr 2019 12:47:09 GMT</pubDate>           <category>Blog post</category></item><item> <title>CMS drops support for WebForms</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2018/10/cms-drops-support-for-webforms/</link>            <description>&lt;p&gt;This is an early heads up that CMS 11.x will be the last generation of CMS with support for building templates on ASP.NET WebForms. When the ASP.NET MVC support was launched with Episerver 7 back in 2012 it quickly became the technology of choice for building modern web sites, some of our newer modules since such as Forms only supports MVC and Commerce dropped support for WebForms earlier this year. Today all new sites are either built on ASP.NET MVC or as a SPA.&lt;/p&gt;
&lt;p&gt;For sites built on WebForms we will continue to support them on the CMS 11.x generation. There will be no breaking change release of CMS this year.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2018/10/cms-drops-support-for-webforms/</guid>            <pubDate>Fri, 19 Oct 2018 09:18:03 GMT</pubDate>           <category>Blog post</category></item><item> <title>Performance improvements in CMS 11</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2018/3/performance-improvements-in-cms-11/</link>            <description>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;Performance improvements are done continously but there are some that require breaking changes so I thought I mention some specifically that we did, they can have a huge impact on site performance.&lt;/p&gt;
&lt;h2&gt;Memory usage of&amp;nbsp;PropertyData&lt;/h2&gt;
&lt;p&gt;Custom properties on any IContent&amp;nbsp;is backed by a PropertyDataCollection that contains classes inheriting PropertyData. So in a running CMS site there might a ton of these classes cached into memory, small memory optimizations really make a huge difference here. In CMS 11 PropertyData was reviewed for references that did not had to be there, for example a reference to the LocalizationService was removed&amp;nbsp;and backwards compatiblity with translation methods was resolved via extension methods instead. The more custom properties you have in a site, the bigger difference these changes makes to overall memory usage.&lt;/p&gt;
&lt;h2&gt;Load time from database&lt;/h2&gt;
&lt;p&gt;Previous optimizations and profiling we have done targeted a running site with a populated cache, for CMS 11 we tried to optimize cache misses when content is loaded from the database. For example, we changed so that the PropertyDataCollection is not created every time content is loaded from the database, instead a prototype is cached per content type and then cloned for each instance of that content type that is loaded from the database. This makes both the creation faster but also minimizes memory usage.&lt;/p&gt;
&lt;h2&gt;Memory usage in long running jobs&lt;/h2&gt;
&lt;p&gt;Jobs that go through all content in the database consume a lot of memory and you risk filling up the memory with content that never get accessed from the site, or even worse all content might not fit into memory. In those cases you would prefer to be able to control cache expiration, the default of 12 hours is probably not what you want.&lt;/p&gt;
&lt;p&gt;It is now possible to define a cache scope with custom expiration:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;var repo = ServiceLocator.Current.GetInstance&amp;lt;IContentRepository&amp;gt;();
using(var x = new ContentCacheScope { SlidingExpiration = TimeSpan.FromSeconds(10) })
{
   var content = repo.Get(contentLink)
   //etc..
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Scheduled jobs uses cache scope and run with a custom expiration of 1 minutes by default. Note that custom cache expiration only affects cache misses when content is loaded from the database and added to the cache, any content already in the cache is not affected. Even though it is also possible to disable the cache completely, I would not recommend it since it puts a lot of strain on the database (caused by language fallbacks and other features, a single call to get content might generate several calls behind the scenes).&lt;/p&gt;
&lt;h2&gt;Performance test&lt;/h2&gt;
&lt;p&gt;To test some of these changes I created an ordinary Alloy demo site and generated ~10,000 pages. The test is pretty basic, it clear the cache and recursively loads all content from the database while monitoring memory usage via the Garbage Collector (GC) in a background thread.&lt;/p&gt;
&lt;p&gt;I tested 3 different scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CMS.Core 10.10.4 calling GetChildren&amp;nbsp;recursively&lt;/li&gt;
&lt;li&gt;CMS.Core 11.3.4&lt;span&gt;&amp;nbsp;calling GetChildren recursively&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;CMS.Core 11.3.4 &lt;span&gt;calling GetChildren recursively&amp;nbsp;&lt;/span&gt;with cache scope set to 10 seconds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this test just upgrading the site to CMS 11 made the code run 2 seconds faster and consumed 60 MB less memory. The green line indicates running with a cache expiration of 10 seconds which might be a bit too small to have any real value but it shows nicely that it is possible to keep memory usage down when required for long running jobs. The content was generated into 2 hierarchies causing a bump in the lines when it loads already cache content and then moving over to the second hierarchy of not cache content.&lt;/p&gt;
&lt;p&gt;The Y axes is memory usage in megabytes and the X axis is time elapsed in seconds.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/link/f6d78d4e65b346da8442508bd13e076b.aspx&quot; width=&quot;1000&quot; alt=&quot;&quot; height=&quot;562&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It might be worth mentioning here that there is a pretty nasty bug in ASP.NET 4.7.1 causing the cache scavenger that tracks memory usage to stop working, which might cause a site to run out of memory completely, you can read more about it &lt;a href=&quot;https://github.com/Microsoft/dotnet/issues/552&quot;&gt;here &lt;/a&gt;and &lt;a href=&quot;/link/070e092007214dfbb8357ae517c9cf5a.aspx&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2018/3/performance-improvements-in-cms-11/</guid>            <pubDate>Thu, 01 Mar 2018 15:58:58 GMT</pubDate>           <category>Blog post</category></item><item> <title>CMS 11 pre-release packages</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2017/10/cms-11-pre-release-packages/</link>            <description>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;Pre-release packages of CMS 11 are being published to the &lt;a href=&quot;http://nuget.episerver.com/&quot;&gt;Episerver NuGet feed&lt;/a&gt;&amp;nbsp;today. A pre-release version indicates that the version is unstable, it has currently been tested by both QA and internal teams at Episerver for a few weeks but there are still a few issues that we are investigating. You can read about the changes in these posts about &lt;a href=&quot;/link/99088e3ce82b48a892b16b1646667312.aspx&quot;&gt;breaking changes in Core&lt;/a&gt; and &lt;a href=&quot;/link/8d933425eb544778817d0042130a68c8.aspx&quot;&gt;breaking changes in UI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;More documentation will be published when we release the actual packages. If you find issues or have questions let us know.&lt;/p&gt;
&lt;h2&gt;Upgrading an Alloy MVC&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you have latest version of Visual Studio (Tools-&amp;gt;Extensions and updates-&amp;gt;Updates-&amp;gt;Product Updates)&lt;/li&gt;
&lt;li&gt;Right click on the Episerver project and select Properties, make sure project targets .NET Framework 4.6.1 or higher. Recompile and test.&lt;/li&gt;
&lt;li&gt;Open &quot;Manage NuGet packages&quot;, select Updates,&amp;nbsp; select the Episerver feed, select &quot;Include pre-release&quot;&lt;/li&gt;
&lt;li&gt;Select all packages and click on Update&lt;/li&gt;
&lt;li&gt;If site is using XForms install that package (EPiServer.XForms)&lt;/li&gt;
&lt;li&gt;If site is using Search install that package (EPiServer.Search.Cms)&lt;/li&gt;
&lt;li&gt;If site is using Dynamic Content install that package (EPiServer.DynamicContent)&lt;/li&gt;
&lt;li&gt;Build and start&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;NOTE: Packages for Find, Commerce and other add-ons are not yet available, so testing these pre-release packages will ony work on sites that only use CMS.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Quick summary of new packages in CMS 11:&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;EPiServer.CMS.AspNet + EPiServer.Framework.AspNet&lt;/strong&gt;&lt;br /&gt;Contains all APIs and configuration related to web development on the ASP.NET stack (both MVC and WebForms). Existing namespaces are preserved to keep the upgrade as smooth as possible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EPiServer.ServiceLocation.StructureMap&lt;/strong&gt;&lt;br /&gt;Contains the integration with StructureMap 3, a new version supporting StructureMap 4 will be released soon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EPiServer.CMS.TinyMCE&lt;/strong&gt;&lt;br /&gt;Contains the rich-text editor based on TincyMCE.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EPiServer.Search.Cms (optional)&lt;/strong&gt;&lt;br /&gt;Contains the CMS integration for full-text search. Not required for Find or other search implementations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EPiServer.XForms (optional)&lt;/strong&gt;&lt;br /&gt;Contains the XForms have now been moved from the platform to a separate NuGet package.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EPiServer.DynamicContent (optional)&lt;/strong&gt;&lt;br /&gt;Dynamic Content has now been moved from the platform to a separate NuGet package.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EPiServer.Packaging (optional)&lt;/strong&gt;&lt;br /&gt;The add-on store is no longer a required package.&lt;/p&gt;
&lt;h2&gt;Known issues&lt;/h2&gt;
&lt;p&gt;These issues will be fixed before release.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sometimes content that should not be visible, such as container pages, randomly show up in menus and similar.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;EPiServer.Logging.Log4Net&amp;nbsp;2.2 package fails to update the binding redirect in web.config, you need to manually correct this.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2017/10/cms-11-pre-release-packages/</guid>            <pubDate>Mon, 30 Oct 2017 10:25:01 GMT</pubDate>           <category>Blog post</category></item><item> <title>Planned breaking changes 2017 (CMS Core)</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2017/8/planned-breaking-changes-2017-cms-core/</link>            <description>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;An update to let you know what breaking changes are planned for CMS Core, as we have done the last few years we plan for one breaking change release of CMS per year. With that said, please note that this is preliminary and subject to change. More details will be provided when we get closer to a release.&lt;/p&gt;
&lt;p&gt;For many projects this will just require a re-build of the solution assuming you have stayed up to date with the continuous release process and continuously fixed the obsolete warnings that shows up.&lt;/p&gt;
&lt;h2&gt;New NuGet packages for ASP.NET integration&lt;/h2&gt;
&lt;p&gt;New NuGet packages&amp;nbsp;&lt;strong&gt;EPiServer.CMS.AspNet and EPiServer.Framework.AspNet&lt;/strong&gt;&amp;nbsp;will be introduced which will contain all API&#39;s related to web development on the ASP.NET stack (both MVC and WebForms). Existing namespaces will be preserved to keep the upgrade as smooth as possible.&lt;/p&gt;
&lt;p&gt;The goal is that the &lt;strong&gt;EPiServer.CMS.Core&lt;/strong&gt; and &lt;strong&gt;EPiServer.Framework&lt;/strong&gt; NuGet packages will be &lt;a href=&quot;https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-standard-2-0/&quot;&gt;.NET Standard 2 compliant&lt;/a&gt;&amp;nbsp;and will not contain any API&#39;s related to ASP.NET development, and that they in the future can be used stand-alone (without a web.config).&lt;/p&gt;
&lt;p&gt;You might have noticed that we &lt;a href=&quot;/link/76974ad8d2a84c1b989ad0ac453ab663.aspx?releaseNoteId=CMS-6258&amp;amp;epsremainingpath=ReleaseNote/&quot;&gt;already started obsoleting methods&lt;/a&gt; that have dependencies on ASP.NET in core API&#39;s to prepare for this split. So for example the CreatePropertyControl-method in PropertyData will be removed since it has a dependency on WebForms (System.Web.UI.Control), but you can prepare for this change by registering controls on startup instead.&lt;/p&gt;
&lt;h2&gt;New NuGet package for StructureMap integration&lt;/h2&gt;
&lt;p&gt;A new NuGet package&lt;strong&gt;&amp;nbsp;EPiServer.ServiceLocation.StructureMap&lt;/strong&gt;&amp;nbsp;&lt;span&gt;will be introduced which will contain the integration with StructureMap, with support both for the existing signed StructureMap 3 and the new unsigned StructureMap 4 which we currently cannot support. The package only contain the integration and have NuGet dependencies on the official StructureMap packages. Episerver and module packages should not directly depend on this package but use our own&amp;nbsp;&lt;a href=&quot;/link/ebeb7390a6de4c16a2530221b226e292.aspx&quot;&gt;abstractions for dealing with dependency injection&lt;/a&gt;, this API have been available for a few versions now and is already being used by most Episerver products. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;This change makes it easier to support multiple versions of StructureMap&amp;nbsp;but we are also looking into the dependency injection system that is shipped with .NET Core. Moving the dependency to a NuGet package is the same approach we have for logging, where we have abstractions in the platform and an integration in a separate NuGet package.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You might have noticed that we &lt;a href=&quot;/link/76974ad8d2a84c1b989ad0ac453ab663.aspx?releaseNoteId=CMS-6258&amp;amp;epsremainingpath=ReleaseNote/&quot;&gt;obsoleted the &quot;Container&quot; property in the initialization system&lt;/a&gt; and move that logic into an extension method, that was a preparation for this change where the extension method will be provided by a separate NuGet package (since EPiServer.Framework&amp;nbsp;will no longer have any direct depedencies on StructureMap).&lt;/p&gt;
&lt;h2&gt;New NuGet packages for Dynamic Content and XForms&lt;/h2&gt;
&lt;p&gt;The legacy features Dynamic Content and XForms will be removed from the platform and moved into separate NuGet packages as add-ons instead (e.g. &lt;strong&gt;EPiServer.DynamicContent&lt;/strong&gt; and &lt;strong&gt;EPiServer.XForms&lt;/strong&gt;) with their own versioning number and breaking changes, as the platform progresses these features will become more limited over time. We recommend migrating to Forms or Blocks wherever possible.&lt;/p&gt;
&lt;h2&gt;PropertList&amp;lt;T&amp;gt; improvements&lt;/h2&gt;
&lt;p&gt;The base class PropertyList&amp;lt;T&amp;gt;&amp;nbsp;is an API that have been in beta for a long time and has no official documentation, we know some projects are using it despite the shortcomings. We plan to make a few breaking changes to make sure the API properly can support these property types, document what they support and not, and then remove the beta stamp from this class.&lt;/p&gt;
&lt;p&gt;As an example we are changing how properties are imported/exported by moving logic previously locked into PropertyData such as ToRawProperty to external services that can have their own dependencies and are easier to customize per property type. There will be a separate blog post with more details.&lt;/p&gt;
&lt;h2&gt;Performance improvements when loading content&lt;/h2&gt;
&lt;p&gt;Performance improvements up to 50% when content is loaded from the database, the results vary depending on the size of content types and the data being loaded. Besides optimizations of the API the larger behavioural change is that the CreateWritableClone-method is now also used when loading data from the database.&lt;/p&gt;
&lt;h2&gt;Bug fixes&lt;/h2&gt;
&lt;p&gt;We have a list of bugs&amp;nbsp;that we have not been able to fix since they are considered breaking according to semantic versioning.&lt;/p&gt;
&lt;h2&gt;User interface changes&lt;/h2&gt;
&lt;p&gt;A separate blog post about breaking changes in the UI will be published later.&lt;/p&gt;
&lt;h2&gt;Getting access to pre-releases&lt;/h2&gt;
&lt;p&gt;We will publish pre-release versions on our &lt;a href=&quot;http://nuget.episerver.com/&quot;&gt;NuGet site&lt;/a&gt; as soon as we have something that can be tested.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2017/8/planned-breaking-changes-2017-cms-core/</guid>            <pubDate>Thu, 17 Aug 2017 14:45:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Support for Visual Studio 2017</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2017/3/support-for-visual-studio-2017/</link>            <description>&lt;h3&gt;&lt;/h3&gt;
&lt;p&gt;A new&amp;nbsp;version of the Episerver Visual Studio extension with support for Visual Studio 2017 is now&amp;nbsp;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=EPiServer.EpiserverCMSVisualStudioExtension&quot;&gt;available on the Visual Studio Marketplace&lt;/a&gt;. We support all editions from Community to Enterprise. Visual Studio 2017 will be &lt;a href=&quot;https://launch.visualstudio.com/&quot;&gt;available for download on March 7th&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The best way to install it is using the &quot;Extensions and updates&quot; menu inside Visual Studio.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/link/97e126809647464887516fe92ac99ac3.aspx&quot; alt=&quot;Image InstallVSExtension.PNG&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;What changed&lt;/h2&gt;
&lt;p&gt;This new version contains the latest releases of the CMS NuGet packages, we plan to have another version released in the coming weeks with the latest version of the Find packages as well.&lt;/p&gt;
&lt;p&gt;Visual Studio 2017 requires add-ons to adhere to &lt;a href=&quot;https://blogs.msdn.microsoft.com/visualstudio/2016/11/16/visual-studio-2017-rc/&quot;&gt;new rules and a packaging format&lt;/a&gt;&amp;nbsp;to support the minimal footprint of Visual Studio 2017. So there are a lot of under-the-hood changes in this release.&lt;/p&gt;
&lt;p&gt;There is also full support for Visual Studio 2015 ofcourse. Support for Visual Studio 2012 and 2013 has been dropped for this version, but will make the old version downloadable stand-alone.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=EPiServer.EpiserverCMSVisualStudioExtension&quot;&gt;The page on the Visual Studio Marketplace contains more details&lt;/a&gt;. Try it out and let us know if you find any issues.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2017/3/support-for-visual-studio-2017/</guid>            <pubDate>Mon, 06 Mar 2017 14:18:43 GMT</pubDate>           <category>Blog post</category></item><item> <title>Planned breaking changes 2016</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2016/6/planned-breaking-changes-2016/</link>            <description>&lt;p&gt;An update to let you know what breaking changes are coming in&amp;nbsp;CMS this year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;The main breaking changes are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A new state AwaitingApproval for content. We are also adding new events to IContentEvents and new save actions. Supports features around content approval.&lt;/li&gt;
&lt;li&gt;IContentRepository.Save and the events around that (IContentEvents) have a few quirks and odd behaviours that we have fixed to make the API more consistent and work better with approvals.&lt;/li&gt;
&lt;li&gt;Migration to UTC dates in the database will be a required step when upgrading, be ready&amp;nbsp;by &lt;a href=&quot;/link/5237dc63906f423e96eb34159f5dd4d4.aspx&quot;&gt;doing the migration today&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Reviewed all APIs to make sure we do not expose implementation classes as part of our&amp;nbsp;public versioned API. We will make a separate post about this with more details.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Some of the smaller breaking changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Links to unpublished content will return 404 (instead of login screen).&lt;/li&gt;
&lt;li&gt;Localized texts will fallback to a fallback culture in the language files before falling back to values specified in code.&lt;/li&gt;
&lt;li&gt;LanguageBranch class now implements IReadOnly to support read-only caching.&lt;/li&gt;
&lt;li&gt;No longer possible to create sites without at least one host defined.&lt;/li&gt;
&lt;li&gt;Properties PageData.StartPublish/StopPublish are changed to Nullable.&lt;/li&gt;
&lt;li&gt;StartPublish will be null until published or set explicitly (today it defaults to&amp;nbsp;the created date which is misleading).&lt;/li&gt;
&lt;li&gt;Fixed confusing handling of empty properties (for example assigning an empty link item collection to a typed model resulted in a null value)&lt;/li&gt;
&lt;li&gt;IContentVersionRepository List methods have been consolidated into one&lt;/li&gt;
&lt;li&gt;The UI Framework&amp;nbsp;EPiServer.Shell.dll will be moved from NuGet package EPiServer.Framework to EPiServer.CMS.UI.Core.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A lot more details will be provided as part of the release, including a list of all breaking changes and which APIs are being changed.&amp;nbsp;Pre-release packages of the breaking change release&amp;nbsp;will be made available as part of the &lt;a href=&quot;/link/bac2c19b2b2b4a6fb3eba23049cdc3d1.aspx?page=1&quot;&gt;continous release process&lt;/a&gt; in the coming weeks.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2016/6/planned-breaking-changes-2016/</guid>            <pubDate>Thu, 25 Aug 2016 15:08:05 GMT</pubDate>           <category>Blog post</category></item><item> <title>Planned breaking changes 2015</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2015/6/planned-breaking-changes/</link>            <description>&lt;p&gt;An update to let you know what breaking changes we are doing in CMS later this year. For many sites the changes will go unnoticed, just another major version number, the latest version of the Alloy templates for example requires no code changes - just recompile and you are done.&lt;/p&gt;
&lt;h3&gt;Breaking Changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Remove hard dependency on Log4Net. This will make it possible to run on the latest version of Log4Net or use another provider. &lt;a href=&quot;/link/6e4b32229d0645f8b40e09e4f41be811.aspx&quot;&gt;Link to SDK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;As previously announced we will remove&amp;nbsp;&lt;a href=&quot;/link/32cd05b82687457d83fcae760049f7a3.aspx&quot;&gt;our implementation of WWF&lt;/a&gt; (Windows Workflow Foundation), where WWF 3 that we are using is now obsoleted and (officially) not supported on Azure. We are instead investing in &quot;Projects 2.0&quot; and you can follow the release feed to see this beta feature light up and support rich collaboration on not just pages but block, media and catalog content.&lt;/li&gt;
&lt;li&gt;Remove remains of the VPP system that was obsoleted in CMS 7.5. &lt;a href=&quot;/link/f71f3cc7fc73450da41b9d1adb3ffbed.aspx&quot;&gt;Link to SDK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Remove Content Channel and the other ASP.NET 2 Web Services that was last shipped in 7.5 and &lt;a href=&quot;/link/3381e12654c04ace971fe8a3d90ae081.aspx&quot;&gt;officially obsoleted in 8&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Remove assemblies EPiServer.BaseLibrary.dll and EPiServer.Implementation.dll. These assemblies was the framework of CMS 5 and contained internal features such as the ObjectStore. There are a few classes in there still used that are being moved to EPiServer.dll.&lt;/li&gt;
&lt;li&gt;Remove Page Objects. A feature that pre-dated blocks. &lt;a href=&quot;/link/161bbbcb02a5497fb4614c2417819eba.aspx&quot;&gt;Obsoleted in 7.5.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Disable Dynamic Properties by default. &lt;a href=&quot;/link/161bbbcb02a5497fb4614c2417819eba.aspx&quot;&gt;As officially annonced in 7.5 &lt;/a&gt;this feature does not support the new user interface. We know there will be a lot of sites upgrading that are using dynamic properties so it will be left intact and there will be a setting to enable/disable this feature.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Release later this year with more details. See&amp;nbsp;&lt;a href=&quot;/link/62a8bec7c26b4009bb3150a419440c0d.aspx&quot;&gt;this post by Magnus&lt;/a&gt; for updates on planned breaking changes in Commerce.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2015/6/planned-breaking-changes/</guid>            <pubDate>Thu, 02 Jul 2015 07:59:42 GMT</pubDate>           <category>Blog post</category></item><item> <title>Automatic database updates, Visual Studio 2015 and MVC 5</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2015/5/automatic-database-updates-visual-studio-2015-and-mvc-5/</link>            <description>&lt;h2&gt;Automatic database updates&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/link/f2da004adc534b739ed2322c20c85457.aspx&quot;&gt;When we first starting shipping database updates&lt;/a&gt; in our NuGet-packages we said that we would like to get back to this area:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;We have discussed building &lt;strong&gt;automatic database schema updates&lt;/strong&gt; into the products but based on the feedback we got early on it was more important to get the simple and controlled semi-automatic approach right first. Maybe based on your feedback and ideas we will get back to this area and offer more automation, let us know what you think.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The feedback has been very clear that there should be a built-in/official scenario for supporting automatic updates, especially when publishing to Azure the semi-automatic approach is too cumbersome. And for developers to keep track of database updates and importing them into custom database projects seems like an unnecessary step (unless you have other migration steps or an existing process for database updates that you want to integrate into).&lt;/p&gt;
&lt;p&gt;We discussed many approaches to this but finally decided that the built-in support should be flipping a switch and it should just work. When EPiServer starts, if it detects an older database version and you enabled this feature, it will automatically update the database to the correct version. The scripts from 7.5 and up are embedded into the assembly. Based on early feedback from some of our fellow EMVP we have also added extension points to make it possible to for example backup the database, or provide custom validation logic, refer to &lt;a href=&quot;/link/71614863c0ef4a70bad72c55ba5518d1.aspx&quot;&gt;Automatic schema updates&lt;/a&gt; for more details. Also see &lt;a href=&quot;/link/e847f50457a4463f8a758a090a31e988.aspx&quot;&gt;Henrik Fransas blog about customizing updates in Azure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This feature will be a complement to the existing Update-EPiDatabase/Export-EPiUpdates cmdlets, these options are not going away. Automatic database updates&amp;nbsp;are disabled by default, we want it to be a conscious decision to enable this feature.&lt;/p&gt;
&lt;p&gt;We are also adding a new cmdlet &lt;strong&gt;Initialize-EPiDatabase&lt;/strong&gt; that installs the current database schema into an empty database making it easier to switch to a&amp;nbsp;new&amp;nbsp;database in development.&lt;/p&gt;
&lt;p&gt;The new database features will be supported by Commerce as well, automatic updates as of today and Initialize-EPiDatabase in another week or so.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Visual Studio 2015 support and MVC 5&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We are also releasing an update of the Visual Studio extension. New EPiServer projects in this version will be based on &lt;strong&gt;MVC 5&lt;/strong&gt;, which as been a popular request. An SDK article on&amp;nbsp;&lt;a href=&quot;/link/9bb1c44bbd2e490dbf6813899532a11b.aspx&quot;&gt;how to upgrade an existing project to MVC 5&lt;/a&gt; is also available, to keep the impact of this update to a minimum we have decided to continue to support MVC 4 in our NuGet-packages but we urge everyone to upgrade. We have also added support for the release candidate of Visual Studio 2015.&lt;/p&gt;
&lt;p&gt;The update will be published today and should be visible as an update under ”Tools-&amp;gt;Extensions and Updates” inside Visual Studio or on the &lt;a href=&quot;https://visualstudiogallery.msdn.microsoft.com/4ad95160-e72f-4355-b53e-0994d2958d3e&quot;&gt;gallery page&lt;/a&gt;. The NuGet-packages are available on&amp;nbsp;&lt;a href=&quot;http://nuget.episerver.com&quot;&gt;nuget.episerver.com&lt;/a&gt; as usual.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2015/5/automatic-database-updates-visual-studio-2015-and-mvc-5/</guid>            <pubDate>Mon, 01 Jun 2015 08:39:08 GMT</pubDate>           <category>Blog post</category></item><item> <title>Uploading blobs to Azure Storage with PowerShell</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2015/4/uploading-blobs-to-azure-storage/</link>            <description>&lt;p&gt;When uploading media in EPiServer the binary data are stored in a system called &lt;a href=&quot;/link/3f506d1cbce64f1f9d502b360a1cd7f8.aspx?id=117602&quot;&gt;blob providers&lt;/a&gt;. By default media are stored on disk in a folder located at &lt;strong&gt;&amp;lt;path_to-site&amp;gt;\App_Data\blobs&lt;/strong&gt;. Moving all those blobs to Azure is just one line of code in the Azure PowerShell console (just make sure the current directory is the &lt;strong&gt;blobs&lt;/strong&gt;-folder):&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;ls -File -Recurse | Set-AzureStorageBlobContent -Container mycontainer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you have not used Azure PowerShell before you might want to &lt;a href=&quot;http://azure.microsoft.com/en-us/documentation/articles/powershell-install-configure/&quot;&gt;read the getting started&lt;/a&gt;. To store blobs in Azure (you don&#39;t need to run the site in Azure to do this) install the&amp;nbsp;&lt;a href=&quot;http://nuget.episerver.com/en/OtherPages/Package/?packageId=EPiServer.Azure&quot;&gt;EPiServer.Azure package&lt;/a&gt; and change blob provider in web.config:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;    &amp;lt;blob defaultProvider=&quot;azureblobs&quot;&amp;gt;
      &amp;lt;providers&amp;gt;
        &amp;lt;add name=&quot;azureblobs&quot; type=&quot;EPiServer.Azure.Blobs.AzureBlobProvider,EPiServer.Azure&quot;
              connectionStringName=&quot;EPiServerAzureBlobs&quot; container=&quot;mycontainer&quot;/&amp;gt;
      &amp;lt;/providers&amp;gt;
    &amp;lt;/blob&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then add the connection string:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;  &amp;lt;connectionStrings&amp;gt;
    &amp;lt;add name=&quot;EPiServerAzureBlobs&quot; connectionString=&quot;DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=abcdefghij&quot; /&amp;gt;
  &amp;lt;/connectionStrings&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Screenshot:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/link/e4f965c4c378429e85bfa69b4c47ab2b.aspx?id=120130&quot; alt=&quot;Image AzurePowershellCapture.PNG&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There is also a scheduled job on NuGet called&amp;nbsp;&lt;a href=&quot;http://nuget.episerver.com/en/OtherPages/Package/?packageId=EPiCode.BlobConverter&quot;&gt;EPiCode.BlobConverter&lt;/a&gt; that supports uploading to any blob provider if you prefer having an actual user interface ;-)&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2015/4/uploading-blobs-to-azure-storage/</guid>            <pubDate>Fri, 10 Apr 2015 15:15:23 GMT</pubDate>           <category>Blog post</category></item><item> <title>Typed tabs/groups</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/2015/2/typed-tabsgroups/</link>            <description>&lt;p&gt;Currently in the typed model you are limited to defining sort order on individual content types and properties. The order defined then indirectly defines in which order groups are displayed when creating new content, and in which order the tabs are shown when editing content in the forms view. Normally you define groups as a list of constants that you use in the DisplayAttribute:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;[ContentType(GroupName=GroupNames.News, Order=1)]
public class ArticlePage : PageData
{
  [Display(GroupName = GroupNames.Contact)]
  public virtual ContentReference Image { get; set; }
}

public static class GroupNames
{
   public const string News = &quot;News&quot;;
   public const string Contact= &quot;Contact&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In CMS 8 we are adding support for defining order and required access on the groups themselves. Just decorate the class:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt; [GroupDefinitions]
public static class GroupNames
{
   [Display(GroupName=&quot;MyNews&quot;, Order=1)]
   public const string News = &quot;News&quot;;
   [RequiredAccess(AccessLevel.Publish)]
   public const string Contact= &quot;Contact&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Groups that do not have any order defined will fallback to the indirect sorting and will have sort index set to -1. It is also possible to override built-in groups to change sort order, for example:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;[GroupDefinitions]
public static class GroupNames
{
    [Display(Order = 1000)]
    public const string Content = SystemTabNames.Content;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;See SDK article&amp;nbsp;&lt;a href=&quot;/link/4ef315102c474ebabff187444a7b966f.aspx&quot;&gt;Grouping content types and properties&lt;/a&gt; for more details.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/2015/2/typed-tabsgroups/</guid>            <pubDate>Wed, 11 Feb 2015 13:53:08 GMT</pubDate>           <category>Blog post</category></item><item> <title>NuGet: A new database version for CMS</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2014/6/NuGet-A-new-database-version-for-CMS/</link>            <description>&lt;p&gt;We are releasing an update to CMS that contain database schema changes, since this will be the first time we release schema changes via NuGet I thought I spend some time describing how it works and why we made certain choices. If you are using Commerce and been updating the past weeks you will already be familiar with these commands.&lt;/p&gt;  &lt;p&gt;We started some time ago building support for shipping database updates in NuGet packages based on some design principals:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Never modify the database without consent&lt;/strong&gt;: You should be able to update packages without being “scared” that schema changes are applied to a shared database or a database without backups that you need to revert. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Use ordinary SQL files:&lt;/strong&gt; Make sure environments that have high auditing requirements can run them manually when needed. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Simple to update for devs:&lt;/strong&gt; Make it super-easy to update the database schema cross products, assuming both CMS and Commerce starts shipping schema changes more often you don’t want any manual trickery. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The first thing you notice after applied the latest update is the more helpful error message when you start the site for the first time.&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/6389fbd93e4e477f8693d27bdcfabf74.png&quot; width=&quot;704&quot; height=&quot;131&quot; /&gt;&lt;/p&gt;  &lt;p&gt;To apply the updates open up the ‘Package Manager Console’ and run the command &lt;strong&gt;Update-EPiDatabase&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/92d2d74ba84e4726b59cbef84dd20f6f.png&quot; width=&quot;704&quot; height=&quot;126&quot; /&gt;&lt;/p&gt;  &lt;p&gt;This command will update database schema for the database defined in the connection string &lt;strong&gt;EPiServerDB&lt;/strong&gt; for CMS (and EcfSqlConnection for Commerce), the printout shows which files it finds that are potential updates. &lt;/p&gt;  &lt;p&gt;The files are by convention:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Stored in a folder &lt;strong&gt;tools/epiupdates/sql&lt;/strong&gt; in each NuGet package. &lt;/li&gt;    &lt;li&gt;Files are named after the package version they were introduced in (ie 7.8.0.sql) &lt;/li&gt;    &lt;li&gt;Each file begins with a validation statements that determines if the file should be executed or not (you can run this statement manually if need to very if a file has been applied or not). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For troubleshooting, or if you just want to see more details, you can add &lt;strong&gt;-Verbose:$true&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/01ef6ed19cf1475f8ac0374a0b1b41ee.png&quot; width=&quot;670&quot; height=&quot;484&quot; /&gt;&lt;/p&gt;  &lt;p&gt;Our recommended approach to deploy changes to production is to run &lt;strong&gt;Export-EPiUpdates&lt;/strong&gt; to export the schema changes to a folder that is independent of Visual Studio, this command basically does the same thing as Update-EPiDatabase but dumps the commands into a bat file to make them portable and easy to run in any environment. If you have a look inside that file you will notice a simple command line tool &lt;strong&gt;epideploy.exe&lt;/strong&gt; that used to execute scripts, same tool that is executed when you update Update-EPiDatabase.&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/925ab2bd18a34bebbe464f36330304f2.png&quot; width=&quot;704&quot; height=&quot;178&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/077572a766714c9f9650cb7dcdd6ff14.png&quot; width=&quot;704&quot; height=&quot;174&quot; /&gt;&lt;/p&gt;  &lt;p&gt;You can also run this command on the development site to test it out, if there are no changes nothing will be modified so it’s safe to run multiple times.&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/14d0a30ad60e4c4284d361d32fe2fb04.png&quot; width=&quot;704&quot; height=&quot;163&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A final note. We have discussed building automatic database schema updates into the products but based on the feedback we got early on it was more important to get the simple and controlled semi-automatic approach right first. Maybe based on your feedback and ideas we will get back to this area and offer more automation, let us know what you think.&lt;/p&gt;  &lt;p&gt;Note: All of this is documented in the SDK under “Updating EPiServer via NuGet”, including schema changes to configuration which I did not cover in this post.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2014/6/NuGet-A-new-database-version-for-CMS/</guid>            <pubDate>Mon, 09 Jun 2014 15:57:25 GMT</pubDate>           <category>Blog post</category></item><item> <title>New version of Visual Studio extension available</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2014/5/New-version-of-Visual-Studio-extension-available/</link>            <description>&lt;p&gt;A few weeks ago we released an update to the Visual Studio extension to &lt;a href=&quot;http://world.episerver.com/Blogs/Per-Bjurstrom/Archive/2014/3/Creating-site-from-NuGet-packages/&quot;&gt;create new sites without using Deployment Center&lt;/a&gt;. With that update we made it possible to create new sites configured with all the required NuGet packages, much like how ASP.NET projects are working in Visual Studio.&lt;/p&gt;  &lt;p&gt;Today we are releasing another update to include the Alloy demo sites in the Visual Studio extension, both the MVC and the WebForms version.&amp;#160; &lt;/p&gt;  &lt;p&gt;We&amp;#160; combined the project templates to a single option in the “New Project” dialog to avoid having too many combinations and alternatives:&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px; margin-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/6e6854c6937940c4a9ddae29a0e53d1c.png&quot; width=&quot;804&quot; height=&quot;595&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Instead we show an options dialog where you can select project templates, and a new option to add the built-in search capability (the EPiServer.Search NuGet package).&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/bb65c2fc27554a7b8ccc99c11f668ca9.png&quot; width=&quot;679&quot; height=&quot;411&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A nice aspect for sites created based on the Alloy templates is that you get custom namespaces which was not previously possible:&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px; margin-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/facf30203c9d41b58efd191ff168f447.png&quot; width=&quot;644&quot; height=&quot;370&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Another requested feature was the possibility to use some item templates in class libraries so we added that feature as well:&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/d82c8f12c77243e9a635281e3c3dc97b.png&quot; width=&quot;845&quot; height=&quot;610&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;How do I download this update?&lt;/h3&gt;  &lt;p&gt;Under Tools –&amp;gt; “Extensions and updates” inside Visual Studio 2012 or 2013, search for “EPiServer” in the “Online”-section. Or the “Updates”-section if you already have it installed. As part of this release we are also in the process of updating the &lt;a href=&quot;http://world.episerver.com/Documentation/CMS/Get-started-with-CMS/Introduction/&quot;&gt;Getting Started&lt;/a&gt; guide and releasing an updated SDK. Release notes available on &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/4ad95160-e72f-4355-b53e-0994d2958d3e&quot;&gt;Visual Studio gallery&lt;/a&gt;.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2014/5/New-version-of-Visual-Studio-extension-available/</guid>            <pubDate>Tue, 13 May 2014 09:01:20 GMT</pubDate>           <category>Blog post</category></item><item> <title>Creating site from NuGet packages</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2014/3/Creating-site-from-NuGet-packages/</link>            <description>&lt;p&gt;Today we are releasing a new version of the Visual Studio extension that runs completely standalone, no requirement on Deployment Center (no MSI’s, no GAC etc.). Sites created with the Visual Studio extension are configured with NuGet packages out-of-the-box and are more similar to ordinary ASP.NET projects (both SQL and geolocation databases are for example stored in App_Data to mention one thing). The new templates also use &lt;a href=&quot;http://www.hanselman.com/blog/IntroducingSystemWebProvidersASPNETUniversalProvidersForSessionMembershipRolesAndUserProfileOnSQLCompactAndSQLAzure.aspx&quot;&gt;Universal Providers&lt;/a&gt; to simplify deployment to Azure. &lt;/p&gt;  &lt;p&gt;It may not be obvious but the Visual Studio extension does not need an internet connection to create new sites, which actually is a requirement from Microsoft for project templates (so no connection to &lt;a href=&quot;http://nuget.episerver.com&quot;&gt;nuget.episerver.com&lt;/a&gt; required). You can of course go online and update the solution to the latest greatest versions after the site is created, the Visual Studio extension will not be released as often as our NuGet packages even though we will of course keep it up to date over time.&lt;/p&gt;  &lt;p&gt;There are also a couple of smaller changes such as the “Scheduled Job” template exemplifies stoppable jobs with UI feedback. Big thanks to you that tested and contributed to the previews builds. &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/4ad95160-e72f-4355-b53e-0994d2958d3e&quot;&gt;See release notes for details&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/link/a54e9412958e4861be5a748773c07127.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/47df7dedc2f14d9e998a5cf4f91f25eb.png&quot; width=&quot;504&quot; height=&quot;208&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;How do I get it?&lt;/h3&gt;  &lt;p&gt;Under Tools –&amp;gt; “Extensions and updates” inside Visual Studio, search for “EPiServer” in the “Online”-section. Or the “Updates”-section if you already have it installed. As part of this release we are also in the process of updating the &lt;a href=&quot;http://world.episerver.com/Documentation/CMS/Get-started-with-CMS/Introduction/&quot;&gt;Getting Started&lt;/a&gt; guide and releasing an updated SDK.&lt;/p&gt;  &lt;h3&gt;Want to create your own project templates?&lt;/h3&gt;  &lt;p&gt;An interesting part of this release is the project templates (what you see under File-&amp;gt;New Project-&amp;gt;EPiServer), they are just an empty project that installs the new&lt;strong&gt; EPiServer.CMS&lt;/strong&gt; package. That means that you can have your own “empty” starter projects and just add this package to get a working EPiServer site.&lt;/p&gt;  &lt;p&gt;I created a sample starter kit off the Visual Studio templates with a start page and the media types:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;git clone &lt;/strong&gt;&lt;a title=&quot;https://github.com/bjuris/EPiServerStarterKitSolution.git&quot; href=&quot;https://github.com/bjuris/EPiServerStarterKitSolution.git&quot;&gt;&lt;strong&gt;https://github.com/bjuris/EPiServerStarterKitSolution.git&lt;/strong&gt;&lt;/a&gt; (or click on “Download ZIP”) &lt;/li&gt;    &lt;li&gt;Open the Solution File and in Package Manager Console run: &lt;strong&gt;Install-Package EPiServer.CMS&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Start the site, hit F5. Ready to go. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href=&quot;/link/90b18fad66bc45d09066785b48cbd3a5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/d294a1155fa74920a1345ec0e7c810b9.png&quot; width=&quot;524&quot; height=&quot;228&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Feel free to fork and change to your heart’s content.&lt;/p&gt;  &lt;p&gt;Do I need the Visual Studio extension for this? No, but the Visual Studio extension comes with some 20 item templates with everything from Initialization Modules to Page Types, they work on any ASP.NET project. So, even though you don’t use our project templates you can still use the item templates which at least I find highly usable.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2014/3/Creating-site-from-NuGet-packages/</guid>            <pubDate>Thu, 27 Mar 2014 11:15:45 GMT</pubDate>           <category>Blog post</category></item><item> <title>Remote Events Providers (EPiServer 7.5)</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2013/12/Remote-Events-Providers-EPiServer-75/</link>            <description>&lt;p&gt;&lt;a href=&quot;http://world.episerver.com/Blogs/Per-Bjurstrom/Archive/2009/10/SQL-replication-and-EPiServer-CMS/&quot;&gt;A long time ago I wrote an article&lt;/a&gt; that among other things used a trick to change how Remote Events works (the system used in load balancing). The implementation switched out Windows Communication Foundation (WCF) in favor of a custom database implementation to get events flowing in synch with data (when using SQL replication). &lt;/p&gt;  &lt;p&gt;But now we have official support for Event Providers in 7.5 – and it’s used by both Commerce and CMS. It’s a pretty easy API to implement if you want to make your own provider:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/link/8795e81e8faf4a53943643091f222bcb.png&quot;&gt;&lt;img title=&quot;image_thumb9&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image_thumb9&quot; src=&quot;/link/9d265d4831d647dfb9fcc510303130a3.png&quot; width=&quot;573&quot; height=&quot;123&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The built-in provider, based on WCF, is the same implementation used in previous versions so it should be a smooth upgrade if you have a complex setup with TCP endpoints for example. &lt;/p&gt;  &lt;p&gt;But we are also releasing more providers on the NuGet feed, one for Azure Service Bus and one for Amazon SQS/SNS to take advantage of the elastic scaling of cloud environments. How to configure them are available in the CMS SDK.&lt;/p&gt;  &lt;p&gt;Anyhow, I picked up the old code from my custom implementation and rewrote it into the new event provider system. Basically its just serializes and deserializes message to and from a table in SQL Server, more a proof of concept than anything I would put into production. &lt;a href=&quot;https://github.com/bjuris/EPiServer.Samples.DatabaseEvents&quot;&gt;It’s available on GitHub&lt;/a&gt; if you want to play with it.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2013/12/Remote-Events-Providers-EPiServer-75/</guid>            <pubDate>Tue, 03 Dec 2013 14:23:02 GMT</pubDate>           <category>Blog post</category></item><item> <title>Synchronization of typed models</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2012/10/Synchronization-of-typed-models/</link>            <description>&lt;p&gt;EPiServer 7 comes with typed models for pages and blocks, this post is about what happens when we synchronize the code with the database (and not about how you define the model). All of this is documented in some way or form in the SDK and there are more areas like refactoring and renaming of properties that you can read about in the SDK that I won’t go into.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overview of synchronization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the first phase during startup classes marked with the &lt;em&gt;[ContentType]&lt;/em&gt;&lt;strong&gt;-&lt;/strong&gt;attribute are scanned and meta data on these classes and its properties are added to an in-memory repository, this repository contains all the information from your model classes down to individual attribute settings on properties. This phase is the only phase that deals with reflection.&lt;/p&gt;
&lt;p&gt;In the second phase the in-memory repository is analyzed by comparing it to the content types stored in the database. From this phase the in-memory repository is updated with information about synchronization status such as if a property is new or removed and if there are any conflicts.&lt;/p&gt;
&lt;p&gt;In the third phase any changes are committed to the database, as a general rule changes that cause loss in content on the site are never committed automatically. For example if you delete a property from code that has content stored it will be marked as “Missing in code” in admin mode and you will have to manually delete it. By enabling logging using &lt;em&gt;log4net&lt;/em&gt; you can detect warnings or errors.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/link/0ec110ce79f049a58dd98c8599f574c3.png&quot;&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; title=&quot;image[10][3]&quot; src=&quot;/link/5ceb82283b2e47a2a2e978b4df91b8bc.png&quot; alt=&quot;image[10][3]&quot; width=&quot;470&quot; height=&quot;51&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Default Values – not the ones you define in code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the features is that administrators can do a manual override of some settings defined in code, such as for example if a property is required or not. The “Revert to default” button in admin mode (when you are editing a property or content type) can be used to reset settings defined by an administrator.&lt;/p&gt;
&lt;p&gt;The architecture behind this is that content types are merged with the in-memory repository when loaded from the database. And when a content type is stored back to the database it is stripped of any values that comes from the typed model. So some changes in code are actually never stored in the database at all. If you want to dig deep into the database you will notice that a lot of columns in &lt;em&gt;tblPropertyDefinition, &lt;/em&gt;that contains defined properties, are actually &lt;em&gt;NULL&lt;/em&gt; when the defaults comes from code.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/link/ce2a3e13ba84444f9a7d43e7f5d26723.png&quot;&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; title=&quot;image&quot; src=&quot;/link/5384b7b89db24c0cb96b083de445904f.png&quot; alt=&quot;image&quot; width=&quot;521&quot; height=&quot;90&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sort order of properties&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://world.episerver.com/Blogs/Lee-Crowe/Dates/2012/4/PageTypeBuilder-and-EPiServer-CMS-6-R2-Synching-Issues--Important/&quot;&gt;As some of you know&lt;/a&gt; the sort index on property definitions has been a double-edged sword, it had this feature that it enforced unique sort orders to make it easier to get consistent sort order and to re-sort properties in the user interface.&lt;/p&gt;
&lt;p&gt;This feature was good when page types was only entered manually and it helped the person entering the type to get correct order of things. This feature is painful when defining properties in code since the code and what is stored in the database easily gets out-of-sync if you don’t enforce unique index in code as well. So as of EPiServer 7 we have changed this behavior, sort index is never enforced when saving properties but always enforced (1..n) if you re-order using drag-n-drop or use the move up and down arrows in admin mode. To make sure the sort order is consistent we order first by index and for properties that do not have a sort index we “put them at the end” and order by the ID, so order of creation basically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Synching manually&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can disable the commit phase by setting &lt;em&gt;enableModelSyncCommit&lt;/em&gt; to &lt;em&gt;false&lt;/em&gt; on the &lt;em&gt;siteSettings&lt;/em&gt;-element in &lt;em&gt;episerver.config&lt;/em&gt;. This can be useful if there are many developers working on a shared database and you want to avoid a newly added property to be removed from another piece of the code. In some scenarios it makes sense to have it disabled always in development and the dev working on the types should enabled it when needed.&lt;/p&gt;
&lt;p&gt;A new Synchronize-button will appear in admin mode so that you can manually start the sync process on a per content item bases, it’s the exact same process as would start automatically if this setting was not disabled but on a single type. For new types you can of course create an empty page/block type and then use the Guid in the &lt;em&gt;[ContentType]&lt;/em&gt;-attribute to hook up your code to the database.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/link/7a011ff819a64d0fa5e7f00fe43248d2.png&quot;&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; title=&quot;image[2][6][2]&quot; src=&quot;/link/14448c5f2ea34506a4d9e8ea2c0facdf.png&quot; alt=&quot;image[2][6][2]&quot; width=&quot;514&quot; height=&quot;108&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deployment in load balanced scenarios&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Deploying code in load balanced scenarios gets a bit more trickier when your code is automatically updating the database, if you just add the latest code one server at a time with full control over when they go down and come up you are fine. But if you have a staging server and another front end server reboots while you are doing your final testing on the code using a shared database you don’t want it changing your content types with old models in the live environment.&lt;/p&gt;
&lt;p&gt;You can solve this by disabling the commit phase on all servers but one, the staging server, as described above. You can also use our support for semantic versioning. Every time a content type is changed we make sure we update the full type name including assembly version number. If the sync process detects that for example version 1.2 was the version that updated the content type the last time and the code has version 1.1 we silently back off from that type and display a little warning message in admin to notify you. This feature can of course be used to your advantage in dev environments as well.&lt;/p&gt;
&lt;p&gt;Another point is that the event system is not enabled until after the synchronization has completed to make sure deploying new content types on one site does not clear the caches on all other sites/servers forcing them to read potentially not up-to-date info and put unnecessary&amp;nbsp;load on the database.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: We only check major and Minor on the version number (major.minor[.build[.revision]]).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/link/098a83ff0e0a4bdaba0a687f625b6b0a.png&quot;&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; title=&quot;image[6]&quot; src=&quot;/link/a2257ec85d7a4ab292d0b13a6dfc5ae6.png&quot; alt=&quot;image[6]&quot; width=&quot;491&quot; height=&quot;179&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changing type on properties&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As I mentioned in the introduction all changes that does not result in data loss for the content will be committed, including changing types on properties. But sometimes you need to change type on a property and you are fine with loosing data stored on it, so in the case of mismatch on a content type we enable the previously read-only fields Name and Type in admin mode to allow for manual override of whatever we did not dare do automatically.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/link/bf90887d7e104665a7519dead17f3f27.png&quot;&gt;&lt;img style=&quot;background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;&quot; title=&quot;image[18]&quot; src=&quot;/link/5a64f327e9104d958de7d1314298b448.png&quot; alt=&quot;image[18]&quot; width=&quot;244&quot; height=&quot;86&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2012/10/Synchronization-of-typed-models/</guid>            <pubDate>Tue, 23 Oct 2012 17:10:05 GMT</pubDate>           <category>Blog post</category></item><item> <title>EPiServer 7: Startup Performance</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2012/9/EPiServer-7-Startup-Performance/</link>            <description>&lt;p&gt;One of the areas we have improved is the startup time of EPiServer 7, there is &lt;strong&gt;a lot of new functionality&lt;/strong&gt;&amp;nbsp; that requires initialization but it actually starts faster that previous versions.&lt;/p&gt;
&lt;p&gt;Some of the changes we have done is using &lt;strong&gt;parallelization&lt;/strong&gt; where a single initialization module runs multiple independent tasks in parallel or run some tasks asynchronously. Another change to speed up typed pages is that we precompile the &lt;strong&gt;Castle proxies&lt;/strong&gt; that is backing your custom models , that processes starts in the background before the the first page is accessed. We also enabled the &lt;a href=&quot;http://world.episerver.com/Blogs/Per-Bjurstrom/Archive/2009/4/Optimize-startup-time-in-ASPNET/&quot;&gt;&lt;strong&gt;optimizeCompilations&lt;/strong&gt;&lt;/a&gt; by default which I blogged about a few years back, that does a big difference. We also rewrote assembly scanning and implemented a disk based cache and centralized discovery of types to avoid doing reflection over and over again.&lt;/p&gt;
&lt;p&gt;To make it easier to debug startup performance there is a hidden gem that displays the last startup and how long time each initialization module needed at &lt;a href=&quot;http://[site]/[UI]/Shell/Debug/ShowTimeMeters&quot;&gt;http://[site]/[UI]/Shell/Debug/ShowTimeMeters&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/link/c9e729349c3842cdb587560eaf964ba2.png&quot;&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; title=&quot;image&quot; src=&quot;/link/34f5f6b6a6e541139d2e0395111999db.png&quot; border=&quot;0&quot; alt=&quot;image&quot; width=&quot;604&quot; height=&quot;409&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There is a web.config setting in &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa903313(v=vs.71).aspx&quot;&gt;appSettings&lt;/a&gt; that enables this debug view, you get the name of the key that goes into web.config when you access the url the first time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; If you are running one of the EPiServer 7 preview versions then the URL will be &lt;a href=&quot;http://[site]/[UI]/modules/Shell/Debug/ShowTimeMeters&quot;&gt;http://[site]/[UI]/modules/Shell/Debug/ShowTimeMeters&lt;/a&gt; instead.&amp;nbsp; Thanks Steve for noticing.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2012/9/EPiServer-7-Startup-Performance/</guid>            <pubDate>Wed, 12 Sep 2012 11:41:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Initialize HTTP events in a module</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2011/1/Initialize-HTTP-events-in-a-module/</link>            <description>&lt;p&gt;EPiServer CMS 6 and Community 4 introduced a new approach to initialization, &lt;a href=&quot;http://world.episerver.com/Blogs/Magnus-Strale/Dates/2009/12/Introducing-the-new-Initialization-System-in-EPiServer-CMS-6/&quot;&gt;read more about it here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;We are adding infrastructure for subscribing to HTTP events in the R2 wave with the new &lt;strong&gt;IInitializableHttpModule&lt;/strong&gt; interface which is defined like this:&lt;/p&gt;  &lt;div style=&quot;border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px&quot; id=&quot;codeSnippetWrapper&quot;&gt;   &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;interface&lt;/span&gt; IInitializableHttpModule : IInitializableModule&lt;br /&gt;{&lt;br /&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; InitializeHttpEvents(HttpApplication application);&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Every time a new &lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx&quot; target=&quot;_blank&quot;&gt;HttpApplication&lt;/a&gt;&lt;/strong&gt; is being initialized this interface will let you participate and listen to events. Do remember that this is an initializer interface, there will only be one instance of your initializer but there will be many &lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx&quot; target=&quot;_blank&quot;&gt;HttpApplication&lt;/a&gt;&lt;/strong&gt; instances being initialized. The use case for this interface is to able to deploy modules without adding adding an &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.ihttpmodule.aspx&quot; target=&quot;_blank&quot;&gt;HTTP Module&lt;/a&gt; in web.config.&lt;/p&gt;

&lt;p&gt;A skeleton module to use the new interface:&lt;/p&gt;

&lt;div style=&quot;border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px&quot; id=&quot;codeSnippetWrapper&quot;&gt;
  &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;[ModuleDependency(&lt;span style=&quot;color: #0000ff&quot;&gt;typeof&lt;/span&gt;(EPiServer.Web.InitializationModule))]&lt;br /&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; MyInitialization : IInitializableHttpModule&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; InitializeHttpEvents(HttpApplication application)&lt;br /&gt;    {&lt;br /&gt;        application.BeginRequest += application_BeginRequest;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Initialize(EPiServer.Framework.Initialization.InitializationEngine context)&lt;br /&gt;    {&lt;br /&gt;        DataFactory.Instance.PublishedPage += Instance_PublishedPage;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Uninitialize(EPiServer.Framework.Initialization.InitializationEngine context)&lt;br /&gt;    {&lt;br /&gt;        DataFactory.Instance.PublishedPage -= Instance_PublishedPage;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Preload(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;[] parameters)&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Instance_PublishedPage(&lt;span style=&quot;color: #0000ff&quot;&gt;object&lt;/span&gt; sender, PageEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;//implementation&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; application_BeginRequest(&lt;span style=&quot;color: #0000ff&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #008000&quot;&gt;//implementation&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2011/1/Initialize-HTTP-events-in-a-module/</guid>            <pubDate>Thu, 27 Jan 2011 10:51:39 GMT</pubDate>           <category>Blog post</category></item><item> <title>CDN Support goes open-source</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2010/6/CDN-Support-goes-open-source/</link>            <description>&lt;p&gt;Last year I did a lot of research on using a CDN with EPiServer CMS, that resulted in a module that I released on my blog. &lt;/p&gt;  &lt;p&gt;You can read more about that research here:    &lt;br /&gt;&lt;a href=&quot;http://world.episerver.com/Blogs/Per-Bjurstrom/Archive/2009/3/CdnSupport-module-preview/&quot;&gt;http://world.episerver.com/Blogs/Per-Bjurstrom/Archive/2009/3/CdnSupport-module-preview/&lt;/a&gt;     &lt;br /&gt;&lt;a href=&quot;http://world.episerver.com/Blogs/Per-Bjurstrom/Archive/2009/5/CdnSupport-module-preview-2/&quot;&gt;http://world.episerver.com/Blogs/Per-Bjurstrom/Archive/2009/5/CdnSupport-module-preview-2/&lt;/a&gt;     &lt;br /&gt;&lt;a href=&quot;http://world.episerver.com/Blogs/Per-Bjurstrom/Archive/2009/4/CdnSupport-module-in-action/&quot;&gt;http://world.episerver.com/Blogs/Per-Bjurstrom/Archive/2009/4/CdnSupport-module-in-action/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Since then at least 1 site is running it live and a few others are thinking about using the module. Today we are making it available as open-source. The module should work with both CMS 5 R2 and CMS 6.&lt;/p&gt;  &lt;p&gt;The code is tightly integrated with the URL rewriting mechanism and Virtual Path Provider’s (VPP). Since the module may generate large amounts of calls to the VPP API’s there is also a small cache MicroCache&amp;lt;T&amp;gt; that offloads the resolving of URL’s. The solution also contains a test project.&lt;/p&gt;  &lt;p&gt;Let me know if you have any feedback or want to contribute to the project.&lt;/p&gt;  &lt;p&gt;Visit the project here: &lt;a href=&quot;http://cdn4episerver.codeplex.com/&quot;&gt;CDN Support for EPiServer CMS&lt;/a&gt;&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2010/6/CDN-Support-goes-open-source/</guid>            <pubDate>Mon, 14 Jun 2010 14:00:12 GMT</pubDate>           <category>Blog post</category></item><item> <title>Using the CSRF page extension in CMS 6</title>            <link>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2010/4/Using-the-CSRF-page-extension-in-CMS-6/</link>            <description>&lt;p&gt;EPiServer CMS 6 has a new page extension that add &lt;a href=&quot;http://en.wikipedia.org/wiki/Cross-site_request_forgery&quot;&gt;CSRF&lt;/a&gt; prevention on a Web form. I won’t go into detail of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Cross-site_request_forgery&quot;&gt;CSRF&lt;/a&gt; exploit since Wikipedia has a good description. In short, someone uses a visitors browser to send a malicious request to another site were the user is already logged in to (or trusts in some way).&lt;/p&gt;  &lt;p&gt;The countermeasure implemented in this page extension is a per-user cryptographically generated token stored in a cookie. A hidden field on the page is generated based on the user token and salted with information specific to that page. Whenever a post is made to the page we validate the tokens in the PreInit phase. There are no server-state involved except a per-site secret stored in the database used to protect the values from tampering (safe for load balancing).&lt;/p&gt;  &lt;p&gt;This page extension called AntiForgeryValidation is completely transparent to the user as long as they have cookies enabled and hopefully to you as a developer as well. &lt;/p&gt;  &lt;div style=&quot;border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px&quot; id=&quot;codeSnippetWrapper&quot;&gt;   &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;using&lt;/span&gt; EPiServer.Web.PageExtensions;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;namespace&lt;/span&gt; EPiServer.Templates&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// The default start page&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000&quot;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;partial&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Default : TemplatePage&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; Default() : &lt;span style=&quot;color: #0000ff&quot;&gt;base&lt;/span&gt;(AntiForgeryValidation.OptionFlag,0)&lt;br /&gt;        {&lt;br /&gt;        }&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;But, you do want to test that it actually works after you implemented the code, the easiest way is to use a tool like &lt;a href=&quot;https://addons.mozilla.org/sv-SE/firefox/addon/6683&quot;&gt;Firecookie&lt;/a&gt; to manipulate the request. For example: Make a request to the page and store away the cookie __epiAntiForgeryToken_X, close the browser and go the page again, now edit the cookie and paste the old value before doing a submit to the page. The error you will get should be “This request has probably been tampered with. Close the browser and try again.”.&lt;/p&gt;

&lt;p&gt;There are some limitations, it won’t work with output caching since we need the unique field on the page. Also, if you are doing some custom coding you need to post the hidden field&amp;#160; “_epiAntiForgeryToken” as well or the page won’t validate. Also, the user must have cookies enabled.&lt;/p&gt;

&lt;p&gt;This extension is used extensively on administrative interfaces in EPiServer CMS 6 that is based on Web forms. If you ever worked with ASP.NET MVC you will know that this feature exists in MVC as well and they use the same type of prevention scheme.&lt;/p&gt;

&lt;p&gt;There are some alternative implementations of CSRF protection in ASP.NET Web forms like changing how ViewState is generated or by using Session State but we did not want to take an dependency on those features, you choose what scheme fits your requirements.&lt;/p&gt;

&lt;p&gt;Le me know if you have any questions.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Per-Bjurstrom/Archive/2010/4/Using-the-CSRF-page-extension-in-CMS-6/</guid>            <pubDate>Fri, 23 Apr 2010 17:22:45 GMT</pubDate>           <category>Blog post</category></item></channel>
</rss>