<?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 Dmytro Duk</title> <link>https://world.optimizely.com/blogs/Dmytro-Duk/</link><description></description><ttl>60</ttl><generator>Optimizely World</generator><item> <title>Planned maintenance of Visitor Intelligence data storage in East US</title>            <link>https://world.optimizely.com/blogs/Dmytro-Duk/Dates/2020/8/planned-maintenance-of-visitor-intelligence-data-storage-in-east-us/</link>            <description>&lt;p&gt;Data storage used by Visitor Intelligence and Profile Store in East US requires maintenance to enable Microsoft to migrate resources to newer hardware in Azure.&lt;/p&gt;
&lt;p&gt;The maintenance is planned on Monday, August 10, 02:00-04:00 AM Eastern Time Zone, when the traffic is minimal in East US. This maintenance will not affect any other regions.&lt;/p&gt;
&lt;p&gt;While most product updates and changes cause no services interruption, this update may result in a delay in event processing during the update. The product will catch up with event processing after the update is completed and events tracked during the update should not be lost. Please try to minimize using Profile Store REST API during the maintenance, please avoid updating data.&lt;/p&gt;
&lt;p&gt;We apologize for any impact that this maintenance may have. The team works hard to minimize the impact of this maintenance, and to provide our customers with as much information as possible.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Dmytro-Duk/Dates/2020/8/planned-maintenance-of-visitor-intelligence-data-storage-in-east-us/</guid>            <pubDate>Fri, 07 Aug 2020 14:06:58 GMT</pubDate>           <category>Blog post</category></item><item> <title>A sneak peek of segmenting based on historical data in Episerver Insight</title>            <link>https://dmytroduk.com/?p=465</link>            <description>Yes, we are going to enable segmenting based on historical data. See below how you can do it soon. Today: Segments based on profiles Insight users have 2 options for creating segment based on profiles data: using filter in Insight UI and defining OData-like queries using Profile Store API. Please find more information about managing&lt;div class=&quot;blog-grid-button&quot;&gt;&lt;a class href=&quot;https://dmytroduk.com/techblog/a-sneak-peek-of-segmenting-based-on-historical-data-in-episerver-insight/&quot;&gt;Read More &lt;i class=&quot;fa fa-arrow-right&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;</description>            <guid>https://dmytroduk.com/?p=465</guid>            <pubDate>Thu, 12 Sep 2019 01:00:39 GMT</pubDate>           <category>Blog post</category></item><item> <title>A sneak peek of segmenting based on historical data in Episerver Insight</title>            <link>https://dmytroduk.com/?p=465</link>            <description>Yes, we are going to enable segmenting based on historical data. See below how you can do it soon. Today: Segments based on profiles Insight users have 2 options for creating segment based on profiles data: using filter in Insight UI and defining OData-like queries using Profile Store API. Please find more information about managing&lt;div class=&quot;blog-grid-button&quot;&gt;&lt;a class href=&quot;https://dmytroduk.com/techblog/a-sneak-peek-of-segmenting-based-on-historical-data-in-episerver-insight/&quot;&gt;Read More &lt;i class=&quot;fa fa-arrow-right&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;</description>            <guid>https://dmytroduk.com/?p=465</guid>            <pubDate>Wed, 11 Sep 2019 23:00:39 GMT</pubDate>           <category>Blog post</category></item><item> <title>Segments in Profile Store and Insight</title>            <link>https://dmytroduk.com/techblog/segments-in-profile-store-and-insight</link>            <description>&lt;p&gt;This blogpost introduces segments and describes how segments can be managed using Profile Store API and Insight. Using segments in CMS personalization and in Intelligent Campaign is outlined.&lt;/p&gt;
&lt;h2&gt;What is segment&lt;/h2&gt;
&lt;p&gt;A segment is a dynamic collection of visitor profiles that match certain criteria. Defining a segment is defining conditions or filters that profiles should match. Simple segment example: users who came to a website today.&lt;/p&gt;
&lt;h3&gt;Segments are dynamic&lt;/h3&gt;
&lt;p&gt;Please note that example segment above is &lt;strong&gt;dynamic&lt;/strong&gt;. Probably it is a different group of users every day. Some users might be the part of this segment yesterday, but today they do not match the segment if they have not visited the website. Returning visitors will still be the part of this segment tomorrow.&lt;/p&gt;
&lt;h3&gt;Segments are based on profiles&lt;/h3&gt;
&lt;p&gt;Segments are based on profile data and filters/conditions can be defined for profile properties. Currently (version 1.6.0) it is not possible to define a segment based on tracking events. Visitor statistics should be aggregated and stored in the visitor profile to be used when matching segment rules.&lt;/p&gt;
&lt;h2&gt;Managing Segments&lt;/h2&gt;
&lt;p&gt;There are 2 ways to manage segments (and 2 target user groups):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using Insight UI (marketers)&lt;/li&gt;
&lt;li&gt;Using Profile Store API (developers)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of segment operations are available using both options, however there are some differences described below.&lt;/p&gt;
&lt;h3&gt;Creating segments&lt;/h3&gt;
&lt;h4&gt;Creating Segments in Insight UI&lt;/h4&gt;
&lt;p&gt;Marketer can filter profiles by Contact information, Last Seen date and Country facets in Profiles section of Insight UI. Entering a query in the search box performs the search based on visitor name and on profile Info collection that may contains email address, company name etc.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/FilterProfiles_2.jpg&quot;&gt;&lt;img width=&quot;644&quot; height=&quot;482&quot; title=&quot;&quot; style=&quot;border: 0px currentcolor; display: inline; background-image: none;&quot; alt=&quot;Filter Profiles&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/FilterProfiles_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Selected filters in Insight UI can be saved as a segment. Insight suggests proper segment name based on the current set of filters and allows making the new segment available in visitor groups. Current user name is stored in the SegmentManager field.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/CreateSegment_2.jpg&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;338&quot; title=&quot;&quot; style=&quot;border: 0px currentcolor; display: inline; background-image: none;&quot; alt=&quot;Create Segment&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/CreateSegment_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Creating segments in the Insight is limited by available UI facets. Selected combination of filters is stored as JSON in &lt;code&gt;ProfileFilter&lt;/code&gt; segment property.&lt;/p&gt;
&lt;p&gt;Please note that in current version 1.6.0 segments created in Insight UI are not tied to specific scope and can be used to slice profiles in all scopes.&lt;/p&gt;
&lt;h4&gt;Creating Segments in Profile Store API&lt;/h4&gt;
&lt;p&gt;Segment can be created by POST request to &lt;code&gt;/segments&lt;/code&gt; endpoint of Profile Store API. Segment JSON data is passed in the request body.&lt;/p&gt;
&lt;p&gt;Note: filter to match profiles is defined in &lt;code&gt;ProfileQuery&lt;/code&gt; property (unlike segments created in Insight UI that store filters in the &lt;code&gt;ProfileFilter&lt;/code&gt; segment property).&lt;/p&gt;
&lt;p&gt;The syntax for &lt;code&gt;ProfileQuery&lt;/code&gt; is described in &lt;a href=&quot;/link/cfb06d311fb94efd9895a867a4911cea.aspx&quot;&gt;Filtering, paging, and sorting&lt;/a&gt; article and in &lt;a href=&quot;https://github.com/Microsoft/api-guidelines/blob/vNext/Guidelines.md#97-filtering&quot;&gt;Microsoft Rest API Guidelines&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush: plain; toolbar: false; highlight: [5];&quot;&gt;POST api/v1.0/segments
{
    &quot;Name&quot;: &quot;Episerver Employees&quot;,
    &quot;Scope&quot;: &quot;default&quot;,
    &quot;ProfileQuery&quot;: &quot;Info.Company eq Episerver&quot;,
    &quot;AvailableForPersonalization&quot;: true
}&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Name&lt;/code&gt;, &lt;code&gt;Scope&lt;/code&gt; and &lt;code&gt;ProfileQuery&lt;/code&gt; values are required.&lt;/p&gt;
&lt;p&gt;The new created segment data is returned in the 201 Created response body:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; toolbar: false;&quot;&gt;{
  &quot;SegmentId&quot;: &quot;912f2150-82b5-5fa7-88c4-2d42fa700ac8&quot;,
  &quot;Scope&quot;: &quot;default&quot;,
  &quot;SegmentManager&quot;: null,
  &quot;ProfileQuery&quot;: &quot;Info.Company eq Episerver&quot;,
  &quot;AvailableForPersonalization&quot;: true,
  &quot;Archived&quot;: false,
  &quot;FavoredBy&quot;: [],
  &quot;Name&quot;: &quot;Episerver Employees&quot;,
  &quot;CreatedDate&quot;: &quot;2018-10-12T16:16:25.2186793Z&quot;,
  &quot;ModifiedDate&quot;: &quot;2018-10-12T17:22:11.3000335Z&quot;,
  &quot;MatchingProfiles&quot;: 4
}&lt;/pre&gt;
&lt;p&gt;Please note that any segment created using Profile Store API is always scoped and can be used to match profiles in the corresponding scope.&lt;/p&gt;
&lt;p&gt;The main advantage of creating segment using API is that developer is not limited by available filters in the Insight UI. &lt;code&gt;ProfileQuery&lt;/code&gt; is defined in the same way as filter when querying profiles and can include conditions for several properties in the profile data model, including information in the dynamic &lt;code&gt;Payload&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;It enables developers to aggregate values specific to customer business, store it in profile payload and create custom segments based on custom data.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/segments&lt;/code&gt; endpoint returns &lt;code&gt;400 Bad Request&lt;/code&gt; or &lt;code&gt;500 Server Error&lt;/code&gt; if provided segment definition is invalid or error happens when creating a segment.&lt;/p&gt;
&lt;h3&gt;Loading Segment Data&lt;/h3&gt;
&lt;h4&gt;Viewing Segment in Insight UI&lt;/h4&gt;
&lt;p&gt;Segments are listed in the Segments section of Insight UI. Marketer uses simple filtering to view segments managed by current user, recently created, favorited, archived or all segments.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/ViewSegments_2.jpg&quot;&gt;&lt;img width=&quot;644&quot; height=&quot;434&quot; title=&quot;&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;View Segments&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/ViewSegments_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clicking on the segment opens segments details and the list of profiles that currently match this segment.&lt;/p&gt;
&lt;h4&gt;Querying segments in Profile Store API&lt;/h4&gt;
&lt;p&gt;Developers can query existing segments by GET request to /segments endpoint of Profile Store API. Basic filtering, paging and sorting is supported according to the &lt;a href=&quot;https://github.com/Microsoft/api-guidelines/blob/vNext/Guidelines.md#97-filtering&quot;&gt;Microsoft Rest API Guidelines&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$filter&lt;/code&gt; querystring parameter is used to define a filtering expression that will be evaluated for segments. The following logical operators are supported within &lt;code&gt;$filter&lt;/code&gt; expression: &lt;code&gt;eq&lt;/code&gt;, &lt;code&gt;ne&lt;/code&gt;, &lt;code&gt;gt&lt;/code&gt;, &lt;code&gt;ge&lt;/code&gt;, &lt;code&gt;lt&lt;/code&gt;, &lt;code&gt;le&lt;/code&gt;, &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, &lt;code&gt;not&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Please see &lt;a href=&quot;https://github.com/Microsoft/api-guidelines/blob/vNext/Guidelines.md#97-filtering&quot;&gt;Microsoft Rest API Guidelines&lt;/a&gt; and &lt;a href=&quot;/link/cfb06d311fb94efd9895a867a4911cea.aspx&quot;&gt;Filtering, paging, and sorting&lt;/a&gt; article for more examples and details&amp;nbsp; about querying profiles, events and segments in Profile Store API.&lt;/p&gt;
&lt;p&gt;For example, the following should request 2 latest segments defined in the default scope by specific user:&lt;/p&gt;
&lt;pre&gt;GET api/v1.0/segments?$filter=Scope eq default and SegmentManager eq marketer@example.com&amp;amp;$orderBy=CreatedDate DESC&amp;amp;$top=2&lt;/pre&gt;
&lt;p&gt;The returned result 200 Ok contains the collection of segments that match defined filter, the number of returned items based on &lt;code&gt;$top&lt;/code&gt; value and the total number of matching segments (first segment is created using API and the second is created in Insight UI):&lt;/p&gt;
&lt;pre class=&quot;brush: plain; toolbar: false; highlight: [7,14,20,60];&quot;&gt;{
  &quot;items&quot;: [
    {
      &quot;SegmentId&quot;: &quot;912f2150-82b5-5fa7-88c4-2d42fa700ac8&quot;,
      &quot;Scope&quot;: &quot;default&quot;,
      &quot;SegmentManager&quot;: &quot;marketer@example.com&quot;,
      &quot;ProfileQuery&quot;: &quot;Info.Company eq Episerver&quot;,
      &quot;AvailableForPersonalization&quot;: true,
      &quot;Archived&quot;: false,
      &quot;FavoredBy&quot;: [],
      &quot;Name&quot;: &quot;Episerver Employees&quot;,
      &quot;CreatedDate&quot;: &quot;2018-10-14T21:16:25.2186793Z&quot;,
      &quot;ModifiedDate&quot;: &quot;2018-10-14T21:22:11.3000335Z&quot;,
      &quot;MatchingProfiles&quot;: 4
    },  
    {
      &quot;SegmentId&quot;: &quot;1e2987f2-3285-4b72-83b8-1b50b1e29613&quot;,
      &quot;Scope&quot;: &quot;default&quot;,
      &quot;SegmentManager&quot;: &quot;marketer@example.com&quot;,
      &quot;ProfileFilter&quot;: {
        &quot;Rules&quot;: [
          {
            &quot;Text&quot;: {
              &quot;Field&quot;: &quot;Country&quot;,
              &quot;Method&quot;: &quot;IsExactly&quot;,
              &quot;Value&quot;: &quot;DE&quot;
            }
          },
          {
            &quot;And&quot;: {}
          },
          {
            &quot;Text&quot;: {
              &quot;Field&quot;: &quot;ContactInformation&quot;,
              &quot;Method&quot;: &quot;IsExactly&quot;,
              &quot;Value&quot;: &quot;Known&quot;
            }
          },
          {
            &quot;And&quot;: {}
          },
          {
            &quot;Date&quot;: {
              &quot;Field&quot;: &quot;LastSeen&quot;,
              &quot;Method&quot;: &quot;Within&quot;,
              &quot;Values&quot;: [
                &quot;OneWeek&quot;
              ]
            }
          }
        ]
      },
      &quot;AvailableForPersonalization&quot;: true,
      &quot;Archived&quot;: false,
      &quot;FavoredBy&quot;: [],
      &quot;Name&quot;: &quot;Identified from Germany last seen within 1 week&quot;,
      &quot;Description&quot;: null,
      &quot;CreatedDate&quot;: &quot;2018-09-28T15:01:54.6417241Z&quot;,
      &quot;ModifiedDate&quot;: &quot;2018-09-28T15:01:54.6417241Z&quot;,
      &quot;MatchingProfiles&quot;: 15
    }
  ],
  &quot;total&quot;: 5,
  &quot;count&quot;: 2
}&lt;/pre&gt;
&lt;p&gt;Please note that the number of matching profiles returned for each segment in the list is not re-calculated. &lt;code&gt;MatchingProfiles&lt;/code&gt; property value is the number of patching profiles at the moment when the segment was created or updated last time.&lt;/p&gt;
&lt;p&gt;In case of error or invalid request the error message and code 500 or 400 are returned. For example, invalid filter syntax:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; toolbar: false;&quot;&gt;GET /api/v1.0/Segments?$filter=SegmentManager == test@example.com&lt;/pre&gt;
&lt;p&gt;400 Bad Request response is returned:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; toolbar: false;&quot;&gt;{
  &quot;error&quot;: {
    &quot;code&quot;: &quot;400&quot;,
    &quot;message&quot;: &quot;Invalid comparison phrase \&quot;SegmentManager == test@example.com\&quot;&quot;,
    &quot;target&quot;: &quot;&quot;,
    &quot;details&quot;: []
  }
}&lt;/pre&gt;
&lt;h4&gt;Getting segment data in Profile Store API&lt;/h4&gt;
&lt;p&gt;Specific segment data can be loaded by specifying the segment ID:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; toolbar: false;&quot;&gt;GET api/v1.0/segments/912f2150-82b5-5fa7-88c4-2d42fa700ac8&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;MatchingProfiles&lt;/code&gt; property value is re-evaluated when loading single segment data, it is the current number of matching profiles now:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; toolbar: false; highlight: [12];&quot;&gt;{
  &quot;SegmentId&quot;: &quot;912f2150-82b5-5fa7-88c4-2d42fa700ac8&quot;,
  &quot;Scope&quot;: &quot;default&quot;,
  &quot;SegmentManager&quot;: &quot;marketer@example.com&quot;,
  &quot;ProfileQuery&quot;: &quot;Info.Company eq Episerver&quot;,
  &quot;AvailableForPersonalization&quot;: true,
  &quot;Archived&quot;: false,
  &quot;FavoredBy&quot;: [],
  &quot;Name&quot;: &quot;Episerver Employees&quot;,
  &quot;CreatedDate&quot;: &quot;2018-10-12T16:16:25.2186793Z&quot;,
  &quot;ModifiedDate&quot;: &quot;2018-10-12T17:22:11.3000335Z&quot;,
  &quot;MatchingProfiles&quot;: 183
}&lt;/pre&gt;
&lt;h3&gt;Updating Segments&lt;/h3&gt;
&lt;h4&gt;Editing in Insight UI&lt;/h4&gt;
&lt;p&gt;Segment editing is partially supported in Insight UI. Editing menu is available by clicking on corresponding icon in segment list and in segment details view.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/EditSegmentActionMenu_2.jpg&quot;&gt;&lt;img width=&quot;314&quot; height=&quot;168&quot; title=&quot;&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;Edit Segment - Action Menu in the segment details&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/EditSegmentActionMenu_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/EditSegmentActionMenuList_2.jpg&quot;&gt;&lt;img width=&quot;314&quot; height=&quot;160&quot; title=&quot;&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;Edit Segment - Action Menu in the segment list&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/EditSegmentActionMenuList_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Inline editing is enabled for segment name and description when viewing segment details.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/EditSegmentName_2.jpg&quot;&gt;&lt;img width=&quot;644&quot; height=&quot;353&quot; title=&quot;&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;Inline segment name editing&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/EditSegmentName_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Currently changing the segment filters to match profiles is not supported in the Insight UI.&lt;/p&gt;
&lt;h4&gt;Updating in Profile Store API&lt;/h4&gt;
&lt;p&gt;Existing segment can be completely replaced/overridden by PUT request to &lt;code&gt;/segments&lt;/code&gt; endpoint and specifying the segment ID. For example, here we put a new segment data that includes description:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; toolbar: false; highlight: [4];&quot;&gt;PUT api/v1.0/segments/912f2150-82b5-5fa7-88c4-2d42fa700ac8
{
    &quot;Name&quot;: &quot;Episerver Employees&quot;,
    &quot;Description&quot;: &quot;All profiles that have Episerver value in Info.Company property&quot;,
    &quot;Scope&quot;: &quot;default&quot;,
    &quot;ProfileQuery&quot;: &quot;Info.Company eq Episerver&quot;,
    &quot;AvailableForPersonalization&quot;: true,
    &quot;SegmentManager&quot;: &quot;marketer@example.com&quot;
}&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;PUT&lt;/code&gt; request creates a new segment if there is no existing segment with specified ID.&lt;/p&gt;
&lt;p&gt;Like &lt;code&gt;POST&lt;/code&gt; method, the response body contains new segment data.&lt;/p&gt;
&lt;p&gt;Please note that updating/replacing segments that were created in the Insight UI is not supported in the Profile Store API. Technically it means that a segment cannot be updated using Profile Store API if segment &lt;code&gt;ProfileFilter&lt;/code&gt; property is not null.&lt;/p&gt;
&lt;h3&gt;Removing Segments&lt;/h3&gt;
&lt;p&gt;Deleting segments is not supported in the current versions (1.6.0) of both Insight UI and Profile Store API. The main reason is that removing a segment may cause problems if deleted segment is used anywhere in the application, for example in visitor groups or any other integration. Removing segments may be implemented later.&lt;/p&gt;
&lt;h4&gt;Archiving Segments&lt;/h4&gt;
&lt;p&gt;Archiving is a way to hide segments that are not actively used in Insight UI. These segments can be found in Archived section of Segments view.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/ArchivedSegments_4.jpg&quot;&gt;&lt;img width=&quot;644&quot; height=&quot;335&quot; title=&quot;&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;Archived Segments&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/ArchivedSegments_thumb_1.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Using Segment&lt;/h2&gt;
&lt;h3&gt;Personalization Using Segments&lt;/h3&gt;
&lt;p&gt;NuGet package &lt;code&gt;Episerver.Insight.Cms&lt;/code&gt; provides the Insight segment visitor group criterion. Insight API base URL and subscription key must be defined in appsettings &lt;code&gt;episerver:profiles.InsightApiBaseUrl&lt;/code&gt; and &lt;code&gt;episerver:profiles.InsightApiSubscriptionKey&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After installing the package and updating configuration, Insight segment criterion can be used when creating a visitor group. The list contains existing segments that have property value &lt;code&gt;AvailableForPersonalization=true&lt;/code&gt; (available in visitor group in Insight UI).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/CreateVisitorGroup_2.jpg&quot;&gt;&lt;img width=&quot;644&quot; height=&quot;417&quot; title=&quot;&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;Creating Visitor Group&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/CreateVisitorGroup_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Selecting a segment means that visitor should be the part of visitor group if his/her profile matches segment (fits the segment filters).&lt;/p&gt;
&lt;p&gt;Archived segments cannot be selected when creating a new visitor group, however it still works for personalization if it was selected in the visitor group criterion before archiving the segment.&lt;/p&gt;
&lt;p&gt;For example, marketer filters profiles by Country, creates a segment of visitors from Germany, adds Insight criterion in the visitor group settings and select this segment. Now this visitor group can be used to personalize content, for example to invite visitors from Germany to subscribe to newsletters for German clients.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/VisitorGroupPersonalization_2.jpg&quot;&gt;&lt;img width=&quot;314&quot; height=&quot;218&quot; title=&quot;&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;Visitor Group Personalization&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/VisitorGroupPersonalization_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/VisitorGroupPersonalizationPreview_2.jpg&quot;&gt;&lt;img width=&quot;314&quot; height=&quot;131&quot; title=&quot;&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;Visitor Group Personalization Preview&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/VisitorGroupPersonalizationPreview_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Segment in Intelligent Campaign&lt;/h3&gt;
&lt;p&gt;Intelligent Campaign is another good example of using segments. When creating a campaign, marketer can add the Insight Segment node in the working area and select a segment that should be used to filter recipients when sending campaign message.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/IntelligentCampaign_2.jpg&quot;&gt;&lt;img width=&quot;644&quot; height=&quot;311&quot; title=&quot;&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;Segments in Intelligent Campaign&quot; src=&quot;http://dmytroduk.com/Media/Default/Open-Live-Writer/Segments-in-Profile-Store-and-Insight_9B58/IntelligentCampaign_thumb.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Using segments in Campaign enables dynamic recipient targeting based on profiles information.&lt;/p&gt;
&lt;h3&gt;Implement your own integration!&lt;/h3&gt;
&lt;p&gt;I hope that developers will build new products and integrations on top of Profile Store. I&amp;rsquo;m looking forward to see your custom segments, personalization, visitor classification, activity analysis, integrations with CRM/ERP/whatever systems, websites and offline stores. Your feedback is very welcome!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;&lt;a href=&quot;http://feeds.dmytroduk.com/~ff/DmytroDukTech?a=1WLB3JKcOV4:y-6MwTnjqWA:qj6IDK7rITs&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/DmytroDukTech/~4/1WLB3JKcOV4&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</description>            <guid>https://dmytroduk.com/techblog/segments-in-profile-store-and-insight</guid>            <pubDate>Tue, 16 Oct 2018 13:47:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>User interface improvements in EPiServer Find 9.5</title>            <link>http://dmytroduk.com/techblog/user-interface-improvements-in-episerver-find-9-5</link>            <description>&lt;p&gt;EPiServer Find 9.5 brings the number of &lt;a href=&quot;/link/76974ad8d2a84c1b989ad0ac453ab663.aspx?versionFilter=9.5.0.2999&amp;amp;packageFilter=EPiServer.Find&amp;amp;typeFilter=All&amp;amp;packageGroup=Find&quot;&gt;bug fixes and new things&lt;/a&gt;. This blog post describes what is new in Find UI.&lt;/p&gt;
&lt;h2&gt;User interface improvements&lt;/h2&gt;
&lt;p&gt;The goal was to get rid of multiple scrollbars in Find UI and provide better user experience. In updated UI certain UI elements like grid headers, buttons and sidebars stick to the top or to the bottom of the current view when user is scrolling.&lt;/p&gt;
&lt;p&gt;The following screenshots show what has been changed in Find 9.5 UI. Click to see the whole picture.&lt;/p&gt;
&lt;h3&gt;Statistics / Most frequent searches&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/1.%20Statistics_2.png&quot;&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;&quot; border=&quot;0&quot; alt=&quot;Statistics - Most frequent searches&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/1.%20Statistics_thumb.png&quot; width=&quot;644&quot; height=&quot;324&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Statistics / Searches without hits, Searches without relevant hits&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/2.%20Statistics_2.png&quot;&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;&quot; border=&quot;0&quot; alt=&quot;Statistics - Searches without hits, Searches without relevant hits&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/2.%20Statistics_thumb.png&quot; width=&quot;644&quot; height=&quot;324&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Optimization / Best Bets, Related Queries, Synonyms, Autocomplete&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/3.%20Autocomplete_2.png&quot;&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;&quot; border=&quot;0&quot; alt=&quot;Optimization - Best Bets, Related Queries, Synonyms, Autocomplete&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/3.%20Autocomplete_thumb.png&quot; width=&quot;644&quot; height=&quot;324&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/4.%20Overview_2.png&quot;&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;&quot; border=&quot;0&quot; alt=&quot;Overview&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/4.%20Overview_thumb.png&quot; width=&quot;644&quot; height=&quot;324&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Explore&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/5.%20Explore_2.png&quot;&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;&quot; border=&quot;0&quot; alt=&quot;Explore&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/User-interface-improvements-in-EPiServ.5_B616/5.%20Explore_thumb.png&quot; width=&quot;644&quot; height=&quot;324&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Let us know how it feels!&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/user-interface-improvements-in-episerver-find-9-5</guid>            <pubDate>Thu, 30 Jul 2015 13:11:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Disqus for EPiServer 8</title>            <link>http://dmytroduk.com/techblog/disqus-for-episerver-8</link>            <description>&lt;p&gt;Disqus for EPiServer 8 is available.&lt;/p&gt;
&lt;h2&gt;What&#39;s new&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Disqus comments 1.2.0 add-ons are compatible with &lt;a href=&quot;/link/47427e695841460ab6787e0c67f22742.aspx&quot;&gt;EPiServer CMS 8&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Packages can be &lt;a href=&quot;/link/27219dba83654f7d8201b4efa62d575b.aspx&quot;&gt;installed from Visual Studio&lt;/a&gt;. Also add-ons are available in the Add-on Store (Third Party section).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;System requirements&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/link/47427e695841460ab6787e0c67f22742.aspx&quot;&gt;EPiServer CMS 8&lt;/a&gt; and later version.&lt;/p&gt;
&lt;p&gt;MVC and WebForms sites are supported.&lt;/p&gt;
&lt;h2&gt;Installing add-ons from Visual Studio&lt;/h2&gt;
&lt;p&gt;Starting from this version, Disqus for EPiServer packages can be installed from Visual Studio.&lt;/p&gt;
&lt;p&gt;Make sure &lt;a href=&quot;http://nuget.episerver.com/feed/packages.svc/&quot;&gt;http://nuget.episerver.com/feed/packages.svc/&lt;/a&gt; is added as a NuGet source and episerver.packaging@installationMode is set to Code in web.config. See details in developer guide.&lt;/p&gt;
&lt;p&gt;You can find packages by searching for &quot;disqus&quot;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Projects/disqus-for-episerver/NuGetPackages.png&quot;&gt;&lt;img alt=&quot;Disqus packages&quot; src=&quot;http://dmytroduk.com/Media/Default/Projects/disqus-for-episerver/NuGetPackages.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;Add-ons are installed under /modules site directory. Disqus comments configuration UI add-on is deployed under /modules/_protected sub-folder since it is protected add-on and should be accessed only by the authorized users within WebEditors or WebAdmins roles by default.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Folder structure&quot; src=&quot;http://dmytroduk.com/Media/Default/Projects/disqus-for-episerver/InstallingInVS.PNG&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Upgrading Disqus add-ons to version 1.2.0&lt;/h2&gt;
&lt;p&gt;First of all, &lt;a href=&quot;/link/d45ef7bdb9c747c383875cfd68d57552.aspx&quot;&gt;upgrade website to EPiServer 8&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Upgrading add-ons from Visual Studio&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Make sure installationMode is set to &lt;strong&gt;Code&lt;/strong&gt;: &amp;lt;episerver.packaging installationMode=&quot;Code&quot;&amp;gt;&lt;/li&gt;
&lt;li&gt;If the installationMode was set to UI you need to run the cmdlet &lt;strong&gt;Convert-EPiAddons&lt;/strong&gt; in the Package Manager Console, it will convert any existing add-ons installed via UI to Visual Studio format.&lt;/li&gt;
&lt;li&gt;Remove &lt;strong&gt;Duk.EPiServer.Disqus.*&lt;/strong&gt; assemblies in &lt;strong&gt;/bin&lt;/strong&gt; and &lt;strong&gt;/modulesbin&lt;/strong&gt; directories. Remove &lt;strong&gt;/modules/Duk.EPiServer.Disqus&lt;/strong&gt; and &lt;strong&gt;/modules/_protected/Duk.EPiServer.Disqus.UI &lt;/strong&gt;folders.&lt;/li&gt;
&lt;li&gt;Make sure &lt;a href=&quot;http://nuget.episerver.com/feed/packages.svc/&quot;&gt;http://nuget.episerver.com/feed/packages.svc/&lt;/a&gt; is added as a NuGet source in Visual Studio.&lt;/li&gt;
&lt;li&gt;Install Disqus comments 1.2.0 packages via Visual Studio. Overwrite all existing files in Disqus add-on folders if asked.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Upgrading add-ons from the user interface&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Make sure installationMode is set to &lt;strong&gt;UI&lt;/strong&gt;: &amp;lt;episerver.packaging installationMode=&quot;UI&quot;&amp;gt;&lt;/li&gt;
&lt;li&gt;To install add-on packages, the user needs to be a member of the &lt;strong&gt;PackagingAdmins&lt;/strong&gt; user group, and must have access to the EPiServer UI.&lt;/li&gt;
&lt;li&gt;Navigate to Add-ons in global navigation menu and update Disqus comments add-ons in Updates section.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;Please refer documentation on the &lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dmytroduk/Duk.EPiServer.Disqus&quot;&gt;Source code is available on GitHub&lt;/a&gt;. Feel free to report issues, ask questions and share any feedback.&lt;/p&gt;&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/disqus-for-episerver-8</guid>            <pubDate>Fri, 06 Mar 2015 00:24:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Customizing how statistics tracking scripts are loaded on pages when using EPiServer Find</title>            <link>http://dmytroduk.com/techblog/customizing-how-statistics-tracking-scripts-are-loaded-on-pages-when-using-episerver-find</link>            <description>&lt;p&gt;Find injects 2 scripts on site pages in order to track search statistics. By default these scripts are requested from EPiServer CDN. In certain scenarios developer may need to tweak how tracking scripts are added on pages.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/link/0ea5e629d3a34a4089f71abe0024d32a.aspx&quot;&gt;EPiServer Find 8.10.x.x&lt;/a&gt; or later version packages should be installed on website.&lt;/p&gt;
&lt;h2&gt;Loading Find tracking scripts on Intranet websites&lt;/h2&gt;
&lt;p&gt;Customers may use EPiServer Find on Internal websites where site visitors don&amp;rsquo;t have access to the Internet, so tracking scripts cannot be loaded from CDN.&lt;/p&gt;
&lt;p&gt;Possible solution can be hosting these tracking scripts in customer&amp;rsquo;s Intranet instead of loading scripts from CDN.&lt;/p&gt;
&lt;h3&gt;Hosting statistics tracking scripts in Intranet&lt;/h3&gt;
&lt;p&gt;Download the following scripts from EPiServer CDN. Version 8.10.0 is an example, grab scripts that correspond to EPiServer Find version installed on the website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;https://dl.episerver.net/8.10.0/epi-util/native.history.js&lt;/li&gt;
&lt;li&gt;https://dl.episerver.net/8.10.0/epi-util/find.js&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember to upgrade these scripts when upgrading EPiServer Find on website.&lt;/p&gt;
&lt;h3&gt;Overriding tracking script locations&lt;/h3&gt;
&lt;p&gt;Tell Find that scripts should be loaded form Intranet. Script locations can be overridden by defining &lt;a href=&quot;/link/53b3d526b7d64a4bb22f501b0837b52f.aspx#Client_resource_providers&quot;&gt;client resources&lt;/a&gt; with corresponding names:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;history.js script must be defined as &quot;&lt;strong&gt;browserstate.history&lt;/strong&gt;&quot;&lt;/li&gt;
&lt;li&gt;find.js script must be defined as &quot;&lt;strong&gt;epi.find.trackingScript&lt;/strong&gt;&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Specifying script URLs in module.config&lt;/h4&gt;
&lt;p&gt;The easiest way to define client resource is &lt;a href=&quot;/link/53b3d526b7d64a4bb22f501b0837b52f.aspx#Default_client_resource_provider_for_modules&quot;&gt;adding&lt;/a&gt; them in site &lt;a href=&quot;/link/5b5dc2ad61394b848503a77e114c38fd.aspx&quot;&gt;module.config&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;module&amp;gt;
    ...
    &amp;lt;clientResources&amp;gt;
        ...
        &amp;lt;add name=&quot;browserstate.history&quot; path=&quot;http://intranet/Scripts/native.history.js&quot; resourceType=&quot;Script&quot;/&amp;gt;
        &amp;lt;add name=&quot;epi.find.trackingScript&quot; path=&quot;http://intranet/Scripts/find.js&quot; resourceType=&quot;Script&quot;&amp;gt;
            &amp;lt;dependencies&amp;gt;
                &amp;lt;add name=&quot;browserstate.history&quot; /&amp;gt;
            &amp;lt;/dependencies&amp;gt;
        &amp;lt;/add&amp;gt;        
    &amp;lt;/clientResources&amp;gt;
    ...
&amp;lt;/module&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Script &lt;strong&gt;path&lt;/strong&gt; value can be the path on the site or full URL.&lt;/p&gt;
&lt;p&gt;Note that browserstate.history is defined as dependency for epi.find.trackingScript to ensure correct order of loading.&lt;/p&gt;
&lt;h4&gt;Implementing client resource provider in order to define script locations&lt;/h4&gt;
&lt;p&gt;Another way to define client resources is &lt;a href=&quot;/link/53b3d526b7d64a4bb22f501b0837b52f.aspx#Implementing_the_custom_client_resource_provider&quot;&gt;implementing client resource provider&lt;/a&gt;. This options can be useful if script URLs should be somehow resolved in code:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;[ClientResourceProvider]
public class ClientResourceProvider : IClientResourceProvider
{
    public IEnumerable&amp;lt;ClientResource&amp;gt; GetClientResources()
    {
        return new[] 
        {
            new ClientResource
            {
                Name = &quot;browserstate.history&quot;,
                Path = GetIntranetUrl() + &quot;native.history.js&quot;,
                ResourceType = ClientResourceType.Script
            },
            new ClientResource
            {
                Name = &quot;epi.find.trackingScript&quot;,
                Path = GetIntranetUrl() + &quot;find.js&quot;,
                ResourceType = ClientResourceType.Script,
                Dependencies = new List&amp;lt;string&amp;gt; { &quot;browserstate.history&quot; }
            }
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Loading Find tracking scripts when history.js is added in page templates&lt;/h2&gt;
&lt;p&gt;Another scenario could be running EPiServer Find on a website where &lt;a href=&quot;https://github.com/browserstate/history.js/&quot;&gt;history.js&lt;/a&gt; variation like jquery.history.js script is used in page templates. In this case injecting native.history.js script from EPiServer CDN gives error like &quot;History.js Adapter has already been loaded&quot;.&lt;/p&gt;
&lt;p&gt;In order to solve this issue, history.js script that is used on website can be defined as a &lt;a href=&quot;/link/53b3d526b7d64a4bb22f501b0837b52f.aspx&quot;&gt;client resource&lt;/a&gt; and Find will inject this script instead of requesting native.history.js on CDN.&lt;/p&gt;
&lt;h3&gt;Defining history.js client resource&lt;/h3&gt;
&lt;p&gt;history.js script must be defined as &quot;&lt;strong&gt;browserstate.history&lt;/strong&gt;&quot; client resource.&lt;/p&gt;
&lt;h4&gt;Specifying history.js URLs in module.config&lt;/h4&gt;
&lt;p&gt;Client resource can be defined in site &lt;a href=&quot;/link/fcf504a1c0ab4f0aa7a7fc0f8bb56ef1.aspx&quot;&gt;module.config&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;module&amp;gt;
    ...
    &amp;lt;clientResources&amp;gt;
        ...
        &amp;lt;add name=&quot;browserstate.history&quot; path=&quot;PathToMyScripts/jquery.history.js&quot; resourceType=&quot;Script&quot;/&amp;gt;
    &amp;lt;/clientResources&amp;gt;
    ...
&amp;lt;/module&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Where value is the &lt;strong&gt;path&lt;/strong&gt; or full URL of history.js that is used on the site.&lt;/p&gt;
&lt;h4&gt;Defining history.js path in client resource provider&lt;/h4&gt;
&lt;p&gt;Another option is defining browserstate.history script in a &lt;a href=&quot;/link/53b3d526b7d64a4bb22f501b0837b52f.aspx#Implementing_the_custom_client_resource_provider&quot;&gt;client resource provider&lt;/a&gt;. Make sure that script name is defined as &quot;&lt;strong&gt;browserstate.history&lt;/strong&gt;&quot;.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;[ClientResourceProvider]
public class ClientResourceProvider : IClientResourceProvider
{
    public IEnumerable&amp;lt;ClientResource&amp;gt; GetClientResources()
    {
        return new[] 
        {
            new ClientResource
            {
                Name = &quot;browserstate.history&quot;,
                Path = &quot;ClientResources/Scripts/jquery.history.js&quot;,
                ResourceType = ClientResourceType.Script
            }
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Again, this options can be useful if URL of history.js should be resolved in code.&lt;/p&gt;
&lt;h3&gt;What if you don&amp;rsquo;t want to load history.js using client resources framework&lt;/h3&gt;
&lt;p&gt;Probably there are some cases when loading history.js using client resources framework is not desirable. For example, history.js is bundled with other site scripts and you don&amp;rsquo;t want to load history.js separately. There is a workaround.&lt;/p&gt;
&lt;p&gt;Define fake &quot;&lt;strong&gt;browserstate.history&lt;/strong&gt;&quot; client resource with empty inline content:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;[ClientResourceProvider]
public class ClientResourceProvider : IClientResourceProvider
{
    public IEnumerable&amp;lt;ClientResource&amp;gt; GetClientResources()
    {
        return new[] 
        {
            new ClientResource
            {
                Name = &quot;browserstate.history&quot;,
                InlineContent = &quot;&quot;,
                ResourceType = ClientResourceType.Script
            }
        };
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now add your own history.js on pages as you want, but make sure that it is loaded before find.js script (by default required scripts, including find.js, are rendered in the bottom of the page, using something like @Html.RequiredClientResources(&quot;Footer&quot;)).&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/customizing-how-statistics-tracking-scripts-are-loaded-on-pages-when-using-episerver-find</guid>            <pubDate>Wed, 11 Feb 2015 20:23:16 GMT</pubDate>           <category>Blog post</category></item><item> <title>Disqus for EPiServer 7.5+</title>            <link>http://dmytroduk.com/techblog/disqus-for-episerver-7-5</link>            <description>&lt;p&gt;Disqus for EPiServer 1.1 is available in the official EPiServer Add-on Store.&lt;/p&gt;
&lt;p&gt;This add-on enables &lt;a href=&quot;https://disqus.com/websites/&quot;&gt;Disqus comments&lt;/a&gt; on web sites based on EPiServer CMS 7.5 and later versions.&lt;/p&gt;
&lt;p&gt;Go to Third-Party Add-ons section on your site, &lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver/installing-disqus-add-ons&quot;&gt;install&lt;/a&gt; Disqus add-ons, &lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver/configuration&quot;&gt;set&lt;/a&gt; your shortname and start &lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver/adding-disqus-comments-on-pages&quot;&gt;adding&lt;/a&gt; comments on your site pages!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer-1.1_FADD/DisqusComments_2.png&quot;&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;&quot; border=&quot;0&quot; alt=&quot;Disqus Comments&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer-1.1_FADD/DisqusComments_thumb.png&quot; width=&quot;300&quot; height=&quot;381&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer-1.1_FADD/DisqusCommentsSettings_2.png&quot;&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;&quot; border=&quot;0&quot; alt=&quot;Disqus Comments Settings&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer-1.1_FADD/DisqusCommentsSettings_thumb.png&quot; width=&quot;300&quot; height=&quot;375&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This release is just a rebuild for current EPiServer platform, it includes number of minor fixes for Edit and Preview modes and doesn&amp;rsquo;t contain new features.&lt;/p&gt;
&lt;h2&gt;System requirements&lt;/h2&gt;
&lt;p&gt;EPiServer CMS 7.5 and later versions. Technically add-on is rebuild with EPiServer packages &lt;a href=&quot;http://nuget.episerver.com/en/OtherPages/Package/?packageId=EPiServer.CMS.Core&amp;amp;packageVersion=7.6.2&quot;&gt;7.6.2&lt;/a&gt; and smoke tested with EPiServer &lt;a href=&quot;http://nuget.episerver.com/en/OtherPages/Package/?packageId=EPiServer.CMS.Core&amp;amp;packageVersion=7.5.394.2&quot;&gt;7.5.394.2&lt;/a&gt; (first released 7.5 version) and EPiServer &lt;a href=&quot;/link/9bf4467c4d2b4963b3bf9f9d6550ab30.aspx&quot;&gt;7.19.1&lt;/a&gt; (latest update available on December 23 2014).&lt;/p&gt;
&lt;p&gt;MVC and WebForms sites are supported.&lt;/p&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;Please refer documentation on the &lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Source code is &lt;a href=&quot;https://github.com/dmytroduk/Duk.EPiServer.Disqus/&quot;&gt;available on GitHub&lt;/a&gt;. Feel free to report issues, ask questions and share any feedback.&lt;/p&gt;
&lt;h2&gt;What&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;The plan is to release new version that will provide a better support of EPiServer Commerce and make it possible to install Disqus add-on &lt;a href=&quot;/link/27219dba83654f7d8201b4efa62d575b.aspx&quot;&gt;as a NuGet package&lt;/a&gt; in Visual Studio. Hopefully in Q1, definitely in 2015. Stay tuned.&lt;/p&gt;
&lt;p&gt;Happy Holidays!&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/disqus-for-episerver-7-5</guid>            <pubDate>Tue, 23 Dec 2014 18:33:03 GMT</pubDate>           <category>Blog post</category></item><item> <title>Statistics tracking in EPiServer Find</title>            <link>http://dmytroduk.com/techblog/statistics-tracking-in-episerver-find</link>            <description>&lt;p&gt;This blog post provides brief overview of statistics available in &lt;a href=&quot;http://find.episerver.com/&quot;&gt;EPiServer Find&lt;/a&gt; and describes how the statistics tracking can be enabled on a website.&lt;/p&gt; &lt;h3&gt;Statistics and optimization&lt;/h3&gt; &lt;p&gt;Knowledge is power. With EPiServer Find you can track and analyze search activities on your website in order to optimize search results and website content. Statistics views provide the following information:&lt;/p&gt; &lt;table cellspacing=&quot;15&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; border=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;257&quot;&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/881beee05fab_D3E5/MostFrequentSearches_4.png&quot;&gt;&lt;img title=&quot;&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;Most frequent searches&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/881beee05fab_D3E5/MostFrequentSearches_thumb_1.png&quot; width=&quot;244&quot; height=&quot;181&quot; /&gt;&lt;/a&gt;&lt;/td&gt; &lt;td style=&quot;vertical-align: top; align: left&quot; valign=&quot;top&quot; width=&quot;345&quot;&gt; &lt;p&gt;&lt;strong&gt;Most frequent searches&lt;/strong&gt;&lt;/p&gt;Most frequent searches shows what people are searching on your website the most.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;258&quot;&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/881beee05fab_D3E5/SearchesWithoutHits_2.png&quot;&gt;&lt;img title=&quot;&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;Searches without hits&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/881beee05fab_D3E5/SearchesWithoutHits_thumb.png&quot; width=&quot;244&quot; height=&quot;181&quot; /&gt;&lt;/a&gt;&lt;/td&gt; &lt;td style=&quot;vertical-align: top; align: left&quot; valign=&quot;top&quot; width=&quot;344&quot;&gt; &lt;p&gt;&lt;strong&gt;Searches without hits&lt;/strong&gt;&lt;/p&gt;This is the list of most popular searches that did not result in any hit. Most probably, you want this section to be empty.&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;259&quot;&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/881beee05fab_D3E5/SearchesWithoutRelevantHits_2.png&quot;&gt;&lt;img title=&quot;&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;Searches without relevant hits&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/881beee05fab_D3E5/SearchesWithoutRelevantHits_thumb.png&quot; width=&quot;244&quot; height=&quot;181&quot; /&gt;&lt;/a&gt;&lt;/td&gt; &lt;td style=&quot;vertical-align: top; align: left&quot; valign=&quot;top&quot; width=&quot;343&quot;&gt; &lt;p&gt;&lt;strong&gt;Searches without relevant hits&lt;/strong&gt;&lt;/p&gt;This is &lt;a title=&quot;Read &amp;quot;New EPiServer Find&amp;quot; article on EPiServer World&quot; href=&quot;http://world.episerver.com/Articles/Items/New-EPiServer-Find/&quot;&gt;new feature&lt;/a&gt;. Here you can see more behavioral information: search phrases that had some hits, but these results were not clicked by users, which probably means that these hits were not so relevant for visitors.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;All statistics views display up to 100 top search phrases.&lt;/p&gt; &lt;p&gt;Using statistics you can start optimizing search experience. Depending on specific case, you can combine the following techniques:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Create best bets to promote certain content and make sure that it is on top of results  &lt;li&gt;Suggest phrases that can be related to current user search, kind of did-you-mean hints  &lt;li&gt;Define synonyms for related phrases in order to provide more relevant hits  &lt;li&gt;Optimize your content and structure to make sure that you have what they need and it’s easy to find  &lt;li&gt;&lt;span style=&quot;text-decoration: line-through&quot;&gt;Blame users who searches for &#39; kammy koopa&#39; and &#39;boom boom&#39; on your corporate website.&lt;/span&gt; No, you cannot do anything with these guys. At least using Find. So far. &lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Please see &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Manuals/EPiServer-Find/User-guide---EPiServer-Find/&quot;&gt;user guide&lt;/a&gt; for more information about statistics and optimization in new EPiServer Find.&lt;/p&gt; &lt;h3&gt;Enabling statistics tracking&lt;/h3&gt; &lt;p&gt;Just add &lt;code&gt;Track()&lt;/code&gt; method in a query chain:&lt;/p&gt;&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;var hits = searchClient.UnifiedSearchFor(&quot;unicorn&quot;)
        .Track() // track them all!
        .GetResult();
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Rendering search hits&lt;/h3&gt;
&lt;p&gt;When tracking is enabled, search hit URLs contain additional parameters like search query, site and language, client IP address and hit position.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/881beee05fab_D3E5/SearchHitUrl_2.png&quot;&gt;&lt;img title=&quot;&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;Search hit URL with additional parameters&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/881beee05fab_D3E5/SearchHitUrl_thumb.png&quot; width=&quot;640&quot; height=&quot;211&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Output hit URLs as is when rendering search results:&lt;/p&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;@hit.Url&quot;&amp;gt;@Html.Raw(@hit.Title)&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When user clicks on search result, parameters are extracted from hit URL, stored in a cookie and browser navigates to the clean hit URL. It works also for search hits of external content indexed by crawler, while user just (left-)clicks or taps external hit link on a search page.&lt;/p&gt;
&lt;p&gt;Information about the click is reported to the backend as soon as CMS page is loaded next time. For CMS content, the “next time” is immediately when clicked page is opened.&lt;/p&gt;
&lt;p&gt;Statistics is also collected when the link to CMS content is opened in a new tab by Ctrl+click or using right-click menu or when the hit URL is being copied (sent to other user, maybe) and opened in a new browser window, except of links to external resources.&lt;/p&gt;
&lt;p&gt;To make it happen, Find &lt;a title=&quot;Read more about managing client resources in EPiServer CMS&quot; href=&quot;http://world.episerver.com/Documentation/Items/Developers-Guide/EPiServer-Framework/75/Client-resources/Client-resources/#Requiring_client_resources&quot;&gt;injects JavaScript resources on pages&lt;/a&gt;. Your templates should meet the &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Developers-Guide/EPiServer-CMS/75/Client-resources/Client-resources/#Requirements&quot;&gt;standard requirements for EPiServer CMS page templates&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Client resource registers must be executed before rendering the page. The easiest way is to inherit one of the base page classes. 
&lt;li&gt;Page templates must render required client resources for the &lt;code&gt;Header&lt;/code&gt; and &lt;code&gt;Footer&lt;/code&gt; default areas. Use &lt;code&gt;RequiredClientResources&lt;/code&gt; control for Web Forms or &lt;code&gt;RequiredClientResources&lt;/code&gt; MVC helper: &lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Rendering required client resources in the page header in Web Forms:&lt;/p&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;head&amp;gt;
    ...
    &amp;lt;EPiServer:RequiredClientResources RenderingArea=&quot;Header&quot; 
        ID=&quot;RequiredResourcesHeader&quot; runat=&quot;server&quot; /&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rendering required client resources in the page footer in MVC:&lt;/p&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
    ...
    &amp;lt;%= Html.RequiredClientResources(RenderingTags.Footer)%&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;When tracking is not needed&lt;/h3&gt;
&lt;p&gt;Sometimes you may not want to track search statistics or you need monitor search activity conditionally. Maybe you don’t want to track statistics when executing searches in order to list content by certain criteria, like listing of latest news or specific products.&lt;/p&gt;
&lt;p&gt;Just don’t use &lt;code&gt;Track()&lt;/code&gt; method if you don’t need to track.&lt;/p&gt;
&lt;p&gt;Tracking script is not injected on pages and statistics is not collected if &lt;a title=&quot;Read more about DNT&quot; href=&quot;http://en.wikipedia.org/wiki/Do_Not_Track&quot;&gt;Do Not Track&lt;/a&gt; header is detected.&lt;/p&gt;
&lt;h3&gt;Use it&lt;/h3&gt;
&lt;p&gt;Use statistics and optimize, make sure your visitors get what they are looking for!&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/statistics-tracking-in-episerver-find</guid>            <pubDate>Mon, 09 Jun 2014 16:04:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Disqus for EPiServer</title>            <link>http://dmytroduk.com/techblog/disqus-for-episerver</link>            <description>&lt;p&gt;Let me introduce &lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver&quot;&gt;Disqus for EPiServer&lt;/a&gt;, a &lt;a href=&quot;http://disqus.com/for-websites/&quot;&gt;Disqus comments&lt;/a&gt; integration for EPiServer-based websites. The module consists of two add-ons which enable discussions on pages and provide user interface for configuration.&lt;/p&gt; &lt;p&gt;Now Disqus for EPiServer add-ons are available in the Third-Party Add-ons section in the official EPiServer Add-on Store.&lt;/p&gt; &lt;h2&gt;Enabling Disqus comments&lt;/h2&gt; &lt;p&gt;There are several ways to display Disqus comments on pages:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver/adding-disqus-comments-on-pages#SharedBlock&quot;&gt;Adding comments as a shared block&lt;/a&gt; (target user: editor)  &lt;li&gt;&lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver/adding-disqus-comments-on-pages#DynamicContent&quot;&gt;Adding comments as a dynamic content&lt;/a&gt; (target user: editor)  &lt;li&gt;&lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver/adding-disqus-comments-on-pages#RenderingAreas&quot;&gt;Displaying discussions in the rendering areas defined in the templates&lt;/a&gt; (target user: developer)  &lt;li&gt;&lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver/adding-disqus-comments-on-pages#BlockProperty&quot;&gt;Rendering comments block as a content property&lt;/a&gt; (target user: geeky developer)&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer_63DF/DropBlockOnPage_2.png&quot;&gt;&lt;img title=&quot;&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;Dropping Disqus comments block on a page&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer_63DF/DropBlockOnPage_thumb.png&quot; width=&quot;320&quot; height=&quot;268&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer_63DF/DisqusComments_2.png&quot;&gt;&lt;img title=&quot;&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;Disqus comments on a page&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer_63DF/DisqusComments_thumb.png&quot; width=&quot;228&quot; height=&quot;290&quot; /&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;Configuration UI and Edit mode extensions&lt;/h2&gt; &lt;p&gt;Configuration user interface allows to edit Disqus settings for the current website and provides quick links to moderation tools in Disqus Admin.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer_63DF/DisqusCommentsSettings_2.png&quot;&gt;&lt;img title=&quot;&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;Disqus comments settings&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer_63DF/DisqusCommentsSettings_thumb.png&quot; width=&quot;280&quot; height=&quot;350&quot; /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer_63DF/IssueIndication_2.png&quot;&gt;&lt;img title=&quot;&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;Issue indication&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Disqus-for-EPiServer_63DF/IssueIndication_thumb.png&quot; width=&quot;280&quot; height=&quot;343&quot; /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Edit UI extensions help to work with Disqus blocks when editing a content. Warnings are displayed when Disqus configuration is not complete or there are problematic blocks on the current page. These indicators are not rendered in view mode.&lt;/p&gt; &lt;h2&gt;Basic installation scenario&lt;/h2&gt; &lt;ol&gt; &lt;li&gt;Signup on Disqus and choose a shortname for the site  &lt;li&gt;Install Disqus for EPiServer add-ons  &lt;li&gt;Set shortname and enable discussions on website using Disqus configuration UI.  &lt;li&gt;Start adding Disqus comments on pages.&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;System requirements&lt;/h2&gt; &lt;p&gt;EPiServer 7.x.x CMS, Add-on system (EPiServer.Packaging). EPiServer UI Platform (Shell) is required to install configuration UI and Edit mode extensions.&lt;/p&gt; &lt;p&gt;MVC and WebForms sites are supported. &lt;a href=&quot;http://world.episerver.com/Articles/Items/EPiServer-7---Patch-3/&quot;&gt;EPiServer 7 Patch 3&lt;/a&gt; is required on MVC sites.&lt;/p&gt; &lt;h2&gt;More information&lt;/h2&gt; &lt;p&gt;Please refer documentation on the &lt;a href=&quot;http://dmytroduk.com/projects/disqus-for-episerver&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Source code and feedback&lt;/h2&gt; &lt;p&gt;Source code is &lt;a href=&quot;https://github.com/dmytroduk/Duk.EPiServer.Disqus&quot;&gt;available on GitHub&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Feel free to report bugs, ask questions and request features &lt;a href=&quot;https://github.com/dmytroduk/Duk.EPiServer.Disqus/issues&quot;&gt;on GitHub&lt;/a&gt; or here in comments. Your feedback is highly appreciated.&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/disqus-for-episerver</guid>            <pubDate>Tue, 18 Jun 2013 10:59:06 GMT</pubDate>           <category>Blog post</category></item><item> <title>Dependencies and versioning for EPiServer add-ons</title>            <link>http://dmytroduk.com/techblog/dependencies-and-versioning-for-episerver-add-ons</link>            <description>&lt;p&gt;One of the most challenging problems that the Add-on system should solve is handling a lot of dependencies between different products.&lt;/p&gt;
&lt;p&gt;Site owners want to be sure that installed add-ons are compatible with the current environment. Add-on authors (developers, partners and EPiServer) want to release new product versions and make the upgrade easy for customers.&lt;/p&gt;
&lt;p&gt;This blog post describes how the EPiServer Add-on system handles dependencies and prerequisites and provides general rules and recommendations to consider when defining dependencies and versions for add-ons.&lt;/p&gt;
&lt;h2&gt;Problem: Dependency hell&lt;/h2&gt;
&lt;p&gt;The following quote is a great description of the problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In systems with many dependencies, releasing new package versions can quickly become a nightmare. If the dependency specifications are too tight, you are in danger of version lock (the inability to upgrade a package without having to release new versions of every dependent package). If dependencies are specified too loosely, you will inevitably be bitten by version promiscuity (assuming compatibility with more future versions than is reasonable). Dependency hell is where you are when version lock and/or version promiscuity prevent you from easily and safely moving your project forward.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;http://semver.org&quot;&gt;http://semver.org&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Solution: Semantic versioning&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://semver.org&quot;&gt;Semantic versioning&lt;/a&gt; is a set of rules to follow when defining version numbers for your component (public API, package, plugin, module, add-on, etc). It was suggested by &lt;a href=&quot;http://tom.preston-werner.com&quot;&gt;Tom Preston-Werner&lt;/a&gt;. Please have a look at &lt;a href=&quot;http://semver.org&quot;&gt;official SemVer website&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;The general idea is that a version has three parts, &lt;strong&gt;Major.Minor.Patch&lt;/strong&gt;, and each part indicates backward compatibility:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Major&lt;/strong&gt;: breaking changes. Increasing Major part means that this version has breaking changes and it is not backwards compatible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minor&lt;/strong&gt;: new features. Increasing Minor part means that this versions contains new functionality but it is still backwards compatible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patch&lt;/strong&gt;: bug fixes. Increasing this Patch part means that this version contains bug fixes and is backwards compatible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A suffix appended to the Patch part and separated by dash symbol indicates prerelease version. Prerelease versions are sorted alphabetically and are always lower than release version with the same Major.Minor.Patch numbers.&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;p&gt;Module 2.0.0 introduces breaking changes and is not compatible with Module 1.7.0.&lt;/p&gt;
&lt;p&gt;Module 1.7.0 is backwards compatible with Module 1.1.3, meaning that other component which depends on Module 1.1.3 should work fine with newer version 1.7.0.&lt;/p&gt;
&lt;p&gt;There is no functional differences between Module 1.1.3 and Module 1.1.0 and these components are compatible, however 1.1.3 fixes some bugs.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;&quot; border=&quot;0&quot; alt=&quot;Semantic versioning&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Dependencies-and-Versioning-for-EPiServe_10764/SemVerEvolution_3.png&quot; width=&quot;618&quot; height=&quot;196&quot; /&gt;&lt;/p&gt;
&lt;p&gt;NuGet supports package versioning according to the Semantic Versioning specification. In general the Add-on system follows NuGet guidelines and patterns.&lt;/p&gt;
&lt;h2&gt;Defining the add-on version&lt;/h2&gt;
&lt;h3&gt;Recommendations when defining the add-on version&lt;/h3&gt;
&lt;h4&gt;DO:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Use semantic versioning conventions when defining the version. Make sure that the Major part is increased if the new version introduces breaking changes. Increase the Minor part if the new add-on version brings new functionality but possible dependents should still work fine with it. Increase only the Patch part when the new version contains minor improvements and bug fixes.&lt;/li&gt;
&lt;li&gt;Use a combination of &lt;code&gt;AssemblyInformationalVersionAttribute&lt;/code&gt; and &lt;code&gt;AssemblyVersionAttribute&lt;/code&gt; when creating an add-on package from a project.&lt;/li&gt;
&lt;li&gt;Increase the Major version number when your add-on is rebuilt and it introduces breaking changes, even if it does not provide any new functionality or bug fixes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;DO NOT:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Avoid increasing the Major version number just because it sounds great or because sales guys ask you.&lt;/li&gt;
&lt;li&gt;Do not increase the Major version number depending on your dependency versions. New (Major) version of your add-on should reflect (breaking) changes in your add-on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The add-on version can be defined in package / metadata / version node in &lt;a href=&quot;http://docs.nuget.org/docs/reference/nuspec-reference&quot;&gt;.nuspec file&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;package xmlns=&quot;http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd&quot;&amp;gt;
  &amp;lt;metadata&amp;gt;
    &amp;lt;id&amp;gt;Alloy.Sample&amp;lt;/id&amp;gt;
    &amp;lt;version&amp;gt;1.2.3&amp;lt;/version&amp;gt;
    &amp;lt;authors&amp;gt;Alloy&amp;lt;/authors&amp;gt;
    &amp;lt;description&amp;gt;Sample add-on.&amp;lt;/description&amp;gt;
  &amp;lt;/metadata&amp;gt;
&amp;lt;/package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can use special placeholders in .nuspec file if &lt;a href=&quot;http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#From_a_project&quot;&gt;package is created from a project&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;package xmlns=&quot;http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd&quot;&amp;gt;
  &amp;lt;metadata&amp;gt;
    &amp;lt;id&amp;gt;$id$&amp;lt;/id&amp;gt;
    &amp;lt;version&amp;gt;$version$&amp;lt;/version&amp;gt;
    &amp;lt;authors&amp;gt;$author$&amp;lt;/authors&amp;gt;
    &amp;lt;description&amp;gt;$description$&amp;lt;/description&amp;gt;
  &amp;lt;/metadata&amp;gt;
&amp;lt;/package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case add-on version should be set using &lt;code&gt;AssemblyInformationalVersionAttribute&lt;/code&gt; or &lt;code&gt;AssemblyVersionAttribute&lt;/code&gt;, usually in AssemblyInfo.cs file:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;[assembly: AssemblyVersion(&quot;1.2.3.0&quot;)]
[assembly: AssemblyInformationalVersion(&quot;1.2.3&quot;)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using &lt;code&gt;AssemblyInformationalVersionAttribute&lt;/code&gt; allows to set semantic version in form of Major.Minor.Patch, in example above &quot;1.2.3&quot;. These 3 numbers will be set in the .nuspec file and used in the package file name: Alloy.Sample.1.2.3.nupkg.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;AssemblyVersionAttribute&lt;/code&gt; value is used as an add-on version if &lt;code&gt;AssemblyInformationalVersionAttribute&lt;/code&gt; is not found. Please note that in this case you will get 4 numbers in the version and file name (Alloy.Sample.1.2.3.0.nupkg), even if you specify 3 numbers in the attribute value. I would recommend using 0 as the fourth number in the &lt;code&gt;AssemblyVersionAttribute&lt;/code&gt; value as in example above since it does not fit the SemVer pattern. You can use &lt;code&gt;AssemblyFileVersionAttribute&lt;/code&gt; if you distinguish different revisions as file versions.&lt;/p&gt;
&lt;h3&gt;Defining prerelease add-on version&lt;/h3&gt;
&lt;p&gt;Prerelease add-on versions can be defined directly in the .nuspec file or using the &lt;code&gt;AssemblyInformationalVersionAttribute&lt;/code&gt; when the package is created from a project:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;[assembly: AssemblyInformationalVersion(&quot;1.2.3-beta&quot;)]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Enabling prerelease versions in Add-On Store&lt;/h3&gt;
&lt;p&gt;By default prerelease add-on versions cannot be installed and they are not visible in Add-On Store. Set the &lt;code&gt;allowPrereleaseVersions&lt;/code&gt; attribute of &lt;code&gt;episerver.packaging&lt;/code&gt; element to &lt;code&gt;&quot;true&quot;&lt;/code&gt; to enable installing prerelease package versions on the site:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;
  &amp;lt;!-- ... ommited configuration ...--&amp;gt;
  &amp;lt;episerver.packaging allowPrereleaseVersions=&quot;true&quot; ... &amp;gt;
    &amp;lt;packageRepositories&amp;gt; ... &amp;lt;/packageRepositories&amp;gt;
  &amp;lt;/episerver.packaging&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Defining the add-on dependencies&lt;/h2&gt;
&lt;p&gt;An add-on has a dependency when it relies on some other module or component that needs to be deployed or installed on the website.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;&quot; border=&quot;0&quot; alt=&quot;Dependencies&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Dependencies-and-Versioning-for-EPiServe_10764/Dependencies_3.png&quot; width=&quot;640&quot; height=&quot;335&quot; /&gt;&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;span color=&quot;#a5a5a5&quot; size=&quot;1&quot; style=&quot;color: #a5a5a5; font-size: xx-small;&quot;&gt;&lt;sub&gt;&lt;span color=&quot;#a5a5a5&quot; size=&quot;1&quot; style=&quot;color: #a5a5a5; font-size: xx-small;&quot;&gt;Photo: http://www.caryballetconservatory.com&lt;/span&gt;&lt;/sub&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Before installing any add-on the system tries to find all dependencies and dependents and check if all components are compatible.&lt;/p&gt;
&lt;p&gt;Given that component functionality usually differs from version to version and that new major versions usually contain breaking changes, information about dependency usually contains the component identifier and the lowest compatible version number or a version range.&lt;/p&gt;
&lt;p&gt;Add-on dependencies should be defined in the .nuspec file as described in the &lt;a href=&quot;http://docs.nuget.org/docs/reference/nuspec-reference#Specifying_Dependencies&quot;&gt;NuGet documentation&lt;/a&gt;. The NuGet &lt;a href=&quot;http://docs.nuget.org/docs/reference/Versioning&quot;&gt;Versioning article&lt;/a&gt; describes the general idea of specifying dependency version ranges.&lt;/p&gt;
&lt;p&gt;Try to minimize the number of dependencies and avoid dependencies on third-party components.&lt;/p&gt;
&lt;p&gt;The main guideline when defining add-on dependencies is to always set the lowest compatible dependency version. In addition you may want to define version range to set the maximum compatible version if your add-on functionality likely won&amp;rsquo;t be compatible with next major version of the dependency.&lt;/p&gt;
&lt;h3&gt;Dependencies on other add-ons&lt;/h3&gt;
&lt;p&gt;An add-on may rely on another add-on. When this add-on is being installed to the website, its dependency is installed automatically if possible.&lt;/p&gt;
&lt;p&gt;For example: add-on A depends on add-on B. Add-on B relies on add-on C. When the user installs add-on A, the system will also install add-ons B and C.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;&quot; style=&quot;background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; margin-right: auto; border-width: 0px;&quot; border=&quot;0&quot; alt=&quot;A - B - C dependencies&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Dependencies-and-Versioning-for-EPiServe_10764/AbcDependencies_5.png&quot; width=&quot;314&quot; height=&quot;167&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Use the package ID of dependency add-on as the dependency identifier and specify the lowest compatible version or version range.&lt;/p&gt;
&lt;p&gt;Example: you have developed a component to extend the Edit UI in and work with EPiServer Commerce data. The component uses some new features released in Edit UI 2.0 and is not compatible with the first version. The Edit UI is also an add-on and its package ID is &amp;ldquo;CMS&amp;rdquo; (I agree, not the ideal name for this package. We use this ID for backwards compatibility because in EPiServer 6 we had a protected Shell module &quot;CMS&quot;).&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;package xmlns=&quot;http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd&quot;&amp;gt;
  &amp;lt;metadata&amp;gt;
    ...  
    &amp;lt;dependencies&amp;gt;
      &amp;lt;dependency id=&quot;CMS&quot; version=&quot;2.0&quot; /&amp;gt;
    &amp;lt;/dependencies&amp;gt;
  &amp;lt;/metadata&amp;gt;
&amp;lt;/package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Prerequisites are used to define required products and ensure platform compatibility.&lt;/p&gt;
&lt;p&gt;A prerequisite is a dependency that is not available as an add-on and cannot be installed by the Add-on system. Prerequisites should be deployed on the website before installing the dependent add-on.&lt;/p&gt;
&lt;p&gt;All assemblies loaded in the application domain are listed as virtual packages. It allows you to define prerequisites in the same way as dependencies on other add-ons. You just add a package dependency in .nuspec file and use the assembly name (without extension) as the dependency identifier and specify the assembly version or version range.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s define EPiServer 7 Commerce as a prerequisite for the sample add-on described in the previous section. As the dependency identifier use the name of the &amp;ldquo;main&amp;rdquo; prerequisite product assembly. EPiServer.Business.Commerce assembly should be a good choice in this case. Set the lowest compatible Commerce version, for example 7.0. Use a version range to define the highest compatible version of EPiServer Commerce.&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;package xmlns=&quot;http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd&quot;&amp;gt;
  &amp;lt;metadata&amp;gt;
    ...  
    &amp;lt;dependencies&amp;gt;
      &amp;lt;dependency id=&quot;CMS&quot; version=&quot;2.0&quot; /&amp;gt;
      &amp;lt;dependency id=&quot;EPiServer.Business.Commerce&quot; version=&quot;[7.0,8.0)&quot; /&amp;gt;
    &amp;lt;/dependencies&amp;gt;
  &amp;lt;/metadata&amp;gt;
&amp;lt;/package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this example version range defines all EPiServer Commerce versions 7.x.x as compatible but excludes the next major release 8.0.0.&lt;/p&gt;
&lt;h3&gt;Dependencies on third-party components&lt;/h3&gt;
&lt;h4&gt;Implicit dependencies&lt;/h4&gt;
&lt;p&gt;An implicit dependency is a server-side or client-side component that is used by an add-on but which is not defined as a dependency in the add-on .nuspec file explicitly. You create implicit dependencies if you include third-party assemblies or JavaScript frameworks in your add-on package. You may face different kinds of problems if the same components are included in other add-ons. It is impossible to control and make sure that add-ons and components are compatible with each other and with the website environment.&lt;/p&gt;
&lt;p&gt;There are several ways to avoid this problem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get rid of the additional dependencies. Consider implementing that piece of functionality in your code when it is reasonable.&lt;/li&gt;
&lt;li&gt;Define a prerequisite when your dependency is a product or platform that should be preinstalled/deployed to the website.&lt;/li&gt;
&lt;li&gt;Consider creating a separate package for each third-party component to make it possible to install these components as an add-on. In this case other developers can reference these components and use them as dependencies for their add-ons. Contact EPiServer to discuss creating dependency packages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Never include third-party assemblies or client side frameworks in your add-on package.&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;Dependencies on third-party assemblies and other server-side resources&lt;/h4&gt;
&lt;p&gt;Several versions of the same assembly should not be loaded in the website AppDomain. That&#39;s why it is especially important to make sure that dependencies on third-party assemblies and versions can be handled properly.&lt;/p&gt;
&lt;p&gt;Google Analytics for EPiServer 7 and Social Reach add-ons use DotNetOpenAuth library for authentication. We don&#39;t include DotNetOpenAuth assemblies to these add-ons. DotNetOpenAuth assembly is included in a separate package that can be referenced as a dependency by any other add-on.&lt;/p&gt;
&lt;p&gt;There is no point in installing DotNetOpenAuth as a standalone add-on because this is a framework that is used by other products. You don&#39;t see these dependency add-ons in the Add-on Store, but you get DotNetOpenAuth installed as soon as you install Google Analytics or Social Reach add-ons on your website.&lt;/p&gt;
&lt;h4&gt;Dependencies on third-party JavaScript frameworks and other client resources&lt;/h4&gt;
&lt;p&gt;The same rules should work for client side components. It would be strange if several add-ons include jQuery framework or define other JavaScript library hosted on CDN as client resources in the module manifest. Including several versions of the same framework on pages may cause conflicts or unexpected behavior and results.&lt;/p&gt;
&lt;p&gt;Try to avoid including third-party client-side components and frameworks in your add-on. Consider implementing required functionality in your code. Otherwise consider creating dependency package for each third-party framework that can be used by other modules.&lt;/p&gt;
&lt;h4&gt;Creating dependency packages&lt;/h4&gt;
&lt;p&gt;A dependency package should contain only one third-party component. It can be created in the same way as usual add-on packages and it should follow the same rules for versioning. Dependency package can depend on other dependency packages.&lt;/p&gt;
&lt;p&gt;The following tags are required in the .nuspec file of the dependency package: EPiServerModulePackage, EPiServerDependency.&lt;/p&gt;
&lt;h3&gt;Recommendations when defining dependencies&lt;/h3&gt;
&lt;h4&gt;DO:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Always specify the lowest compatible dependency version. Consider setting the highest compatible version to avoid incompatibility with the next major version of the dependency.&lt;/li&gt;
&lt;li&gt;Use the add-on package ID when defining a dependency on that add-on.&lt;/li&gt;
&lt;li&gt;Use the corresponding assembly name when defining a prerequisite.&lt;/li&gt;
&lt;li&gt;Try to avoid extra dependencies when possible.&lt;/li&gt;
&lt;li&gt;Define any dependency on a third-party component as an add-on dependency or prerequisite.&lt;/li&gt;
&lt;li&gt;Create one dependency package for each third-party component.&lt;/li&gt;
&lt;li&gt;Contact EPiServer when you consider creating dependency add-on packages for a third-party component&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;DO NOT:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Do not include third-party components (server side or client side) in your add-on package.&lt;/li&gt;
&lt;li&gt;Do not use the assembly name as the dependency identifier when defining a dependency on another add-on. For example, use add-on ID &amp;ldquo;CMS&amp;rdquo; instead of assembly name &amp;ldquo;EPiServer.Cms.Shell.UI&amp;rdquo; when you define a dependency on the Edit UI.&lt;/li&gt;
&lt;li&gt;Do not list indirect dependencies. The .nuspec file of your add-on should state only direct dependencies on add-ons and components that are used in your add-on.&lt;/li&gt;
&lt;li&gt;Avoid circular dependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;We are trying to define best practices and our recommendations may evolve depending on our needs and experience. That&amp;rsquo;s why your feedback is (as always) highly appreciated. Let us know about your cases!&lt;/p&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://world.episerver.com/Documentation/Items/Developers-Guide/EPiServer-Framework/7/Add-Ons/Add-ons/&quot;&gt;EPiServer Framework SDK &amp;ndash; Add-ons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://docs.nuget.org/&quot;&gt;NuGet documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://semver.org/&quot;&gt;Semantic version&lt;/a&gt;&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/dependencies-and-versioning-for-episerver-add-ons</guid>            <pubDate>Thu, 28 Mar 2013 19:17:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Sharing Widget for EPiServer 7</title>            <link>http://dmytroduk.com/techblog/sharing-widget-for-episerver-7</link>            <description>&lt;p&gt;Sharing Widget add-on provides easy way to get &lt;a href=&quot;http://sharethis.com&quot;&gt;ShareThis&lt;/a&gt; buttons on EPiServer 7 site. Just create new block, specify your publisher ID and drop it on a page. Both Web Forms and MVC are supported.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/876af2e76ae9_C1BF/SharingWidgetOnPage_2.png&quot;&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/e40a42977e32_12CA8/SharingWidgetOnPage2_3.png&quot; alt=&quot;Sharing Widget on page&quot; width=&quot;640&quot; height=&quot;507&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please &lt;a href=&quot;https://github.com/dmytroduk/SharingWidgetAddOn/raw/master/EPiServer.Samples.SharingWidget.1.1.0.0.nupkg&quot;&gt;download Sharing Widget add-on package&lt;/a&gt; to install using Manual Upload option.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dmytroduk/SharingWidgetAddOn&quot;&gt;Source code is available&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;h3&gt;Feedback&lt;/h3&gt;
&lt;p&gt;Your feedback is highly appreciated. Please let me know if you are interested in further add-on development and which features you would like to see (selecting required buttons, size, other settings?). Don’t hesitate to &lt;a href=&quot;https://github.com/dmytroduk/SharingWidgetAddOn/issues&quot;&gt;report bugs and issues&lt;/a&gt; or leave a comment here.&lt;/p&gt;
&lt;h2&gt;Rebuilding the add-on for EPiServer 7&lt;/h2&gt;
&lt;p&gt;This module was developed as a &lt;a href=&quot;http://dmytroduk.com/techblog/developing-simple-add-on-for-episerver-7-preview&quot;&gt;sample add-on for EPiServer 7 Preview&lt;/a&gt;. Now it is time to rebuild it for RTM version. To keep it simple I decided not to introduce any new functionality and concentrate on what should be changed to make it work with EPiServer 7.&lt;/p&gt;
&lt;p&gt;Surprisingly, there was not so much to update. You can see most of changes in &lt;a href=&quot;https://github.com/dmytroduk/SharingWidgetAddOn/commit/354be52feee76b7316dc2aeb1311d730753df0f2&quot;&gt;this commit&lt;/a&gt;. Please see details about most important fixes below if you are interested.&lt;/p&gt;
&lt;h3&gt;Block controller&lt;/h3&gt;
&lt;p&gt;This is probably the only one required change: the name of block data parameter in Index method is changed from blockData to currentBlock, otherwise current block data is not passed in action method and you get NullReferenceException when rendering content in the view.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public class SharingWidgetBlockController : BlockController&amp;lt;SharingWidgetBlock&amp;gt;
{
    public override ActionResult Index(SharingWidgetBlock currentBlock)
    {
        // Hint for MVC to find the view in modules folder:
        return PartialView(Paths.ToResource(GetType(), &quot;Views/SharingWidget/SharingWidget.cshtml&quot;), currentBlock);
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That was not so obvious, huh?&lt;/p&gt;
&lt;h3&gt;Translation for content type and property names and descriptions&lt;/h3&gt;
&lt;p&gt;Embedded language file for English is added. Titles and descriptions for Sharing Widget block type and properties are defined in /language/blocktypes/blocktype and /language/pagetypes/common/property nodes.&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;
&amp;lt;languages&amp;gt;
  &amp;lt;language name=&quot;English&quot; id=&quot;en&quot;&amp;gt;
    &amp;lt;blocktypes&amp;gt;
      &amp;lt;!-- Blocks --&amp;gt;
      &amp;lt;blocktype name=&quot;SharingWidgetBlock&quot;&amp;gt;
        &amp;lt;name&amp;gt;Sharing Widget&amp;lt;/name&amp;gt;
        &amp;lt;description&amp;gt;Adds ShareThis widget on pages where block is placed.&amp;lt;/description&amp;gt;
      &amp;lt;/blocktype&amp;gt;
    &amp;lt;/blocktypes&amp;gt;
    &amp;lt;pagetypes&amp;gt;
      &amp;lt;common&amp;gt;
        &amp;lt;!-- Sharing block properties --&amp;gt;
        &amp;lt;property name=&quot;PublisherId&quot;&amp;gt;
          &amp;lt;caption&amp;gt;Publisher ID&amp;lt;/caption&amp;gt;
          &amp;lt;help&amp;gt;Register on ShareThis.com to get your Publisher ID. You can also use &quot;Get sharing tools&quot; wizard on ShareThis.com to generate button code and get publisher ID without registration.&amp;lt;/help&amp;gt;
        &amp;lt;/property&amp;gt;
      &amp;lt;/common&amp;gt;
    &amp;lt;/pagetypes&amp;gt;
  &amp;lt;/language&amp;gt;
&amp;lt;/languages&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It’s a bit strange to describe block properties in pagetypes structure; hopefully it will be fixed in one of the next platform updates.&lt;/p&gt;
&lt;h3&gt;Module manifest for add-on&lt;/h3&gt;
&lt;p&gt;Add-on assembly is explicitly specified in module.config file to avoid automatic discovering of available assemblies in add-on bin folder.&lt;/p&gt;
&lt;h3&gt;Restricting prerequisites version&lt;/h3&gt;
&lt;p&gt;Dependency on EPiServer assembly is specified in add-on nuspec file. For this version the prerequisite is more strict and it requires EPiServer platform from version 7.0 (including) up to 7.1 (excluding) to avoid any incompatibility with new platform releases.&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;package &amp;gt;
  &amp;lt;metadata&amp;gt;
    &amp;lt;id&amp;gt;$id$&amp;lt;/id&amp;gt;
    &amp;lt;title&amp;gt;Sharing Wigdet&amp;lt;/title&amp;gt;
    &amp;lt;version&amp;gt;$version$&amp;lt;/version&amp;gt;
    &amp;lt;authors&amp;gt;$author$&amp;lt;/authors&amp;gt;
    &amp;lt;owners&amp;gt;$author$&amp;lt;/owners&amp;gt;
    &amp;lt;projectUrl&amp;gt;https://github.com/dmytroduk/SharingWidgetAddOn&amp;lt;/projectUrl&amp;gt;
    &amp;lt;iconUrl&amp;gt;http://w.sharethis.com/images/sharethis_32.png&amp;lt;/iconUrl&amp;gt;
    &amp;lt;requireLicenseAcceptance&amp;gt;false&amp;lt;/requireLicenseAcceptance&amp;gt;
    &amp;lt;description&amp;gt;Enables site visitors to share the content in social networks and communities using ShareThis.com widget.&amp;lt;/description&amp;gt;
    &amp;lt;tags&amp;gt;EPiServerPublicModulePackage Social Sharing ShareThis&amp;lt;/tags&amp;gt;
    &amp;lt;dependencies&amp;gt;
      &amp;lt;dependency id=&quot;EPiServer&quot; version=&quot;[7.0,7.1)&quot; /&amp;gt;
    &amp;lt;/dependencies&amp;gt;
  &amp;lt;/metadata&amp;gt;
&amp;lt;/package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Creating add-on package after build&lt;/h3&gt;
&lt;p&gt;Project file contains after build target which creates new add-on package every time you rebuild the project.&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;Project ...&amp;gt;
&amp;lt;!-- ... Ommited project file content ... --&amp;gt;

  &amp;lt;Target Name=&quot;CreateAddOnPackage&quot;&amp;gt;
    &amp;lt;PropertyGroup&amp;gt;
      &amp;lt;NuGetExePath&amp;gt;..\Dependencies\NuGet.exe&amp;lt;/NuGetExePath&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;
    &amp;lt;Exec Command=&quot;&amp;amp;quot;$(NuGetExePath)&amp;amp;quot; pack $(ProjectFileName) -OutputDirectory $(OutDir)&quot; Condition=&quot;Exists(&#39;$(NuGetExePath)&#39;)&quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
  &amp;lt;!-- Creating add-on package after build. --&amp;gt;
  &amp;lt;Target Name=&quot;AfterBuild&quot;&amp;gt;
    &amp;lt;CallTarget Targets=&quot;CreateAddOnPackage&quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NuGet command line tool should be placed in Dependencies folder on solution root level.&lt;/p&gt;
&lt;h2&gt;Known issue with add-on block rendering on MVC site&lt;/h2&gt;
&lt;p&gt;There is a known issue with shared block rendering when the block is deployed as an add-on/module on EPiServer 7 MVC site. You will get similar error when viewing a block or page that contains add-on block in content area:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;Server Error in &#39;/TestMvc&#39; Application. 
--------------------------------------------------------------------------------
The controller for path &#39;/TestMvc/UIPath/CMS/en/,,183_207/&#39; was not found or does not implement IController.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Web.HttpException: The controller for path &#39;/TestMvc/UIPath/CMS/en/,,183_207/&#39; was not found or does not implement IController.

Source Error: 

Line 23:         public virtual void RenderAction(HtmlHelper helper, string action, string controller, object routeValues)
Line 24:         {
Line 25:             helper.RenderAction(action, controller, routeValues);
Line 26:         }
Line 27:     }

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As far as I can see the problem is that MVC has a cache of known controllers and this cache is created based on the list of assemblies defined in system.web/compilation/assemblies section in web.config. It also includes the main application assembly that is associated with global.asax code.&lt;/p&gt;
&lt;p&gt;MVC uses that cache to find block controller by name convention (FooBlock -&amp;gt; FooBlockController) and it fails because controllers from module/add-on assemblies are not listed in that cache since add-on system does not change the configuration files.&lt;/p&gt;
&lt;p&gt;This issue is fixed and the fix should be available in the next platform update. For now you can try following workarounds.&lt;/p&gt;
&lt;h3&gt;Simple workaround&lt;/h3&gt;
&lt;p&gt;The simple workaround is to add add-on assembly in web.config manually:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
… 
  &amp;lt;system.web&amp;gt;
    &amp;lt;compilation … &amp;gt;
      &amp;lt;assemblies&amp;gt;
         …
        &amp;lt;add assembly=&quot;EPiServer.Samples.SharingWidget&quot; /&amp;gt;
      &amp;lt;/assemblies&amp;gt;
    &amp;lt;/compilation&amp;gt;
  &amp;lt;/system.web&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Tricky workaround&lt;/h3&gt;
&lt;p&gt;Second workaround for real geeks is to implement initialization class which registers required add-on/module assembly programmatically. For example, it could register all assemblies in modulesbin folder to fix this issue for all add-ons.&lt;/p&gt;
&lt;p&gt;This initialization class should be marked with &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.preapplicationstartmethodattribute(v=vs.100).aspx&quot;&gt;PreApplicationStartMethodAttribute&lt;/a&gt; and the assembly with this code should reside in site bin folder. Please see more information about this attribute &lt;a href=&quot;http://haacked.com/archive/2010/05/16/three-hidden-extensibility-gems-in-asp-net-4.aspx&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/sharing-widget-for-episerver-7</guid>            <pubDate>Wed, 23 Jan 2013 14:46:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Fixing block rendering issues in Alloy Templates for EPiServer 7</title>            <link>http://dmytroduk.com/techblog/fixing-block-rendering-issues-in-alloy-templates-for-episerver-7</link>            <description>&lt;p&gt;&lt;a href=&quot;http://world.episerver.com/Articles/Items/Alloy-Templates-for-EPiServer-CMS-7/&quot;&gt;New Alloy templates package for EPiServer 7&lt;/a&gt; is a good example of building adaptive site and using new EPiServer features like shared blocks. It implements custom content area rendering to arrange blocks in rows and fill all available space depending on current browser size. There is couple of known issues related to these rendering tricks.&lt;/p&gt;
&lt;h2&gt;Symptoms&lt;/h2&gt;
&lt;p&gt;Postback handler in block control is not triggered.&lt;/p&gt;
&lt;p&gt;Controls in block template are not always initialized properly.&lt;/p&gt;
&lt;h2&gt;Steps to reproduce&lt;/h2&gt;
&lt;p&gt;Add dummy block definition:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;[ContentType]
public class PostbackBlock : BlockData
{
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Create user control as rendering template for this block type. Add some input controls and submit button in block template. Let’s ping Santa:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code&gt;&amp;lt;%@ Control Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; 
    CodeBehind=&quot;PostbackBlockControl.ascx.cs&quot;
    Inherits=&quot;EPiServer.Templates.Alloy.Views.Blocks.PostbackBlockControl&quot; %&amp;gt;
&amp;lt;asp:Panel runat=&quot;server&quot;&amp;gt;
    &amp;lt;asp:TextBox runat=&quot;server&quot; ID=&quot;Message&quot;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;
    &amp;lt;asp:RequiredFieldValidator runat=&quot;server&quot; Text=&quot;*&quot; 
        ControlToValidate=&quot;Message&quot;  /&amp;gt;
    &amp;lt;asp:Button runat=&quot;server&quot; Text=&quot;Send&quot; OnClick=&quot;OnClick&quot; /&amp;gt;
&amp;lt;/asp:Panel&amp;gt;
&amp;lt;asp:Panel ID=&quot;SentMessagePanel&quot; runat=&quot;server&quot; Visible=&quot;false&quot;&amp;gt;
    &amp;lt;p&amp;gt;Ok, it looks like you&#39;ve been good boy/girl this year. Sent to Santa:&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;&amp;lt;asp:Literal runat=&quot;server&quot; ID=&quot;SentMessage&quot;&amp;gt;&amp;lt;/asp:Literal&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/asp:Panel&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Implement postback handler for button click event.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public partial class PostbackBlockControl : BlockControlBase&amp;lt;PostbackBlock&amp;gt;
{
    protected void OnClick(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            // TODO: Deliver message to Santa

            SentMessagePanel.Visible = true;
            SentMessage.Text = Message.Text;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In Edit mode create new shared block, drop it to the content area on the page, publish and try to submit your form in view mode. Note that your on-click handler is not executed.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Only a couple of code lines needs to be fixed, please see it highlighted below.&lt;/p&gt;
&lt;h3&gt;Creating controls in time&lt;/h3&gt;
&lt;p&gt;All block controls in Alloy project implement IBlockControl interface to define block width and ensure nice Tetris-like effect when block is rendered. If your block control does not implement IBlockControl interface it is automatically wrapped in GenericIBlockControlWrapper control to provide default minimum and maximum width. The side effect of this wrapping is that controls are created too late (usually on PreRender stage) and postback handlers in wrapped block controls are never triggered.&lt;/p&gt;
&lt;p&gt;First you have to add public method to ensure that child controls are created in GenericIBlockControlWrapper:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public class GenericIBlockControlWrapper : WebControl, IBlockControl
{
    // ...
    // Ommited GenericIBlockControlWrapper code...
    // ...

    /// &amp;lt;summary&amp;gt;
    /// Ensures that child controls are created.
    /// &amp;lt;/summary&amp;gt;
    public void EnsureChildControlsCreated()
    {
        EnsureChildControls();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then you need to call this method when block control is wrapped in GetIBlockControl method of SitePropertyContentAreaControl:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public class SitePropertyContentAreaControl : PropertyContentAreaControl
{
    // ...
    // Ommited SitePropertyContentAreaControl code...
    // ...

    /// &amp;lt;summary&amp;gt;
    /// Gets the control responsible for rendering content and tries to cast it to &amp;lt;see cref=&quot;IBlockControl&quot;/&amp;gt;.
    /// If the control does not implement this &amp;lt;see cref=&quot;IBlockControl&quot;/&amp;gt; we create a wrapper that handles this for us.
    /// &amp;lt;/summary&amp;gt;
    private static IBlockControl GetIBlockControl(ContentRenderer contentRenderer)
    {
        var blockControl = contentRenderer.CurrentControl as IBlockControl;

        if (blockControl != null)
        {
            return blockControl;
        }

        var genericIBlockControlWrapper = new GenericIBlockControlWrapper();

        genericIBlockControlWrapper.InnerControl = contentRenderer.CurrentControl;
        genericIBlockControlWrapper.CurrentData = contentRenderer.CurrentData;
        genericIBlockControlWrapper.ContentRenderer = contentRenderer;
        contentRenderer.CurrentControl = genericIBlockControlWrapper;

        // Create controls in time:
        genericIBlockControlWrapper.EnsureChildControlsCreated();

        return genericIBlockControlWrapper;            
    }

    // ...
    // Ommited SitePropertyContentAreaControl code...
    // ...

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now block controls are created in time (before Load stage on postback) and ASP.NET can find and trigger postback handlers.&lt;/p&gt;
&lt;h3&gt;Avoiding adding block row twice&lt;/h3&gt;
&lt;p&gt;Second problem is that last row of the blocks in the content area is mistakenly added to control tree twice. It’s not so obvious because blocks in that row are rendered only once, but it can cost various problems with control initialization. In my case there were issues with view state and validation in complex web control.&lt;/p&gt;
&lt;p&gt;Find GetBlockGroups method in SitePropertyContentAreaControl class and clean block group list when last row is created. Here is full listing of GetBlockGroups method, updated code is highlighted:&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public class SitePropertyContentAreaControl : PropertyContentAreaControl
{
    // ...
    // Ommited SitePropertyContentAreaControl code...
    // ...

    /// &amp;lt;summary&amp;gt;
    /// Composes groups where each group represents a Bootstrap row of blocks
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&quot;contentRenderers&quot;&amp;gt;&amp;lt;/param&amp;gt;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
    private List&amp;lt;List&amp;lt;ContentRenderer&amp;gt;&amp;gt; GetBlockGroups(IList&amp;lt;ContentRenderer&amp;gt; contentRenderers)
    {
        var groups = new List&amp;lt;List&amp;lt;ContentRenderer&amp;gt;&amp;gt;();

        var group = new List&amp;lt;ContentRenderer&amp;gt;();

        var minimumWidthOfBlockControlsAddedToCurrentGroup = 0;

        for (int i = 0; i &amp;lt; contentRenderers.Count; i++)
        {
            var contentRenderer = contentRenderers[i];

            // Add block controls to the current group

            var blockControl = GetIBlockControl(contentRenderer);

            // There is no point in showing the default block control in preview mode, or if the current user isn&#39;t an editor
            if (blockControl is DefaultBlockControl)
            {
                if (Page is BlockPreview || !CurrentPage.QueryDistinctAccess(AccessLevel.Edit))
                {
                    continue;
                }
            }

            if (blockControl.MinimumWidth &amp;gt; RowWidth)
            {
                _logger.WarnFormat(&quot;Block control &#39;{0}&#39; has a minimum width of {1} and won&#39;t properly fit within the maximum row width which is {2}&quot;, blockControl.GetType().Name, blockControl.MinimumWidth, RowWidth);

                if (Page is BlockPreview) // In block preview mode we skip block controls that won&#39;t fit within the current row width
                {
                    continue;
                }
            }

            blockControl.Width = blockControl.MinimumWidth;

            group.Add(contentRenderer);

            minimumWidthOfBlockControlsAddedToCurrentGroup += blockControl.MinimumWidth;

            if (i == contentRenderers.Count - 1) // The last block has been added, so we&#39;re done creating groups
            {
                // Fill out the last row
                AdjustWidthOfBlocksToFillRow(group);
                groups.Add(group);
                // Clean the last row list
                group = null;
                break;
            }

            var nextContentRenderer = contentRenderers[i + 1];

            if (nextContentRenderer != null)
            {
                var nextBlockControl = GetIBlockControl(nextContentRenderer);

                if (minimumWidthOfBlockControlsAddedToCurrentGroup + nextBlockControl.MinimumWidth &amp;lt;= RowWidth)
                {
                    continue;
                }

                // The next block won&#39;t fit in this group, try to fill the group by increasing the size of already added blocks
                AdjustWidthOfBlocksToFillRow(group);
            }

            groups.Add(group);

            group = new List&amp;lt;ContentRenderer&amp;gt;();

            minimumWidthOfBlockControlsAddedToCurrentGroup = 0;
        }

        // Check that row list is not null
        if (group != null &amp;amp;&amp;amp; group.Count &amp;gt; 0)
        {
            //If we somehow escaped the loop without adding the last group lets do it now.
            AdjustWidthOfBlocksToFillRow(group);
            groups.Add(group);
        }

        return groups;
    }

    // ...
    // Ommited SitePropertyContentAreaControl code...
    // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Result&lt;/h2&gt;
&lt;p&gt;Now you can post a message using shared block:&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/Fixing-block-rendering-issues-in-Alloy-T_F2F5/MessageToSanta_3.png&quot; border=&quot;0&quot; alt=&quot;Message to Santa&quot; width=&quot;640&quot; height=&quot;168&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;Bug #91643 is filed for these issues and the fix should be available in the next Alloy templates update. Until then you can use described workaround. Please let us know if it works for you.&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/fixing-block-rendering-issues-in-alloy-templates-for-episerver-7</guid>            <pubDate>Mon, 19 Nov 2012 18:46:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>EPiServer 7 CMO</title>            <link>http://dmytroduk.com/techblog/episerver-7-cmo</link>            <description>&lt;p&gt;&lt;a href=&quot;http://world.episerver.com/Articles/Items/EPiServer-7-Ready-for-a-multi-screen-world/&quot;&gt;EPiServer 7 is out&lt;/a&gt;! CMO is also available in the main installation package, go and download it.&lt;/p&gt;
&lt;h2&gt;What’s new in EPiServer 7 CMO&lt;/h2&gt;
&lt;h3&gt;CMO is included in EPiServer 7 CMS license&lt;/h3&gt;
&lt;p&gt;If you have EPiServer 7 CMS license you get EPiServer 7 CMO for free. No additional license is required. Enjoy!&lt;/p&gt;
&lt;h3&gt;Ready for MVC and Web Forms&lt;/h3&gt;
&lt;p&gt;EPiServer 7 supports both Web Forms and MVC. You can even mix these technologies in your solution. CMO works on both Web Forms and MVC based sites.&lt;/p&gt;
&lt;p&gt;Please &lt;a href=&quot;#StatisticsTracking&quot;&gt;make sure that statistics tracking scripts are included&lt;/a&gt; in your pages.&lt;/p&gt;
&lt;h3&gt;Deployment improvements&lt;/h3&gt;
&lt;p&gt;Now it’s possible to select existing database when installing CMO. For instance, you may decide to use your existing CMS database and don’t create separate one for CMO.&lt;/p&gt;
&lt;p&gt;Live Monitor integration is available as separate installation option.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/4815f0fb15bb_11BD5/LiveMonitorIntegrationOption_3.png&quot; border=&quot;0&quot; alt=&quot;Live Monitor integration option&quot; width=&quot;600&quot; height=&quot;295&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Enable it if you want to see real-time user activity in campaign reports. It will install Live Monitor on target site automatically. This option is not available if you don’t have Live Monitor installed on the server. You can run Live Monitor .msi installer later and reinstall CMO+Live Monitor integration on site afterwards.&lt;/p&gt;
&lt;h3&gt;Bug fixes&lt;/h3&gt;
&lt;p&gt;EPiServer 7 CMO includes the number of bug fixes and improved performance.&lt;/p&gt;
&lt;h2&gt;Notes and tips&lt;/h2&gt;
&lt;h3 id=&quot;StatisticsTracking&quot;&gt;Statistics tracking&lt;/h3&gt;
&lt;p&gt;EPiServer Framework includes new &lt;a href=&quot;http://sdkbeta.episerver.com/SDK-html-Container/?path=/SdkDocuments/EPiServerFramework/7/Knowledge%20Base/Developer%20Guide/Client%20Resources/Client%20Resources.htm&amp;amp;vppRoot=/SdkDocuments//EPiServerFramework/7/Knowledge%20Base/Developer%20Guide/&quot;&gt;small framework&lt;/a&gt; developed to manage client resources and inject stuff on pages. We use it to track statistics for CMO and Live Monitor.&lt;/p&gt;
&lt;p&gt;Please consider &lt;a href=&quot;http://sdkbeta.episerver.com/SDK-html-Container/?path=/SdkDocuments/CMS/7/Knowledge%20Base/Developer%20Guide/Client%20Resources/Client%20Resources.htm&amp;amp;vppRoot=/SdkDocuments//CMS/7/Knowledge%20Base/Developer%20Guide/&quot;&gt;best practice guidelines, requirements for page templates&lt;/a&gt; and &lt;a href=&quot;http://sdkbeta.episerver.com/SDK-html-Container/?path=/SdkDocuments/CMS/7/Knowledge%20Base/Upgrading/Upgrading.htm&amp;amp;vppRoot=/SdkDocuments//CMS/7/Knowledge%20Base/Upgrading/&quot;&gt;upgrading documentation&lt;/a&gt; to make sure that statistics tracking scripts are available on your site.&lt;/p&gt;
&lt;h3&gt;Creating page versions for A/B testing&lt;/h3&gt;
&lt;p&gt;EPiServer 7 CMS comes with new brand editing UI and one of the ideas is that you are always editing and working on last draft.&lt;/p&gt;
&lt;p&gt;You may want to create several page versions to run A/B test. It’s pretty easy, just start editing your original page. New draft is created automatically and you can use it as page version in A/B test:&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/4815f0fb15bb_11BD5/PageVersion1_3.png&quot; border=&quot;0&quot; alt=&quot;Page editing&quot; width=&quot;600&quot; height=&quot;398&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can create more versions as follows:&lt;/p&gt;
&lt;p&gt;Add Versions gadget on panel in Edit mode:&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/4815f0fb15bb_11BD5/AddingNewGadget_3.png&quot; border=&quot;0&quot; alt=&quot;Adding new gadget on a panel&quot; width=&quot;229&quot; height=&quot;98&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Select published version (your original page) in the list:&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/4815f0fb15bb_11BD5/SelectingPublishedVersion_3.png&quot; border=&quot;0&quot; alt=&quot;Selecting published page version&quot; width=&quot;501&quot; height=&quot;217&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Click on “New Draft from here” option in Options button in main toolbar:&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/4815f0fb15bb_11BD5/CreatingNewDraft_3.png&quot; border=&quot;0&quot; alt=&quot;Creating new draft&quot; width=&quot;309&quot; height=&quot;177&quot; /&gt;&lt;/p&gt;
&lt;p&gt;New draft is created and you can edit page version for your test. Penguins are nice, right?&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/4815f0fb15bb_11BD5/PageVersion_3.png&quot; border=&quot;0&quot; alt=&quot;Editing page version&quot; width=&quot;600&quot; height=&quot;378&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Mark your page versions as “Ready to Publish”.&lt;/p&gt;
&lt;h3&gt;A/B tests and shared blocks&lt;/h3&gt;
&lt;p&gt;Let’s say you have a page and shared block is placed in one of the content area on the page. Probably you would like to run A/B test for this page and see which block version gives you the best result.&lt;/p&gt;
&lt;p&gt;A/B testing for shared blocks is not fully supported by the current CMO version and the page is rendered with published block version.&lt;/p&gt;
&lt;p&gt;You can create several shared blocks and place them on corresponding page versions. In this case you are testing page versions that hold different blocks.&lt;/p&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;You can find more information about EPiServer 7 CMO in the following documents:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/EPiServer-7-CMO/Installation-Instructions---EPiServer-7-CMO/&quot;&gt;Installation Instructions – EPiServer 7 CMO&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sdkbeta.episerver.com/SDK-html-Container/?path=/SdkDocuments/CMS/7/Knowledge%20Base/Upgrading/Upgrading.htm&amp;amp;vppRoot=/SdkDocuments//CMS/7/Knowledge%20Base/Upgrading/&quot;&gt;Upgrading guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sdkbeta.episerver.com/SDK-html-Container/?path=/SdkDocuments/CMS/7/Knowledge%20Base/Developer%20Guide/CMO/CMO.htm&amp;amp;vppRoot=/SdkDocuments//CMS/7/Knowledge%20Base/Developer%20Guide/&quot;&gt;CMO section in EPiServer 7 SDK&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webhelp.episerver.com/CMO/7.0/EN/Default.htm&quot;&gt;User guide&lt;/a&gt;&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/episerver-7-cmo</guid>            <pubDate>Fri, 02 Nov 2012 20:43:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Developing simple add-on for EPiServer 7 Preview</title>            <link>http://dmytroduk.com/techblog/developing-simple-add-on-for-episerver-7-preview</link>            <description>&lt;p&gt;This blog post provides brief technical information about Add-On Store in &lt;a href=&quot;http://world.episerver.com/Articles/Items/Say-Hello-to-EPiServer-7-Preview/&quot;&gt;EPiServer 7 Preview&lt;/a&gt; and describes the process of developing simple add-on step by step.&lt;/p&gt;
&lt;h2&gt;Meet the Add-On Store&lt;/h2&gt;
&lt;p&gt;Add-on Store is the new approach to create, distribute, share and manage modules for EPiServer based sites.&lt;br /&gt;For site owners and administrators Add-On Store is the one place where they can find, install and manage required add-ons to bring new features and tools for site visitors and editors.&lt;/p&gt;
&lt;p&gt;For EPiServer partners and developers Add-On Store means the standard way to create and distribute modules, plug-ins and extensions for EPiServer sites.&lt;/p&gt;
&lt;p&gt;And we use this technology ourselves. It may be worth mentioning that new Edit UI and UI Platform in EPiServer 7 Preview are add-ons. Add-On system itself is implemented as add-ons. It proves that add-ons can be really powerful.&lt;/p&gt;
&lt;p&gt;Go ahead, &lt;a href=&quot;http://world.episerver.com/Download/Items/EPiServer-CMS/EPiServer-7-Preview---CMS/&quot;&gt;download EPiServer 7 Preview&lt;/a&gt; and see it in action.&lt;/p&gt;
&lt;h3&gt;Add-ons from developer point of view&lt;/h3&gt;
&lt;p&gt;Please look at the documentation for add-on developers in &lt;a href=&quot;http://world.episerver.com/Documentation/Categories/Products/EPiServer-CMS/&quot;&gt;EPiServer Framework SDK&lt;/a&gt; Knowledge Base to get more information, technical details and things that should be kept in mind when you are developing add-on.&lt;/p&gt;
&lt;h4&gt;What can be an add-on&lt;/h4&gt;
&lt;p&gt;Technically add-on is a &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Tech-Notes/EPiServer-CMS-6/EPiServer-CMS-60/OnlineCenter-Developer-Documentation/#ShellModules&quot;&gt;Shell module&lt;/a&gt; that is distributed as &lt;a href=&quot;http://nuget.org/&quot;&gt;NuGet&lt;/a&gt; package and can be installed, updated and removed using Add-On Store interface on EPiServer 7 site. Each add-on resides in the one directory.&lt;/p&gt;
&lt;p&gt;Add-on provides new functionality and extensions for EPiServer sites: various plug-ins, scheduled jobs, gadgets, Editing UI components, data stores, typed pages, blocks, templates and so on.&lt;/p&gt;
&lt;p&gt;Configuration file changes are not supported in this version. I’m not sure if it is good idea to make it possible in the future.&lt;/p&gt;
&lt;h4&gt;Initialization and extension point&lt;/h4&gt;
&lt;p&gt;It is possible to implement specific initialization for add-on components and execute custom code when add-on is installed, updated or removed.&lt;/p&gt;
&lt;h4&gt;Public, protected and system add-ons&lt;/h4&gt;
&lt;p&gt;Public add-ons provide functionality for the public site.&lt;/p&gt;
&lt;p&gt;Protected add-ons usually bring features for site administrators and editors and contain resources that should not be available publicly.&lt;/p&gt;
&lt;p&gt;System add-ons are important system modules that cannot be removed, but can be updated. Usually it is EPiServer add-ons that are distributed with the platform and deployed on each new web site. For example: new Editing Interface in EPiServer 7 Preview.&lt;/p&gt;
&lt;h4&gt;Add-on prerequisites and dependencies&lt;/h4&gt;
&lt;p&gt;Dependencies are the list of other add-ons that should be installed on the site. The system makes sure that you will not break any installed add-ons by updating or removing related packages. Dependencies are installed and upgraded automatically if possible.&lt;/p&gt;
&lt;p&gt;Add-on system allows installing only those add-ons that are compatible with your environment.&lt;/p&gt;
&lt;p&gt;Prerequisites are dependencies to the products that are not installed as add-ons. For example, you probably would define EPiServer Community as prerequisite for the add-on that provides some new great widgets to manage Community entities.&lt;/p&gt;
&lt;h2&gt;Sample add-on: Sharing Widget&lt;/h2&gt;
&lt;p&gt;This sample add-on makes it easy for site visitors to share the content using &lt;a href=&quot;http://sharethis.com&quot;&gt;ShareThis&lt;/a&gt; widget which allows to recommend things in tons of social networks and communities.&lt;/p&gt;
&lt;p&gt;To try something new sharing widget is implemented as shared block that can be simply dropped on the site pages in new EPiServer 7 Edit UI.&lt;/p&gt;
&lt;h3&gt;Getting ShareThis widget code&lt;/h3&gt;
&lt;p&gt;Go to &lt;a href=&quot;http://sharethis.com/publishers/get-sharing-tools&quot;&gt;ShareThis site&lt;/a&gt; and generate default widget with small buttons for generic web site and pick 4 favorite social networks: Twitter, Facebook, Google+ and LinkedIn. All other communities will be available through ShareThis option.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/7621b9afab91_ACA6/ShareThisSteps1-3_3.png&quot; border=&quot;0&quot; alt=&quot;Generating ShareThis widget code&quot; width=&quot;640&quot; height=&quot;776&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You will be prompted to register in order to get Publisher ID. Using this account you can access a set of analytic tools to understand sharing behavior. It’s possible to skip the registration and just get a code, in this case you still get some Publisher ID but you don’t have access to analytics. Make sure that ShareThis terms of service and privacy policy are fine with you.&lt;/p&gt;
&lt;p&gt;Save generated code on the last step for further use:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;span class=&#39;st_twitter&#39; displayText=&#39;Tweet&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_facebook&#39; displayText=&#39;Facebook&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_googleplus&#39; displayText=&#39;Google +&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_linkedin&#39; displayText=&#39;LinkedIn&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_sharethis&#39; displayText=&#39;ShareThis&#39;&amp;gt;&amp;lt;/span&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;var switchTo5x=true;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://w.sharethis.com/button/buttons.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;stLight.options({publisher: &quot;Your-Publisher-ID&quot;}); &amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;Creating add-on project&lt;/h3&gt;
&lt;p&gt;Create new ASP.NET Empty Web Application project using Visual Studio. You can remove web.config file in the project root and the most of default references.&lt;/p&gt;
&lt;p&gt;References to the following assemblies need to be added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EPiServer&amp;nbsp;&lt;/li&gt;
&lt;li&gt;EPiServer.BaseLibrary&lt;/li&gt;
&lt;li&gt;EPiServer.Data&lt;/li&gt;
&lt;li&gt;EPiServer.Shell&lt;/li&gt;
&lt;li&gt;System.ComponentModel.DataAnnotations&lt;/li&gt;
&lt;li&gt;System.Web.Mvc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hopefully, platform binaries will be available in the &lt;a href=&quot;http://nuget.episerver.com&quot;&gt;EPiServer NuGet feed&lt;/a&gt; after EPiServer 7 release and it will be possible to reference corresponding NuGet package. Right now you can just create Dependencies directory in the solution folder and copy referenced EPiServer assemblies.&lt;/p&gt;
&lt;h3&gt;Adding block type&lt;/h3&gt;
&lt;p&gt;Create BlockTypes folder inside your project and add new class SharingWidgetBlock:&lt;/p&gt;
&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;ContentType(DisplayName = &quot;Sharing Widget Block&quot;, 
    Description = &quot;Adds ShareThis widget on pages where block is placed.&quot;)]
public class SharingWidgetBlock : BlockData
{
    [Display(Name = &quot;Publisher ID&quot;,
        Description = &quot;Register on ShareThis.com to get your Publisher ID.&quot;)]
    [Required]
    public virtual string PublisherID { get; set; }
}
&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;EPiServer.DataAnnotations.ContentTypeAttribute&lt;/code&gt; is applied to mark the content type and define the name and description that are displayed when this block type is listed in Admin mode.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;EPiServer.Core.BlockData&lt;/code&gt; class provides the base implementation for all block types.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PublisherID&lt;/code&gt; property is the only one setting for sharing widget block and it is marked as required. DisplayAttribute is used to define property name and description that will appear in EPiServer Edit and Admin mode.&lt;/p&gt;
&lt;h3&gt;Implementing block rendering&lt;/h3&gt;
&lt;p&gt;EPiServer 7 Preview brings full MVC support and the great thing here is that you can have Web Forms and MVC working side by side.&lt;/p&gt;
&lt;p&gt;Obviously your add-on is going to be so awesome that most of EPiServer site owners will dream about installing it on their EPiServer 7 sites, right? Of course it should support both Web Forms and MVC!&lt;/p&gt;
&lt;h4&gt;Web Forms control&lt;/h4&gt;
&lt;p&gt;Add Blocks sub folder in the project and create new user control SharingWidget.ascx.&lt;/p&gt;
&lt;p&gt;Change control code-behind file and inherit &lt;code&gt;BlockControlBase&amp;lt;SharingWidgetBlock&amp;gt;&lt;/code&gt; which is the base class for user controls that renders block data:&lt;/p&gt;
&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;public partial class SharingWidget : BlockControlBase&amp;lt;SharingWidgetBlock&amp;gt;
{
}
&lt;/pre&gt;
&lt;p&gt;Add ShareThis widget code to control markup.&lt;/p&gt;
&lt;p&gt;Note that add-on assembly is referenced in the Control directive. This is required since add-on binaries are not placed to site bin folder and will be loaded from probing path.&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;%@ Control Language=&quot;C#&quot; AutoEventWireup=&quot;false&quot; CodeBehind=&quot;SharingWidget.ascx.cs&quot; 
    Inherits=&quot;EPiServer.Samples.SharingWidget.Blocks.SharingWidget, EPiServer.Samples.SharingWidget&quot; %&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;    var switchTo5x = true;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://w.sharethis.com/button/buttons.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;    stLight.options({ publisher: &quot;&amp;lt;%= CurrentBlock.PublisherID %&amp;gt;&quot; }); &amp;lt;/script&amp;gt;

&amp;lt;span class=&#39;st_twitter&#39; displayText=&#39;Tweet&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_facebook&#39; displayText=&#39;Facebook&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_googleplus&#39; displayText=&#39;Google +&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_linkedin&#39; displayText=&#39;LinkedIn&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_sharethis&#39; displayText=&#39;ShareThis&#39;&amp;gt;&amp;lt;/span&amp;gt;
&lt;/pre&gt;
&lt;p&gt;CurrentBlock property is used to access block instance that is being rendered by this user control and set publisher ID widget parameter.&lt;/p&gt;
&lt;h4&gt;MVC block rendering&lt;/h4&gt;
&lt;h5&gt;Model&lt;/h5&gt;
&lt;p&gt;You already have it: &lt;code&gt;SharingWidgetBlock&lt;/code&gt; is the model.&lt;/p&gt;
&lt;h5&gt;View&lt;/h5&gt;
&lt;p&gt;Add standard Views folder in the project. Create SharingWidget sub folder and add SharingWidget.cshtml partial view. It follows naming conventions for MVC views, however it is not really important in this particular case.&lt;/p&gt;
&lt;p&gt;SharingWidget.cshtml view code looks like this:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false; auto-links: false;&quot;&gt;@model EPiServer.Samples.SharingWidget.BlockTypes.SharingWidgetBlock
           
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;    var switchTo5x = true;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://w.sharethis.com/button/buttons.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;    stLight.options({ publisher: &quot;@Model.PublisherID&quot; }); &amp;lt;/script&amp;gt;

&amp;lt;span class=&#39;st_twitter&#39; displayText=&#39;Tweet&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_facebook&#39; displayText=&#39;Facebook&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_googleplus&#39; displayText=&#39;Google +&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_linkedin&#39; displayText=&#39;LinkedIn&#39;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&#39;st_sharethis&#39; displayText=&#39;ShareThis&#39;&amp;gt;&amp;lt;/span&amp;gt;
&lt;/pre&gt;
&lt;p&gt;As you can see, it uses Razor syntax to output publisher ID and contains the same HTML as user control.&lt;/p&gt;
&lt;p&gt;To make it work add web.config file to the Views folder. It configures Razor engine and makes add-on assembly and namespace available in the views as follows:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;configSections&amp;gt;
    &amp;lt;sectionGroup name=&quot;system.web.webPages.razor&quot; type=&quot;System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot;&amp;gt;
      &amp;lt;section name=&quot;host&quot; type=&quot;System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot; requirePermission=&quot;false&quot; /&amp;gt;
      &amp;lt;section name=&quot;pages&quot; type=&quot;System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot; requirePermission=&quot;false&quot; /&amp;gt;
    &amp;lt;/sectionGroup&amp;gt;
  &amp;lt;/configSections&amp;gt;

  &amp;lt;system.web.webPages.razor&amp;gt;
    &amp;lt;host factoryType=&quot;System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot; /&amp;gt;
    &amp;lt;pages pageBaseType=&quot;System.Web.Mvc.WebViewPage&quot;&amp;gt;
      &amp;lt;namespaces&amp;gt;
        &amp;lt;add namespace=&quot;EPiServer.Samples.SharingWidget&quot; /&amp;gt;
      &amp;lt;/namespaces&amp;gt;
    &amp;lt;/pages&amp;gt;
  &amp;lt;/system.web.webPages.razor&amp;gt;

  &amp;lt;system.web&amp;gt;
    &amp;lt;compilation&amp;gt;
      &amp;lt;assemblies&amp;gt;
        &amp;lt;add assembly=&quot;EPiServer.Samples.SharingWidget&quot; /&amp;gt;
      &amp;lt;/assemblies&amp;gt;
    &amp;lt;/compilation&amp;gt;
  &amp;lt;/system.web&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/pre&gt;
&lt;h5&gt;Controller&lt;/h5&gt;
&lt;p&gt;Create controller responsible for block data rendering:&lt;/p&gt;
&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;public class SharingWidgetController : BlockController&amp;lt;SharingWidgetBlock&amp;gt;
{
    public override ActionResult Index(SharingWidgetBlock blockData)
    {
        return PartialView(Paths.ToResource(this.GetType(), &quot;Views/SharingWidget/SharingWidget.cshtml&quot;), blockData);
    }
}
&lt;/pre&gt;
&lt;p&gt;There is a tiny trick to provide required view file.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;BlockController&amp;lt;T&amp;gt;&lt;/code&gt; is the base class for block rendering controllers. Index method of base controller returns action result for partial view with the name equal to block type name. Then the system tries to find partial view in a folder structure according to the block namespace.&lt;/p&gt;
&lt;p&gt;Search paths for &lt;code&gt;EPiServer.Samples.SharingWidget.BlockTypes.SharingWidgetBlock&lt;/code&gt; type would be as follows:&lt;/p&gt;
&lt;pre&gt;~/Views/SharingWidget/SharingWidgetBlock.aspx
~/Views/SharingWidget/SharingWidgetBlock.ascx
~/Views/Shared/SharingWidgetBlock.aspx
~/Views/Shared/SharingWidgetBlock.ascx
~/Views/SharingWidget/SharingWidgetBlock.cshtml
~/Views/SharingWidget/SharingWidgetBlock.vbhtml
~/Views/Shared/SharingWidgetBlock.cshtml
~/Views/Shared/SharingWidgetBlock.vbhtml
/Util/Views/Shared/SharingWidgetBlock.ascx
/Util/Views/Shared/DisplayTemplates/SharingWidgetBlock.ascx
/Util/Views/Shared/EditorTemplates/SharingWidgetBlock.ascx
/EPiServer/CMS/Views/Shared/SharingWidgetBlock.ascx
/EPiServer/CMS/Views/Shared/DisplayTemplates/SharingWidgetBlock.ascx
/EPiServer/CMS/Views/Shared/EditorTemplates/SharingWidgetBlock.ascx

&lt;/pre&gt;
&lt;p&gt;Most probably add-on view file will not be found in these folders, so the system needs some help to locate it.&lt;br /&gt;The path to the directory where add-on is installed depends on packaging configuration and add-on developer should never hardcode absolute and concrete paths. Full paths to add-on resources like scripts, styles and views should be resolved from the path relative to the add-on directory. &lt;code&gt;EPiServer.Shell.Paths&lt;/code&gt; class provides the bunch of methods to resolve path to resources located in the corresponding add-on folder. Add-on can be identified by name, by assembly or by type from add-on assembly.&lt;/p&gt;
&lt;p&gt;Controller for sharing widget block overrides default Index method to resolve the view path using partial path in add-on directory.&lt;/p&gt;
&lt;h3&gt;Intermediate results&lt;/h3&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; margin: 0px 0px 0px 15px; padding-left: 0px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/7621b9afab91_ACA6/SolutionStructure_3.png&quot; border=&quot;0&quot; alt=&quot;Solution structure&quot; width=&quot;350&quot; height=&quot;294&quot; align=&quot;right&quot; /&gt;You have implemented block type, Web Forms and MVC rendering templates and this code can be deployed as Shell module on the site.&lt;/p&gt;
&lt;p&gt;I agree, it’s nasty to have that script tags in both markups; you get several script includes if there are several controls/views rendered on the page. But don’t worry about it too much. Probably you won’t have several sharing widgets on page unless your site &lt;a href=&quot;http://theoatmeal.com/comics/facebook_likes&quot;&gt;looks like this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And of course it would be nice to make the style of the widget and the list of available buttons configurable. Again, keep it simple for the version one.&lt;/p&gt;
&lt;h3&gt;Creating add-on package&lt;/h3&gt;
&lt;p&gt;To turn the module into an add-on you need to create a NuGet package that contains add-on assemblies and resources.&lt;/p&gt;
&lt;p&gt;Download NuGet command line or Package explorer from &lt;a href=&quot;http://nuget.codeplex.com/releases&quot;&gt;NuGet CodePlex&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are several approaches to &lt;a href=&quot;http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#Creating_a_Package&quot;&gt;creating a NuGet package&lt;/a&gt;. &lt;a href=&quot;http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#From_a_project&quot;&gt;Creating a package from a project&lt;/a&gt; looks like the easiest way for this simple add-on.&lt;/p&gt;
&lt;h4&gt;Creating package manifest file&lt;/h4&gt;
&lt;p&gt;Run following command in the directory where the .csproj file is:&lt;/p&gt;
&lt;pre&gt;nuget spec

&lt;/pre&gt;
&lt;p&gt;It creates &lt;a href=&quot;http://docs.nuget.org/docs/reference/nuspec-reference&quot;&gt;NuGet .nuspec manifest file&lt;/a&gt; for add-on package. Manifest file can be included to the project for convenience.&lt;/p&gt;
&lt;h4&gt;Package metadata&lt;/h4&gt;
&lt;p&gt;Edit .nuspec file, add basic metadata like add-on title, description, tags, icon URL etc.&lt;/p&gt;
&lt;p&gt;Note that it contains &lt;a href=&quot;http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#From_a_project&quot;&gt;replacement token&lt;/a&gt; &lt;code&gt;$id$&lt;/code&gt;, &lt;code&gt;$version$&lt;/code&gt; and &lt;code&gt;$author$&lt;/code&gt; that are going to be replaced by assembly name, version and author when NuGet builds the package:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;package &amp;gt;
  &amp;lt;metadata&amp;gt;
    &amp;lt;id&amp;gt;$id$&amp;lt;/id&amp;gt;
    &amp;lt;title&amp;gt;Sharing Wigdet&amp;lt;/title&amp;gt;
    &amp;lt;version&amp;gt;$version$&amp;lt;/version&amp;gt;
    &amp;lt;authors&amp;gt;$author$&amp;lt;/authors&amp;gt;
    &amp;lt;owners&amp;gt;$author$&amp;lt;/owners&amp;gt;
    &amp;lt;projectUrl&amp;gt;https://github.com/dmytroduk/SharingWidgetAddOn&amp;lt;/projectUrl&amp;gt;
    &amp;lt;iconUrl&amp;gt;http://w.sharethis.com/images/sharethis_32.png&amp;lt;/iconUrl&amp;gt;
    &amp;lt;requireLicenseAcceptance&amp;gt;false&amp;lt;/requireLicenseAcceptance&amp;gt;
    &amp;lt;description&amp;gt;Enables site visitors to share the content in social networks and communities using ShareThis.com widget.&amp;lt;/description&amp;gt;
    &amp;lt;tags&amp;gt;EPiServerPublicModulePackage Social Sharing ShareThis&amp;lt;/tags&amp;gt;
    &amp;lt;dependencies&amp;gt;
      &amp;lt;dependency id=&quot;EPiServer&quot; version=&quot;[7.0,8.0)&quot; /&amp;gt;
    &amp;lt;/dependencies&amp;gt;
  &amp;lt;/metadata&amp;gt;
&amp;lt;/package&amp;gt;
&lt;/pre&gt;
&lt;h4&gt;Public or protected add-on&lt;/h4&gt;
&lt;p&gt;It’s required to add one of the special tags to indicate that this is add-on package for EPiServer based site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EPiServerPublicModulePackage&lt;/code&gt;- this tag should be added for public add-ons&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EPiServerModulePackage&lt;/code&gt; - should be added in the tag list of protected add-ons&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;EPiServerPublicModulePackage&lt;/code&gt; tag is more suitable for this add-on since sharing widget should be available for all site visitors.&lt;/p&gt;
&lt;h4&gt;Dependencies and prerequisites&lt;/h4&gt;
&lt;p&gt;Sharing Widget add-on does not depend on any other add-on, so you could skip dependencies list.&lt;br /&gt;However, it can be used to set add-on prerequisites. Define that this add-on requires any version of EPiServer CMS 7. Add dependency with id equal to EPiServer core assembly name and version range from 7 (including) to 8 (excluding). Add-on system will check if corresponding assembly is loaded in site app domain.&lt;/p&gt;
&lt;h4&gt;Building the package&lt;/h4&gt;
&lt;p&gt;Build the project.&lt;/p&gt;
&lt;p&gt;Run following command to create the package from the add-on project:&lt;/p&gt;
&lt;pre&gt;nuget pack EPiServer.Samples.SharingWidget.csproj
&lt;/pre&gt;
&lt;p&gt;It creates add-on package EPiServer.Samples.SharingWidget.1.0.0.0.nupkg that is ready to be installed.&lt;/p&gt;
&lt;h3&gt;Installing Sharing Widget add-on&lt;/h3&gt;
&lt;p&gt;Login to EPiServer 7 Preview site as administrator and navigate to Add-Ons section.&lt;/p&gt;
&lt;p&gt;Sharing Widget add-on is not published in the central EPiServer Store (yet!), you have to upload package file to install it on site. Click on “Manual Upload” button, select package file and press Install. You will be prompted to restart the site to finish the installation.&lt;/p&gt;
&lt;p&gt;After successful installation Sharing Widget add-on should be displayed in installed section. You can remove it any time (why would you?) by clicking on Uninstall button in detailed view.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/7621b9afab91_ACA6/DetailedView_3.png&quot; border=&quot;0&quot; alt=&quot;Add-on detailed view&quot; width=&quot;640&quot; height=&quot;348&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Using add-on widget&lt;/h3&gt;
&lt;h4&gt;Creating shared block&lt;/h4&gt;
&lt;p&gt;Navigate to new shiny Edit UI. Make sure that you have Shared Blocks widget in the right panel. Create new Sharing Widget block, specify your publisher ID and publish.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/7621b9afab91_ACA6/CreatingSharingWidget_3.png&quot; border=&quot;0&quot; alt=&quot;Creating Sharing Widget block&quot; width=&quot;640&quot; height=&quot;404&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Placing widget on pages&lt;/h4&gt;
&lt;p&gt;Drag Shared Widget block and drop it on the appropriate content area. Publish the page.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/7621b9afab91_ACA6/DroppingWidgetOnPage_3.png&quot; border=&quot;0&quot; alt=&quot;Dropping widget on the page&quot; width=&quot;640&quot; height=&quot;477&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Check out that sharing widget works both on Web Forms and MVC site:&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/7621b9afab91_ACA6/SharingWidgetOnMvcSite_3.png&quot; border=&quot;0&quot; alt=&quot;Sharing widget on MVC site&quot; width=&quot;640&quot; height=&quot;689&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Source code&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dmytroduk/SharingWidgetAddOn/tree/EPiServer7Preview&quot;&gt;Source code is available on GitHub&lt;/a&gt;, you are more than welcome to download or fork. Add-on package &lt;a href=&quot;https://github.com/downloads/dmytroduk/SharingWidgetAddOn/EPiServer.Samples.SharingWidget.1.0.0.0.nupkg&quot;&gt;can be downloaded here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Try it!&lt;/h2&gt;
&lt;p&gt;Hopefully the above example would encourage you to start developing your add-ons right now and make new great things.&lt;/p&gt;
&lt;p&gt;Your feedback is highly appreciated and would help to make add-on system and EPiServer 7 better.&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/developing-simple-add-on-for-episerver-7-preview</guid>            <pubDate>Wed, 27 Jun 2012 13:41:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>EPiServer CMO in load balancing environment with separate editing server</title>            <link>http://dmytroduk.com/techblog/episerver-cmo-in-load-balancing-environment-with-separate-editing-server</link>            <description>&lt;p&gt;This blog post describes EPiServer CMO installation and configuration in a load balanced environment where CMS editing interfaces and components are not available on the front-end web servers; additional editing server is set up and attached to the same database.&lt;/p&gt;
&lt;p&gt;This kind of environment is described in &lt;a href=&quot;http://world.episerver.com/Blogs/Chris-Bennett/Dates/2009/12/Server-Architecture-Options-for-EPiServer/&quot;&gt;this blog post&lt;/a&gt; as Option 2.&lt;/p&gt;
&lt;p&gt;So let’s consider the following deployment model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web site based on EPiServer CMS is installed on two or more front web servers. The site is available publicly through the load balancing system. CMS management UI is disabled on these public sites.&lt;/li&gt;
&lt;li&gt;Separate editing web server is set up behind the firewall. Web site is deployed on editing server with EPiServer CMS editor and admin UI and uses the same data and file shares as sites deployed on front-end servers. Editing server is available within internal network for editors and administrators.&lt;/li&gt;
&lt;li&gt;There is one back-end server which contains the one shared site database.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;EPiServer CMO deployment should follow that schema.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-in-load-balancing-environm_DCBB/EPiServerCMOInLoadBalancingDividedEnvironment_2.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; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-in-load-balancing-environm_DCBB/EPiServerCMOInLoadBalancingDividedEnvironment_thumb.png&quot; border=&quot;0&quot; alt=&quot;Deployment model for EPiServer CMO in load balancing environment with separate editing server&quot; width=&quot;640&quot; height=&quot;560&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CMO Core, Statistics handler and web services are installed on each front-end web server.&lt;/p&gt;
&lt;p&gt;These components and also CMO UI are installed on separate editing server. Load balancing configuration with sticky sessions is not required by CMO UI in this case. Statistics gathering on editing server can be turned off to process only public site visits.&lt;/p&gt;
&lt;p&gt;CMO database and Aggregation service are installed on the back-end server, where CMS database is hosted. One CMO database is shared between all front-end servers and editing server.&lt;/p&gt;
&lt;p&gt;Thumbnail service must be accessible for CMO UI components. Since CMO UI is installed only on the editing server, there are at least 2 options where to deploy Thumbnail service: on the editing server or on the back-end server, as it was described in the previous blog post.&lt;/p&gt;
&lt;p&gt;Keeping in mind that Thumbnail service needs to access web site and all site resources to make a screenshot, we can install Thumbnail service on the editing server, where we obviously need to have access to web site and its resources. In this case there is no need to enable access from back-end server to web site or Internet, which is good for the security. You can decide where to install Thumbnail service depending on your environment and configuration.&lt;/p&gt;
&lt;p&gt;URL rewrite provider is used to resolve external page URL. Thumbnail service most likely will create screenshots on the site hosted on the editing server and will use the URL specified in &lt;span style=&quot;font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px;&quot;&gt;siteUrl&lt;/span&gt; attribute of &lt;span style=&quot;font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px;&quot;&gt;episerver/sites/site&lt;/span&gt; section as a base address when standard FURL provider is enabled on the site.&lt;/p&gt;
&lt;p&gt;Please see the steps required to install and configure EPiServer CMO below.&lt;/p&gt;
&lt;h2&gt;Installing EPiServer CMO in load balancing environment with separate editing server&lt;/h2&gt;
&lt;p&gt;1. Install CMO module on the front-end servers and the editing server using EPiServerCMO.msi installer.&lt;/p&gt;
&lt;p&gt;2. Deploy CMO on web site on the first front-end server using Deployment Center. Follow &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Installation-Instructions---EPiServer-CMO-2-R2/&quot;&gt;installation instructions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Select only Statistics Handler in optional components list to install.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-in-load-balancing-environm_DCBB/EPiServerCmoOptionsForFrontEndServers_3.png&quot; border=&quot;0&quot; alt=&quot;Optional EPiServer CMO components for installation on front-end servers&quot; width=&quot;544&quot; height=&quot;218&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Select or enter the name of SQL Server instance on your back-end server on database settings installation step.&lt;/p&gt;
&lt;p&gt;Enter the name of new CMO database to create. Enter the name and password of database user.&lt;/p&gt;
&lt;p&gt;You can leave the default Thumbnail service URL (http://localhost:8731/IECaptWCF/Url2Image).&lt;/p&gt;
&lt;p&gt;3. Deploy CMO on web site on all other front-end servers.&lt;/p&gt;
&lt;p&gt;Do the same as you did on step 2, but don’t create new database this time. Select existing CMO database and enter the same user name and password that was created on the previous step.&lt;/p&gt;
&lt;p&gt;4. Deploy CMO on web site on the editing server using Deployment Center.&lt;/p&gt;
&lt;p&gt;Select Campaign Monitor and Optimization UI, Statistics Handler and Thumbnail Service in optional components list to install:&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-in-load-balancing-environm_DCBB/EPiServerCmoOptionsForEditingServer_3.png&quot; border=&quot;0&quot; alt=&quot;Optional EPiServer CMO components for installation on editing server&quot; width=&quot;544&quot; height=&quot;218&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can uncheck Statistics Handler option and don’t install it if visitors of web site on the editing server should not affect CMO statistics. However there is also another way of disabling statistics gathering which is described in the next installation step.&lt;/p&gt;
&lt;p&gt;Choose SQL Server instance on your back-end server on database settings installation step.&lt;/p&gt;
&lt;p&gt;Don’t create new database, select existing CMO database that was created on the previous steps. Enter the name and password of database user specified on the step 2.&lt;/p&gt;
&lt;p&gt;5. Consider disabling of statistics gathering on the editing server if visitors of web site on the internal editing server should not affect CMO statistics.&lt;/p&gt;
&lt;p&gt;Add the following setting to &lt;span style=&quot;font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px;&quot;&gt;/configuration/appSettings&lt;/span&gt; node in web.config file to disable CMO statistics gathering on the site:&lt;/p&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px;&quot;&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;appSettings&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;add&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;key&lt;/span&gt;=&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;DisableCmoStatisticGathering&quot;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;value&lt;/span&gt;=&lt;span style=&quot;color: #0000ff;&quot;&gt;&quot;true&quot;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style=&quot;background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px;&quot;&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;appSettings&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;6. &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Configuring-CMO-2-R2-to-support-NET-40/&quot;&gt;Update configuration of sites where CMO was installed to support .NET 4&lt;/a&gt; if it is required. Do it on all front-end and editing servers.&lt;/p&gt;
&lt;p&gt;7. &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Configuring-Live-Monitor-for-Multiple-Bindings-in-EPiServer-CMO-20/&quot;&gt;Configure CMO Live Monitor for multiple bindings on all front-end and editing servers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;8. Consider &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-20/Configuring-the-Thumbnail-Service-on-Windows-Service-2008-R2/&quot;&gt;additional configuration if Thumbnail service is installed on Windows Server 2008 R2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;9. &lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-advanced-deployment-options#Aggregation_service_on_the_separate_server&quot;&gt;Install and configure Aggregation service on the back-end server&lt;/a&gt;. Please look at the &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Installing-Aggregation-Service-for-CMO-20/&quot;&gt;installation instructions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Point the Aggregation service to the CMO database that is used on the web sites.&lt;/p&gt;
&lt;p&gt;10. Consider &lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-components-and-simple-installation-scenario#After_installation_steps&quot;&gt;after-installation steps and notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Verify that &lt;span style=&quot;font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px;&quot;&gt;secretkey&lt;/span&gt; values in &lt;span style=&quot;font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px;&quot;&gt;appSettings&lt;/span&gt; section are equal in Thumbnail service configuration file and in web.config files on the site where CMO UI is installed.&lt;/p&gt;
&lt;p&gt;Verify Thumbnail service URL in CMO / Settings / Page Thumbnails section, make sure that Thumbnail service is available for CMO UI components on the editing server and that service can access web site and site resources to generate screenshots.&lt;/p&gt;
&lt;p&gt;Verify that Statistics handler URL in CMO / Settings / General section is valid and handler is accessible for public site visitors.&lt;/p&gt;
&lt;h2&gt;Licensing&lt;/h2&gt;
&lt;p&gt;Separate EPiServer CMO license is required on each site where CMO is installed.&lt;/p&gt;
&lt;h2&gt;Other deployment scenarios&lt;/h2&gt;
&lt;p&gt;Described deployment model can be changed depending on your environment and configuration. For example, you can consider installing Aggregation service on the editing server, if you don’t expect heavy loading on that machine. You can try to find better host for Thumbnail service in your network.&lt;/p&gt;
&lt;p&gt;Initial environment can be more complex. Load balancing can be applied to internal database servers or editing servers. These options will affect CMO deployment.&lt;/p&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;Please see the following blog posts and documents for more information:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-components-and-simple-installation-scenario&quot;&gt;EPiServer CMO components and simple installation scenario&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-advanced-deployment-options&quot;&gt;EPiServer CMO: advanced deployment options and manual component installation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-in-load-balancing-environment-simple-scenario&quot;&gt;EPiServer CMO in load balancing environment: simple scenario&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/techblog/page-thumbnails-in-episerver-cmo&quot;&gt;Page screenshots in EPiServer CMO and Thumbnail service configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://world.episerver.com/Documentation/Categories/Modules/EPiServer-CMO/&quot;&gt;EPiServer CMO documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Please feel free to let us know about your case and how how things work in your environment. Your feedback is highly appreciated.&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/episerver-cmo-in-load-balancing-environment-with-separate-editing-server</guid>            <pubDate>Sat, 28 Jan 2012 18:54:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>EPiServer CMO in load balancing environment: simple scenario</title>            <link>http://dmytroduk.com/techblog/episerver-cmo-in-load-balancing-environment-simple-scenario</link>            <description>&lt;p&gt;Load balancing is a clear choice for the most of popular sites with high volumes of incoming traffic. This solution allows distributing the load among several servers to improve performance and achieve high availability.&lt;/p&gt;
&lt;p&gt;This blog post describes а simple case of EPiServer CMO installation and configuration in the hosting environment where load balancing is applied to the web servers.&lt;/p&gt;
&lt;p&gt;Let’s consider the following deployment model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web site based on EPiServer CMS is installed on two or more front web servers. The site is available publicly through the load balancing system, which spreads the work between those servers.&lt;/li&gt;
&lt;li&gt;EPiServer CMS editor and admin UI is deployed on each web server and available through the load balancing system.&lt;/li&gt;
&lt;li&gt;There is one back-end server which contains one shared site database.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;The simplest deployment scenario for EPiServer CMO in this environment looks pretty similar to that one described in &lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-advanced-deployment-options&quot;&gt;the previous blog post&lt;/a&gt;, the difference is that now we have several front web servers.&lt;/p&gt;
&lt;p&gt;CMO Core, Statistics handler, web services and CMO UI are deployed on each front-end server. CMO database, Aggregation and Thumbnail services are installed on one back-end server, where CMS database is hosted. One CMO database is shared between all front-end servers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-in-the-load-balancing-envi_F1D4/CMOLoadBalancing_2.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; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-in-the-load-balancing-envi_F1D4/CMOLoadBalancing_thumb.png&quot; border=&quot;0&quot; alt=&quot;EPiServer CMO in the load balancing environment: simple scenario&quot; width=&quot;640&quot; height=&quot;648&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please see the steps required to install and configure EPiServer CMO below.&lt;/p&gt;
&lt;h2&gt;Installing EPiServer CMO in the load balancing environment&lt;/h2&gt;
&lt;p&gt;1. Install CMO on all web servers where the site is hosted using EPiServerCMO.msi installer.&lt;/p&gt;
&lt;p&gt;2. Deploy CMO on the site on the first web server using Deployment Center. Follow &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Installation-Instructions---EPiServer-CMO-2-R2/&quot;&gt;installation instructions.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Select Campaign Monitor and Optimization UI and Statistics Handler in optional components list to install:&lt;/p&gt;
&lt;p&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;EPiServerCMOFeaturesSelection&quot; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-in-the-load-balancing-envi_F1D4/EPiServerCMOFeaturesSelection_3.png&quot; border=&quot;0&quot; alt=&quot;EPiServerCMOFeaturesSelection&quot; width=&quot;544&quot; height=&quot;209&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Select or enter the name of SQL Server instance on your back-end server on database settings installation step. &lt;br /&gt;Enter the name of new CMO database to create.&lt;/p&gt;
&lt;p&gt;3. Deploy CMO on the site on other web servers.&lt;/p&gt;
&lt;p&gt;Select the same optional components to install: Campaign Monitor and Optimization UI and Statistics Handler.&lt;/p&gt;
&lt;p&gt;Choose SQL Server instance on your back-end server on database settings installation step.&lt;/p&gt;
&lt;p&gt;Don’t create new database this time, select existing CMO database that was created on the previous steps.&lt;/p&gt;
&lt;p&gt;4. &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Configuring-CMO-2-R2-to-support-NET-40/&quot;&gt;Update configuration of sites where CMO was installed to support .NET 4&lt;/a&gt; if it is required.&lt;/p&gt;
&lt;p&gt;5. &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Configuring-Live-Monitor-for-Multiple-Bindings-in-EPiServer-CMO-20/&quot;&gt;Configure CMO Live Monitor for multiple bindings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;6. &lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-advanced-deployment-options#Thumbnail_service_on_the_separate_server&quot;&gt;Install and configure Thumbnail Service on back-end server manually&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thumbnail service should be able to access the site through the load balancing system and all site resources that are required to create page screenshots. Make sure that Thumbnail service can be accessed from all web servers where CMO UI is installed.&lt;/p&gt;
&lt;p&gt;Consider &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-20/Configuring-the-Thumbnail-Service-on-Windows-Service-2008-R2/&quot;&gt;additional configuration&lt;/a&gt; if service is installed on Windows Server 2008 R2. Please see &lt;a href=&quot;http://dmytroduk.com/techblog/page-thumbnails-in-episerver-cmo&quot;&gt;this blog post&lt;/a&gt; for more information about Thumbnail service.&lt;/p&gt;
&lt;p&gt;7. &lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-advanced-deployment-options#Aggregation_service_on_the_separate_server&quot;&gt;Install and configure Aggregation service on back-end server manually&lt;/a&gt;. You can find installation instructions &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Installing-Aggregation-Service-for-CMO-20/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Point Aggregation service to the CMO database that is used on the web sites.&lt;/p&gt;
&lt;p&gt;8. Consider &lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-components-and-simple-installation-scenario#After_installation_steps&quot;&gt;after-installation steps and notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;9. Make sure that load balancing is configured to use sticky sessions, it is required by CMO UI.&lt;/p&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;Please see the following blog posts and documents for more information:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-components-and-simple-installation-scenario&quot;&gt;EPiServer CMO components and simple installation scenario&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-advanced-deployment-options&quot;&gt;EPiServer CMO: advanced deployment options and manual component installation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/techblog/page-thumbnails-in-episerver-cmo&quot;&gt;Page screenshots in EPiServer CMO and Thumbnail service configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://world.episerver.com/Documentation/Categories/Modules/EPiServer-CMO/&quot;&gt;EPiServer CMO documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Your feedback is highly appreciated. Please let me know how it works in your case.&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/episerver-cmo-in-load-balancing-environment-simple-scenario</guid>            <pubDate>Tue, 17 Jan 2012 17:48:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>EPiServer CMO: advanced deployment options</title>            <link>http://dmytroduk.com/techblog/episerver-cmo-advanced-deployment-options</link>            <description>&lt;p&gt;This blog post describes several options for advanced EPiServer CMO deployment.&lt;/p&gt;
&lt;p&gt;You may have more than one server, for example when site database is hosted on the separate back-end machine. You can consider the following options to distribute the work across servers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CMO database on the separate server&lt;/strong&gt;. It sounds logically to keep CMO database on the same server as site data. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggregation service on the separate server&lt;/strong&gt;. Most likely your database server could be a good host for it. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thumbnail service on the separate server&lt;/strong&gt;. There are 2 important requirements: Thumbnail service should be able to access web sites to make screenshots; and CMO UI should be able to access Thumbnail service to request page screenshots for reports. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standalone Statistics Handler&lt;/strong&gt;. All pages from any active CMO campaign contain script injection to collect visitor’s statistics. This data is sent to CMO Statistics handler which is installed on site by default. It is possible to host Statistics Handler in standalone web application and on the separate server, if you want to process incoming visitors statistics separately and don’t load the main front server with that. However, this option is not really interesting. The thing is that standalone Statistics Handler should be publicly available, so it should be deployed on some of the front servers. If you have several front servers, you will probably configure load balancing for them. In this case the idea to host standalone Statistics handler doesn’t sound very practical.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having one front-end web server and one back-end database server, you probably end up with the following deployment model.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-advanced-deployment-option_F403/CMOAdvancedDeployment_2.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; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-advanced-deployment-option_F403/CMOAdvancedDeployment_thumb.png&quot; border=&quot;0&quot; alt=&quot;EPiServer CMO deployed on 2 servers&quot; width=&quot;640&quot; height=&quot;291&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can find information on how to implement each option below. EPiServer CMO 2 R2 does not provide separate installer for services. Aggregation and Thumbnail services can be installed and configured automatically when you install CMO on specific web site, but these services have to be installed manually on back-end server.&lt;/p&gt;
&lt;h3&gt;CMO database on the separate server&lt;/h3&gt;
&lt;p&gt;It’s easy. During installation you can create CMO data on local or remote machine, so you can just define your back-end server on “Database settings” step when you install EPiServer CMO on web site using Deployment Center.&lt;/p&gt;
&lt;h3&gt;Aggregation service on the separate server&lt;/h3&gt;
&lt;p&gt;Uncheck “Aggregation Service” option when you are installing CMO on web site using Deployment Center. Service will not be installed on your front server, but you can find service binaries in CMO installation directory: C:\Program Files (x86)\EPiServer\EPiServer\CMS\6.1.379.0\Install\Modules\CMO2.1.0.93\bin&lt;/p&gt;
&lt;p&gt;You will need to install and configure CMO Aggregation service manually on back-end machine. Service installation and configuration are described in &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Installing-Aggregation-Service-for-CMO-20/&quot;&gt;this document&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Thumbnail service on the separate server&lt;/h3&gt;
&lt;p&gt;Thumbnail service doesn’t depend on other CMO parts and can be installed anywhere. Moreover, the one service can generate page screenshots for several web sites.&lt;/p&gt;
&lt;p&gt;Uncheck “Thumbnail service” option when you are installing CMO on web site using Deployment Center. Thumbnail service will not be installed on front server; binaries can be found in CMO installation folder, by default it is C:\Program Files (x86)\EPiServer\CMS\6.1.379.0\Install\Modules\CMO2.1.0.93\Thumbnail Service\&lt;/p&gt;
&lt;p&gt;Just copy that folder to another machine and install it as Windows service using installutil.exe.&lt;/p&gt;
&lt;p&gt;Make sure that Thumbnail service can access web sites and site resources to generate screenshots. Service should be accessible for all CMO instances that are going to use it to show thumbnails in reports.&lt;/p&gt;
&lt;p&gt;Secret key value in appSettings section must be equal in service configuration file and in web.config files on all sites.&lt;/p&gt;
&lt;p&gt;Define new Thumbnail service URL in CMO Settings:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-advanced-deployment-option_F403/CMOSettings_ThumbnailServiceUrl_2.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; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-advanced-deployment-option_F403/CMOSettings_ThumbnailServiceUrl_thumb.png&quot; border=&quot;0&quot; alt=&quot;CMO Settings: Thumbnail service URL&quot; width=&quot;444&quot; height=&quot;162&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Standalone Statistics Handler&lt;/h3&gt;
&lt;p&gt;Uncheck “Statistics Handler” option when you are installing CMO on web site using Deployment Center.&lt;/p&gt;
&lt;p&gt;Use &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Configuring-the-Statistics-Handler-in-EPiServer-CMO-20/&quot;&gt;this document&lt;/a&gt; to install and configure CMO Statistics handler as standalone application.&lt;/p&gt;
&lt;p&gt;Make sure that CMO Statistics handler is publicly available and can receive data from site visitors.&lt;/p&gt;
&lt;p&gt;Don’t forget to define new Statistics handler URL in CMO Settings:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-advanced-deployment-option_F403/CMOSettings_StatisticsHandlerUrl_2.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; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/EPiServer-CMO-advanced-deployment-option_F403/CMOSettings_StatisticsHandlerUrl_thumb.png&quot; border=&quot;0&quot; alt=&quot;CMO Settings: Statistics handler URL&quot; width=&quot;444&quot; height=&quot;253&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;p&gt;Please see the &lt;a href=&quot;http://dmytroduk.com/techblog/episerver-cmo-components-and-simple-installation-scenario&quot;&gt;first blog post in this series&lt;/a&gt; for more information about CMO components, simple deployment model and after installation steps.&lt;/p&gt;</description>            <guid>http://dmytroduk.com/techblog/episerver-cmo-advanced-deployment-options</guid>            <pubDate>Wed, 21 Dec 2011 17:37:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>EPiServer CMO components and simple installation scenario</title>            <link>http://dmytroduk.com/techblog/episerver-cmo-components-and-simple-installation-scenario</link>            <description>&lt;p&gt;Running EPiServerCMO.msi you get CMO installed to EPiServer CMS module folder, by default it is C:\Program Files (x86)\EPiServer\CMS\6.1.379.0\Install\Modules\CMO2.1.0.93. Now it can be installed on specific web site using Deployment Center.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Installation-Instructions---EPiServer-CMO-2-R2/&quot;&gt;Installation instructions for EPiServer CMO 2 R2&lt;/a&gt; pretty good describe simple deployment model with the one front server. By default all CMO components are deployed on the same machine and you get the following deployment schema:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/9e530a28ff8b_D818/CMOSimpleDeployment_2.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; src=&quot;http://dmytroduk.com/Media/Default/Windows-Live-Writer/9e530a28ff8b_D818/CMOSimpleDeployment_thumb.png&quot; border=&quot;0&quot; alt=&quot;EPiServer CMO: simple deployment schema&quot; width=&quot;614&quot; height=&quot;294&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bellow are described main EPiServer CMO components to make this chart clearer.&lt;/p&gt;
&lt;h2&gt;EPiServer CMO components&lt;/h2&gt;
&lt;p&gt;It’s worth mentioning that it’s not about assemblies. Components are EPiServer CMO parts that communicates and cooperates with each other, these parts can be separated logically or/and by deployment.&lt;/p&gt;
&lt;h4&gt;CMO Core&lt;/h4&gt;
&lt;p&gt;Core is the heart of EPiServer CMO, all other parts depend on it. This is the central component that contains core logic for collecting and processing data.&lt;/p&gt;
&lt;h4&gt;CMO Statistics Handler&lt;/h4&gt;
&lt;p&gt;This component receives and processes raw visitor’s statistics and KPI data coming from client browsers.&lt;/p&gt;
&lt;h4&gt;CMO Web services&lt;/h4&gt;
&lt;p&gt;Currently CMO provides one web service that can be used by third party applications to update KPI values.&lt;/p&gt;
&lt;h4&gt;CMO Database&lt;/h4&gt;
&lt;p&gt;This is storage for EPiServer CMO data. By default it is separate database, but it is possible to create CMO data structures in the existing one.&lt;/p&gt;
&lt;h4&gt;CMO Aggregation Service&lt;/h4&gt;
&lt;p&gt;This is Windows service application responsible for data pre-calculation and aggregation. It allows to decrease database size and generate reports faster. The one Aggregation Service is able to process data from different CMO versions and can serve the number of CMO instances deployed on several sites.&lt;/p&gt;
&lt;h4&gt;CMO Thumbnail Service&lt;/h4&gt;
&lt;p&gt;This is Windows service application, which creates screenshots of site pages and provides thumbnails for reports. Check out &lt;a href=&quot;http://dmytroduk.com/techblog/page-thumbnails-in-episerver-cmo&quot;&gt;this blog post&lt;/a&gt; for more information about CMO Thumbnail service.&lt;/p&gt;
&lt;h4&gt;CMO UI&lt;/h4&gt;
&lt;p&gt;CMO UI is user interface available for CMO administrators and users to manage LPO tests and campaigns, view reports, monitor statistics and configure settings.&lt;/p&gt;
&lt;p&gt;CMO UI pages and resources are not copied on site during installation; it is connected via virtual path provider in the same way as CMS Edit/Admin UI.&lt;/p&gt;
&lt;h2&gt;After installation steps&lt;/h2&gt;
&lt;p&gt;Depending on your environment you may have to complete these additional steps after installation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you are going to run web site on .NET 4, please see &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Configuring-CMO-2-R2-to-support-NET-40/&quot;&gt;Configuring EPiServer CMO 2 R2 to Support .NET 4.0&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-2-R2/Configuring-Live-Monitor-for-Multiple-Bindings-in-EPiServer-CMO-20/&quot;&gt;Configure CMO Live Monitor for multiple bindings&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;CMO Thumbnail service requires &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Installation-Instructions/EPiServer-CMO/CMO-20/Configuring-the-Thumbnail-Service-on-Windows-Service-2008-R2/&quot;&gt;additional configuration&lt;/a&gt; if it is installed on Windows Server 2008 R2 &lt;/li&gt;
&lt;li&gt;Check access permissions in CMO Settings / Security page. By default only users in Administrators, WebAdmins or WebEditors roles have access to CMO UI and can manage the module.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Notes and tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Friendly URL Rewriter module is required on site. CMO uses Friendly URL Rewriter events to inject scripts that collect visitor’s statistics. &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/link/4f2cc66c0bb641fcb1455831be3e0a42.aspx&quot;&gt;View State must be enabled at least for CMO location&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;If you face the exception related to ComponentArt stuff, try IIS reset.&lt;/li&gt;
&lt;/ul&gt;</description>            <guid>http://dmytroduk.com/techblog/episerver-cmo-components-and-simple-installation-scenario</guid>            <pubDate>Mon, 19 Dec 2011 16:48:00 GMT</pubDate>           <category>Blog post</category></item><item> <title>Solving issue &quot;405.0 - Method Not Allowed&quot; when accessing WebDAV folder</title>            <link>https://world.optimizely.com/blogs/Dmytro-Duk/Dates/2011/10/Solving-issue-4050---Method-Not-Allowed-when-accessing-WebDAV-folder/</link>            <description>&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using EPiServer WebDAV you can face the following issue: after &lt;a href=&quot;http://world.episerver.com/Documentation/Items/Tech-Notes/EPiServer-CMS-6/EPiServer-CMS-60/WebDAV/&quot;&gt;setting up WebDAV in EPiServer CMS and client configuration&lt;/a&gt; you still cannot access your web folder. Depending on client software you can get different error messages. Windows explorer says that it could not access your resource and suggests to check name spelling. Other clients return errors “Login failed” or something like “Directory listing denied”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Investigating&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To get more details you can enable server side logging for EPiServer WebDAV:&lt;/p&gt;
&lt;div id=&quot;codeSnippetWrapper&quot; style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xml&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;1.0&quot;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;utf-8&quot;&lt;/span&gt;?&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;log4net&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;appender&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;OutputDebugStringAppender&quot;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;log4net.Appender.OutputDebugStringAppender&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;layout&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;log4net.Layout.PatternLayout&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;conversionPattern&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;%date [%thread] %-5level %type.%method - %message%newline&quot;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;layout&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;appender&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;logger&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;EPiServer.WebDav&quot;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;additivity&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;level&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Debug&quot;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;appender-ref&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;ref&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;OutputDebugStringAppender&quot;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;logger&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;log4net&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://www.davexplorer.org&quot;&gt;DAV Explorer&lt;/a&gt; can be used to get detailed log with all sent and received messages on client side.&lt;/p&gt;
&lt;p&gt;In my case it turned out that EPiServer.WebDAV.Handler was processing only first OPTIONS requests.&lt;/p&gt;
&lt;p&gt;Second request PROPFIND didn’t reach our handler. In respond to PROPFIND client got “405 Method Not Allowed” response from module named WebDAVModule. And this was the cause of the problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;WebDAVModule intercepts WebDAV requests so they are not processed by EPiServer.WebDAV handler. Most likely it is not registered in your site config file. You can find it in Modules list for your web site in IIS Manager.    &lt;br /&gt;&lt;a href=&quot;/link/910fc9357b3844439d3fb1021539e0ed.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;WebDAVModuleInIIS&quot; src=&quot;/link/9d82d210c9a24545b51ad4bec126253c.png&quot; border=&quot;0&quot; alt=&quot;WebDAVModuleInIIS&quot; width=&quot;353&quot; height=&quot;232&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is native IIS module, on my IIS it is enabled by default on each new web site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remove native WebDAVModule module if you don’t use it:&lt;/p&gt;
&lt;div id=&quot;codeSnippetWrapper&quot; style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: silver 1px solid; padding: 4px;&quot;&gt;
&lt;div id=&quot;codeSnippet&quot; style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;system.webServer&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;modules&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;      &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;remove&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;WebDAVModule&quot;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;modules&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;system.webServer&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style=&quot;text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After this EPiServer.WebDAV.Handler should be able to process all corresponding requests. WebDAV configuration guide is updated with this information.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/Dmytro-Duk/Dates/2011/10/Solving-issue-4050---Method-Not-Allowed-when-accessing-WebDAV-folder/</guid>            <pubDate>Mon, 24 Oct 2011 17:00:00 GMT</pubDate>           <category>Blog post</category></item></channel>
</rss>