<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Blog posts by Shamrez Iqbal</title><link href="http://world.optimizely.com" /><updated>2014-12-18T20:17:31.0000000Z</updated><id>https://world.optimizely.com/blogs/Shamrez-Iqbal/</id> <generator uri="http://world.optimizely.com" version="2.0">Optimizely World</generator> <entry><title>Adding StartPublishDate to PageTree tooltip</title><link href="https://world.optimizely.com/blogs/Shamrez-Iqbal/Dates/2014/12/adding-startpublishdate-to-pagetree-tooltip/" /><id>&lt;p&gt;In my previous blog post I demonstrated how to customize the tooltip, but it turned out we needed to add the StartPublishDate property to the Tooltip, and it turned out that the item object in the javascript file did not contain this property, so time for some more hunting. &lt;/p&gt;  &lt;p&gt;episerver/cms/Stores/contentstructure/This time I started out in the network tab of F12 showing only XHRs. Looking at the different requests I noticed most of them looked very similar so I had to dig through the contents until I found a call containing PageData and I eventually I found one.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/link/9d4bfd4a9f924311830d9d6759a909ce.aspx&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/d5bd441a8a164ca98108012ef3260ef0.aspx&quot; width=&quot;770&quot; height=&quot;330&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Looking at the URL the data came from something called /Stores/contentstructure/ which ContentStructureStore is handling - which inherits from RestController. &lt;/p&gt;  &lt;p&gt;A new customization point was needed. Looking at how this REST-controller retrieved data I noticed that the data was is converted into Model objects using something called ContentStoreModelCreator. &lt;/p&gt;  &lt;p&gt;The ContentStoreModelCreator has a constructor which takes an enumerable of IModelTransform. This looked like a promising extension point, searching for implementers of this store I found PopulatePageDataModel. As in the previous post, I created a class inheriting from this class. &lt;/p&gt;  &lt;p&gt;What PopulatePageDataModel basically does is, it has an array of property names in an array, and tries using the weakly-typed way of retrieving this data. My class added the “PageStartPublish” to the array, and modified the TransformInstance method to use my collection instead. &lt;/p&gt;    &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;   public class MyPopulatePageDataModel : PopulatePageDataModel
    {
        private static readonly string[] PropertyNames = new string[]
    {
      &amp;quot;PageLanguageBranch&amp;quot;,
      &amp;quot;PageExternalURL&amp;quot;,
      &amp;quot;PageChildOrderRule&amp;quot;,
      &amp;quot;PageSaved&amp;quot;,
      &amp;quot;PageChangedBy&amp;quot;,
      &amp;quot;PageCreated&amp;quot;,
      &amp;quot;PageChanged&amp;quot;,
      &amp;quot;PageTypeID&amp;quot;,
      &amp;quot;PageVisibleInMenu&amp;quot;,
      &amp;quot;PageShortcutType&amp;quot;,
      &amp;quot;PageShortcutLink&amp;quot;,
      &amp;quot;PageLinkURL&amp;quot;,
      &amp;quot;PageStartPublish&amp;quot;
    };
        public override void TransformInstance(EPiServer.Core.IContent source, EPiServer.Cms.Shell.UI.Rest.Models.StructureStoreContentDataModel target, IModelTransformContext context)
        {
            PropertyDictionary properties = target.Properties;
            IContent content = source;
            foreach (string key in PropertyNames)
            {
                PropertyData propertyData = content.Property[key];
                if (propertyData != null)
                    properties.Add(key, propertyData.Value);
            }
        }
    }&lt;/code&gt;&lt;/pre&gt;
The next step was to Intercept it in IOC, but the PopulatePageDataModel is marked as a singleton so instead of saying InterceptWith(i=&amp;gt;new CustomPopulatePageDataModel()) the object is created once in the module and its called with InterceptWith(i=&amp;gt;MyCustomPopulatePageDataModel); 



&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;  private static void ConfigureContainer(ConfigurationExpression container)
        {
            MyPopulatePageDataModel model = new MyPopulatePageDataModel();
            
            container.IfTypeMatches(type =&amp;gt; type.Equals(typeof(PopulatePageDataModel))).InterceptWith(i =&amp;gt; model);

           
            
            //Implementations for custom interfaces can be registered here.
        }&lt;/code&gt;&lt;/pre&gt;
There are better ways of implementing a singleton but for the sake of demo I did it in the module, it’s possible that it might be possible to define it some other way in StructureMap as well. Now, when looking at the javascript-object being sent to the getItemToolTip we can see that the PageStartPublish is available and can be added to the tooltip. &lt;a href=&quot;/link/9be576fd26e74380b53a997c1c874917.aspx&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;/link/79e5c0684d664e7eb72918860f16abee.aspx&quot; width=&quot;670&quot; height=&quot;378&quot; /&gt;&lt;/a&gt;</id><updated>2014-12-18T20:17:31.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Changing the tooltip in the Page Tree</title><link href="https://world.optimizely.com/blogs/Shamrez-Iqbal/Dates/2014/12/changing-the-tooltip-in-the-page-tree/" /><id>&lt;p&gt;A customer wanted to show some more data in the page tree tooltip. This obviously meant extending the user interface in some way, but the first step was to figure out where the tooltip was set.&lt;/p&gt;  &lt;h1&gt;Where Are You being made?&lt;/h1&gt;  &lt;p&gt;We started digging in using the F12 tools in Chrome to figure out the where the tooltip was generated.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/link/4ff2c928347f4372b8d3b004f036e5ea.aspx&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;background-image: none; display: inline&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;/link/d3fdd9fb125645e0972daaae90d18f2a.aspx&quot; width=&quot;244&quot; height=&quot;56&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We started by unpacking the clientresources archives and searched for the attach-points in the markup, such as “rowNode” but the files were minified so it was a hopeless task – and we got many matches.&lt;/p&gt;  &lt;p&gt;After looking at a page here on World, it turned out that there was a nuget package with the unminified debug version javascript files. After installing this package the they could be enabled by changing web.config the following way:&lt;/p&gt;  &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;episerver.framework&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clientResources&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;
.
.
.
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;episerver.framework&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, &quot;Courier New&quot;, courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } &lt;/style&gt;

&lt;p&gt;An interesting thing was that this seems to work regardless of installing the nuget package.&lt;/p&gt;

&lt;p&gt;Things got slightly easier and we eventually figured out that the tooltip was being set in &lt;/p&gt;

&lt;p&gt;\epi-cms\component\PageNavigationTree.js &lt;/p&gt;

&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt; getTooltip: &lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt; (item) {
            &lt;span class=&quot;rem&quot;&gt;// summary:&lt;/span&gt;
            &lt;span class=&quot;rem&quot;&gt;//        Overridden function to select data for the tooltip&lt;/span&gt;
            &lt;span class=&quot;rem&quot;&gt;// tags:&lt;/span&gt;
            &lt;span class=&quot;rem&quot;&gt;//        public, extension&lt;/span&gt;

            &lt;span class=&quot;rem&quot;&gt;//We create a content reference and use the id to hide the provider key for the user.&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; reference = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ContentReference(item.contentLink),
                baseTooltip = &lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;.inherited(arguments);
            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; baseTooltip + &lt;span class=&quot;str&quot;&gt;&amp;quot;, &amp;quot;&lt;/span&gt; + headingResources.id + &lt;span class=&quot;str&quot;&gt;&amp;quot;: &amp;quot;&lt;/span&gt; + reference.id +
                &lt;span class=&quot;str&quot;&gt;&amp;quot; (&amp;quot;&lt;/span&gt; + headingResources.type + &lt;span class=&quot;str&quot;&gt;&amp;quot;: &amp;quot;&lt;/span&gt; + item.contentTypeName + &lt;span class=&quot;str&quot;&gt;&amp;quot;)&amp;quot;&lt;/span&gt;;
        },&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;Where can we fix you?&lt;/h1&gt;

&lt;p&gt;The next task was figuring out how to change this, &lt;/p&gt;

&lt;p&gt;One way to fix it would be to modify the js directly in the zip but that change would be lost the minute a new nuget package was available – which meant about 2 weeks.&lt;/p&gt;

&lt;p&gt;An extension point was needed, and after lots more digging we found one &lt;/p&gt;

&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;.contentRepositoryDescriptors = &lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;.contentRepositoryDescriptors || dependency.resolve(&lt;span class=&quot;str&quot;&gt;&amp;quot;epi.cms.contentRepositoryDescriptors&amp;quot;&lt;/span&gt;);
var settings = &lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;.contentRepositoryDescriptors[&lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;.repositoryKey];

var componentType = settings.customNavigationWidget || &lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/component/ContentNavigationTree&amp;quot;&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, &quot;Courier New&quot;, courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } &lt;/style&gt;

&lt;p&gt;Using F12 debugging we figured out the values in settings-object which came from a a contentRepositoryDescriptor&lt;/p&gt;

&lt;p&gt;the RepositoryKey was set to “pages”, and the extensionpoint would be settings.customNavigationWidget.&lt;/p&gt;

&lt;p&gt;Now, the hard part was to figure out how to set the customNavigationWidget, we looked at creating Components, ContentDescriptors, ContentRepositories and eventually found a class called PageRepositoryDescriptor which was where the settings-data came from. &lt;/p&gt;

&lt;h1&gt;How can we fix you?&lt;/h1&gt;

&lt;p&gt;There are four classes which inherit from ContentRepositoryDescriptorBase and they are all registered in StructureMap using the ServiceConfiguration-attribute. And they are exposed as an enumerable. 
  &lt;br /&gt;We started by adding our own class which inherited PageRepositoryDescriptor and changed the customNavigationWidget setting&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; OurDescriptor : PageRepositoryDescriptor
    {

        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; CustomNavigationWidget
        {
            get
            {
                &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&amp;quot;alloy/widget/foo&amp;quot;&lt;/span&gt;;
            }
        }
        
    }&lt;/code&gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;We tried adding the serviceconfiguration attribute to this but this broke the application because the Key-property wasn’t unique so what we instead wanted the container to do was to provide our implementation each time PageRepositoryDescriptor was requested.&lt;/p&gt;

&lt;p&gt;This was achieved by creating a configurationModule&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;[InitializableModule]

[ModuleDependency(&lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(EPiServer.Web.InitializationModule))]

&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; DescriptorInitialization : IConfigurableModule

{

&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; ConfigureContainer(ServiceConfigurationContext context)

{

context.Container.Configure(ConfigureContainer);

}

&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; ConfigureContainer(ConfigurationExpression container)

{

container.IfTypeMatches(type =&amp;gt; type.Equals(&lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(PageRepositoryDescriptor))).InterceptWith(i =&amp;gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; OurDescriptor ());

}

}&lt;/code&gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Building and testing this was a success and there was a request to alloy/widget/foo which we now had to implement.&lt;/p&gt;

&lt;p&gt;The following lines were added to modules.config&lt;/p&gt;

&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clientResources&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;alloy.widget.foo&amp;quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;Scripts/foo.js&amp;quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;resourceType&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;Script&amp;quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;

&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clientResources&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;And finally a the javascript file called foo.js &lt;/p&gt;

&lt;p&gt;We started with a copy and paste of the existing ContentNavigationTree, but all methods except the tooltip method was removed, the define function was changed, and ContentNavigationTree was added as a dependency and provided as the base class for this component (first parameter in declare(..) ) &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;define(&lt;span class=&quot;str&quot;&gt;&amp;quot;alloy/widget/foo&amp;quot;&lt;/span&gt;, [

&lt;span class=&quot;rem&quot;&gt;// dojo&lt;/span&gt;

&lt;span class=&quot;str&quot;&gt;&amp;quot;dojo/_base/array&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;dojo/_base/connect&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;dojo/_base/declare&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;dojo/_base/lang&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;dojo/dom-class&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;dojo/topic&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;dojo/when&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;rem&quot;&gt;// epi&lt;/span&gt;

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/dependency&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/string&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/shell/ClipboardManager&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/shell/command/_WidgetCommandProviderMixin&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/shell/selection&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/shell/TypeDescriptorManager&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/shell/widget/dialog/Alert&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/shell/widget/dialog/Confirmation&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/_ContentContextMixin&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/_MultilingualMixin&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/ApplicationSettings&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/contentediting/PageShortcutTypeSupport&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/command/ShowAllLanguages&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/component/_ContentNavigationTreeNode&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/component/ContentContextMenuCommandProvider&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/contentediting/ContentActionSupport&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/core/ContentReference&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/widget/ContentTree&amp;quot;&lt;/span&gt;,

&lt;strong&gt;&lt;u&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;epi-cms/component/ContentNavigationTree&amp;quot;&lt;/span&gt;,&lt;/u&gt;&lt;/strong&gt;

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/shell/widget/ContextMenu&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;rem&quot;&gt;// resources&lt;/span&gt;

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/i18n!epi/cms/nls/episerver.cms.components.createpage&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/i18n!epi/cms/nls/episerver.cms.components.pagetree&amp;quot;&lt;/span&gt;,

&lt;span class=&quot;str&quot;&gt;&amp;quot;epi/i18n!epi/cms/nls/episerver.shared.header&amp;quot;&lt;/span&gt;

],

&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt; (

&lt;span class=&quot;rem&quot;&gt;// dojo&lt;/span&gt;

array,

connect,

declare,

lang,

domClass,

topic,

when,

&lt;span class=&quot;rem&quot;&gt;// epi&lt;/span&gt;

dependency,

epistring,

ClipboardManager,

_WidgetCommandProviderMixin,

Selection,

TypeDescriptorManager,

Alert,

Confirmation,

_ContentContextMixin,

_MultilingualMixin,

ApplicationSettings,

PageShortcutTypeSupport,

ShowAllLanguagesCommand,

_ContentNavigationTreeNode,

ContextMenuCommandProvider,

ContentActionSupport,

ContentReference,

ContentTree,

&lt;strong&gt;&lt;u&gt;connavtree&lt;/u&gt;&lt;/strong&gt;,

ContextMenu,

&lt;span class=&quot;rem&quot;&gt;// resources&lt;/span&gt;

resCreatePage,

res,

headingResources

) {

&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; declare([&lt;u&gt;&lt;strong&gt;connavtree&lt;/strong&gt;&lt;/u&gt;], {

&lt;span class=&quot;rem&quot;&gt;// summary:&lt;/span&gt;

&lt;span class=&quot;rem&quot;&gt;// Light weight Page tree component.&lt;/span&gt;

&lt;span class=&quot;rem&quot;&gt;// description:&lt;/span&gt;

&lt;span class=&quot;rem&quot;&gt;// Extends epi.cms.widget.PageTree to provide global messaging capability.&lt;/span&gt;

&lt;span class=&quot;rem&quot;&gt;// tags:&lt;/span&gt;

&lt;span class=&quot;rem&quot;&gt;// internal xproduct&lt;/span&gt;

getTooltip: &lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt; (item) {

&lt;span class=&quot;rem&quot;&gt;// summary:&lt;/span&gt;

&lt;span class=&quot;rem&quot;&gt;// Overridden function to select data for the tooltip&lt;/span&gt;

&lt;span class=&quot;rem&quot;&gt;// tags:&lt;/span&gt;

&lt;span class=&quot;rem&quot;&gt;// public, extension&lt;/span&gt;

&lt;span class=&quot;rem&quot;&gt;//We create a content reference and use the id to hide the provider key for the user.&lt;/span&gt;

&lt;span class=&quot;kwrd&quot;&gt;var&lt;/span&gt; reference = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ContentReference(item.contentLink),

baseTooltip = &lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;.inherited(arguments);

&lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; baseTooltip + &lt;span class=&quot;str&quot;&gt;&amp;quot;, &amp;quot;&lt;/span&gt; + headingResources.id + &lt;span class=&quot;str&quot;&gt;&amp;quot;: &amp;quot;&lt;/span&gt; + reference.id +

&lt;span class=&quot;str&quot;&gt;&amp;quot; (&amp;quot;&lt;/span&gt; + headingResources.type + &lt;span class=&quot;str&quot;&gt;&amp;quot;: &amp;quot;&lt;/span&gt; + item.contentTypeName + &lt;span class=&quot;str&quot;&gt;&amp;quot;)&amp;quot;&lt;/span&gt; + &lt;strong&gt;&lt;u&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;Changed: &amp;quot;&lt;/span&gt; + item.changed;&lt;/u&gt;&lt;/strong&gt;

}

});

});&lt;/code&gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;And now the tooltip shows the changed date of the page as well.&lt;/p&gt;</id><updated>2014-12-16T11:04:53.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Updated content not showing in browsers</title><link href="https://world.optimizely.com/blogs/Shamrez-Iqbal/Dates/2013/11/Updated-content-not-showing-in-browsers/" /><id>&lt;h3&gt;Why isn’t the page updated &lt;/h3&gt;  &lt;p&gt;This is a question I’ve got from editors from time to time and usually the answer has been try Ctrl-R or Ctrl-F5 in the browser and see if that helps, which usually does the trick but one cannot expect all visitors of a web page to do this in order to see updated content.&lt;/p&gt;  &lt;p&gt;The problem&lt;/p&gt;  &lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;StyleSheet.css&amp;quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;site.js&amp;quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&amp;lt;script type=&lt;span class=&quot;str&quot;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;
    $(&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt; () {
        bar(); &lt;span class=&quot;rem&quot;&gt;// from site.js&lt;/span&gt;
    });

&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;form&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
            Text with class foo
        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;EPiServer:Property&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;runat&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;PropertyName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;vppimage&amp;quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;EPiServer:Property&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;/image.jpg&amp;quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, &quot;Courier New&quot;, courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } &lt;/style&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, &quot;Courier New&quot;, courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } &lt;/style&gt;

&lt;p&gt;Which renders something like this in a browser and all is well&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/link/b18b5ecf128c466a94c6fd59cef9931b.png&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;/link/0525a3cf0ef14c0f9f68bbe9083c6d1c.png&quot; width=&quot;343&quot; height=&quot;254&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And looking in fiddler for the requests being made first time the page is visited&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/link/b86e844853494cccb5c340cd5892939e.jpg&quot;&gt;&lt;img title=&quot;clip_image004&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;clip_image004&quot; src=&quot;/link/ff1c7a0278cc4c009392998b654983da.jpg&quot; width=&quot;551&quot; height=&quot;84&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The green colored requests are fired first time, while the red request is if click in the address bar and press enter and the blue request is after closing the browser, and pasting in the address to the page and opening it again. Note that neither the blue or red requests retrieve the js,css or vpp file again since the initial requests ensured that the content is cached on the browser.&lt;/p&gt;

&lt;p&gt;Now we have four assets on the page, an image a stylesheet, a javascript and an image stored in VPP.&lt;/p&gt;

&lt;p&gt;Let’s see what happens when we update all four of them.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/link/582ea7242d3f4a84abb3eb67ec2ba26b.png&quot;&gt;&lt;img title=&quot;clip_image005&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;clip_image005&quot; src=&quot;/link/9ec37d65c5a948528fc98f58e24125e2.png&quot; width=&quot;403&quot; height=&quot;350&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The script fires with an alert, with the text ‘hello v4’, but neither the image nor the text styling is updated&lt;/p&gt;

&lt;p&gt;Again looking in fiddler the orange request is the only one fired.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/link/ce746f95265d48a8aa07f94f77ae88ad.jpg&quot;&gt;&lt;img title=&quot;clip_image007&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;clip_image007&quot; src=&quot;/link/4337d7c936d44eeaad6b492ae1d5121a.jpg&quot; width=&quot;443&quot; height=&quot;28&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If however ctrl-R (reload) is pressed in Firefox everything is updated&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/link/04a57b75be8e4d7bb96f0a67a0048ab8.png&quot;&gt;&lt;img title=&quot;clip_image008&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;clip_image008&quot; src=&quot;/link/aeb1876ae2e54390877297efcaad118e.png&quot; width=&quot;364&quot; height=&quot;319&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This might be fine for certain situations but there are times when this doesn’t seem to be an option, so we can either ask the visitor/editor to wait 24 hours for the content to expired from the cache or ask them and the visitors to press reload after visiting the page.&lt;/p&gt;

&lt;h3&gt;What is causing the problem&lt;/h3&gt;

&lt;p&gt;The reason for this happening is that the server is saying that the content can be cached for a certain amount of time – and that is about it – the browser is not receiving any further instructions and will not care until the cache has expired.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/link/7380f858cb454719869d997ba1168cb5.png&quot;&gt;&lt;img title=&quot;clip_image009&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;clip_image009&quot; src=&quot;/link/e30fd36b02d1402984d89f753bdcb612.png&quot; width=&quot;356&quot; height=&quot;283&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;The solution&lt;/h3&gt;

&lt;p&gt;Disclaimer: this might not be the best or correct solution but it seems to work. &lt;/p&gt;

&lt;p&gt;What we need to do is tell the browser to always check that its local cache is valid. In web.config one has to add cacheControlCustom=&amp;quot;no-cache,must-revalidate&amp;quot;&lt;/p&gt;



&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;staticContent&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clientCache&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;cacheControlMode&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;UseMaxAge&amp;quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;cacheControlMaxAge&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;1.00:00:00&amp;quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;cacheControlCustom&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&amp;quot;no-cache,must-revalidate&amp;quot;&lt;/span&gt;  &lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;clientCache&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;staticContent&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, &quot;Courier New&quot;, courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } &lt;/style&gt;

&lt;p&gt;What this ensures is that the server will tell the browser that it must validate its cache with the server before displaying it to the user. &lt;/p&gt;

&lt;p&gt;Note that things won’t immediately work for browsers which have already cached the content but when that content has expired or Reload is pressed the new responses from the server will contain the desired instructions.&lt;/p&gt;

&lt;p&gt;If we look at fiddler the green requests is the initial request&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/link/4a6d3b0743e647728f71826cd566dfec.jpg&quot;&gt;&lt;img title=&quot;clip_image011&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;clip_image011&quot; src=&quot;/link/38a9abbe1d574adbba5e19da3d78dd4b.jpg&quot; width=&quot;554&quot; height=&quot;148&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The purple requests is when I press the address bar and click enter.&lt;/p&gt;

&lt;p&gt;And the orange requests is after having updated one of the assets – the image.jpg which then causes it to refresh and retrieve the content.&lt;/p&gt;

&lt;p&gt;The browser now sends the IF-* headers to verify the content with the server.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/link/a2ca5cd1696a40e68b51eda0333d4358.png&quot;&gt;&lt;img title=&quot;clip_image012&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;clip_image012&quot; src=&quot;/link/32ab9eeae2754958bc6b83eac758bde3.png&quot; width=&quot;549&quot; height=&quot;113&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the response from the server&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/link/73ab2fdbe667459fbfdcfa73936b6ae1.png&quot;&gt;&lt;img title=&quot;clip_image013&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;clip_image013&quot; src=&quot;/link/9dd1461891db459995131a3c9cc7bf1c.png&quot; width=&quot;541&quot; height=&quot;170&quot; /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;You can see that the Etag value differs from the request If-None-Match value and thus new content is retrieved.&lt;/p&gt;

&lt;p&gt;
  &lt;p&gt;In my opinion the web.config change should be included in web.config before launching any site and then you can increase the cache expiration values to increase long term page speed. &lt;/p&gt;&lt;/p&gt;</id><updated>2013-11-12T10:20:16.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Fileupload-gadget</title><link href="https://world.optimizely.com/blogs/Shamrez-Iqbal/Dates/2009/11/Fileupload-gadget/" /><id>&lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;This is a gadget which hosts a Silverlight-application, with the purpose of uploading files to EPiServer.&lt;/p&gt;  &lt;p&gt;Almost every day in the life of a developer the following happens- you’ve had a meeting/workshop with your client (of the suspicious kind), with offices in a shady back ally in a country nobody but a bunch of professors in geography have heard about, &lt;/p&gt;  &lt;p&gt;So anyways, you have a need to store the documents from the meeting and other artifacts in a safe place (while you’re out partying), and what place is better than EPiServer? &lt;/p&gt;  &lt;p&gt;Obviously you suspect the client’s wireless network to have sniffing mechanisms which will sniff out all your passwords on Google Docs and VPN probably won’t work. So you log in to Episerver, upload the files there. But there’s still the risk of password sniffers,sniffing out the cms password, but hey, we have to choose the lesser of two evils :-)&lt;/p&gt;  &lt;p&gt;Anyways, initially I was thinking that an entry like this should be qualified for disqualification due to the fact that some part of it is made in Silverlight. But then contributions came and lo, they were all using some sort of external system. &lt;/p&gt;  &lt;h2&gt;Technical details and process&lt;/h2&gt;  &lt;p&gt;In the beginning just for prototyping, I tried SWFUpload, which didn’t work as intended with general asp.net mvc. I then turned to a Silverlight-based solution. But generally speaking the gadget is just a bunch of projects which others have made and glued together using HyperGLUE-technology (so advanced so complex, i won’t even tell you what it is!)&amp;#160; into a gadget (and inspired by other gadgets)&lt;/p&gt;  &lt;p&gt;These include&lt;/p&gt;  &lt;p&gt;1. &lt;a href=&quot;http://slfileupload.codeplex.com/&quot;&gt;Silverlight Multi File Uploader (using WCF)&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2. &lt;a href=&quot;https://www.coderesort.com/p/epicode/wiki/FolderBrowserProperty&quot;&gt;Folder Browser Property (Marcus&amp;#160; Lindblom)&lt;/a&gt; - Meridium AB&lt;/p&gt;  &lt;p&gt;As suggested in “Introduction to gadget development” the gadgets can be stored in the Modules but looking at other gadgets and seeing that the controller tries to look for the views in the root “Views” folder on the website. In order to make the folder browser work properly I had to use the same approach but I’m not too fond of it since can risk overwriting setting/files from other gadgets b: referring to javascript/aspx files in the gadget markup will be repeated many times over which might not be a good practice. &lt;/p&gt;  &lt;p&gt;And initially I thought the gadget would be quite easy to create and even if the views are almost empty I tried a lot of things to make the different aspects of the gadget to work together.&lt;/p&gt;  &lt;h2&gt;Features&lt;/h2&gt;  &lt;p&gt;Some features&lt;/p&gt;  &lt;p&gt;&#183; Select and upload multiple files&lt;/p&gt;  &lt;p&gt;&#183; Automatically overwrite (I think) the files if they already exist&lt;/p&gt;  &lt;p&gt;&#183; WCF- even bigger config files&lt;/p&gt;  &lt;p&gt;&#183; Ability to configure a standard folder always set (might be handy)&lt;/p&gt;  &lt;p&gt;&#183; Support for VersioningFileSystem and Nativefilesystem&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Screenshots&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/link/3504a4e501eb404aa1ae3fb4f2d2f096.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;sccren1&quot; border=&quot;0&quot; alt=&quot;sccren1&quot; src=&quot;/link/44e59fecfb4f4287837c56b08c1fed76.jpg&quot; width=&quot;244&quot; height=&quot;166&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;/link/abd33b8645e6456983b55b5f07f6efbe.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;screen2&quot; border=&quot;0&quot; alt=&quot;screen2&quot; src=&quot;/link/517b7884dae542c0b23221f6d2a96ffb.jpg&quot; width=&quot;244&quot; height=&quot;166&quot; /&gt;&lt;/a&gt;&amp;#160; &lt;a href=&quot;/link/078377a24448468b8de2590c72495ad4.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;screen3&quot; border=&quot;0&quot; alt=&quot;screen3&quot; src=&quot;/link/823236b1e2134d2ca43a7535306399dc.jpg&quot; width=&quot;244&quot; height=&quot;57&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Download&lt;/h2&gt;    &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:f7568e17-53d3-4a03-a850-eda3b4af9667&quot; class=&quot;wlWriterSmartContent&quot;&gt;   &lt;p&gt;&lt;a href=&quot;/link/b226a03e7d6f40b5a6bb396585578dfb.zip&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;      &lt;br /&gt;&lt;a href=&quot;/link/fcd4ea0a5efb4d9ba8b138dc764a6ede.zip&quot; target=&quot;_blank&quot;&gt;Episerver Package&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Installation&lt;/h2&gt;  &lt;p&gt;If you prefer to install it manually:&lt;/p&gt;  &lt;p&gt;1. build and copy the folders to the root level of the site.&lt;/p&gt;  &lt;p&gt;2. add the following things to web config&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;inside this node :&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;“&amp;lt;episerver.shell&amp;gt;&amp;#160; &amp;lt;modules autoDiscovery=&amp;quot;Minimal&amp;quot;&amp;gt;”&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;add&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;lt;add name=&amp;quot;UploadGadget&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;assemblies&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add assembly=&amp;quot;MultiFileUploadGadget1&amp;quot; /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/assemblies&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/add&amp;gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;inside this node: &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;lt;system.servicemodel&amp;gt;&amp;lt;services&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;add&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;lt;service behaviorConfiguration=&amp;quot;UploadServiceBehavior&amp;quot; name=&amp;quot;mpost.FileUploadServiceLibrary.UploadService&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;&amp;quot; binding=&amp;quot;customBinding&amp;quot; bindingConfiguration=&amp;quot;binaryBinding&amp;quot; contract=&amp;quot;mpost.FileUploadServiceLibrary.IUploadService&amp;quot; &amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;mex&amp;quot; binding=&amp;quot;mexHttpBinding&amp;quot; contract=&amp;quot;IMetadataExchange&amp;quot; /&amp;gt;     &lt;br /&gt;&amp;lt;/service&amp;gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;inside this node:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;lt;system.serviceModel&amp;gt;&amp;lt;behaviors&amp;gt;&amp;lt;serviceBehaviors&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;add&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;lt;behavior name=&amp;quot;UploadServiceBehavior&amp;quot; &amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;true&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;true&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/behavior&amp;gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;inside this node:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;lt;system.serviceModel&amp;gt;&amp;lt;bindings&amp;gt;&amp;lt;customBinding&amp;gt;&lt;/p&gt;  &lt;p&gt;&amp;lt;binding name=&amp;quot;binaryBinding&amp;quot; &amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;binaryMessageEncoding maxReadPoolSize=&amp;quot;2147483647&amp;quot; maxSessionSize=&amp;quot;2147483647&amp;quot; maxWritePoolSize=&amp;quot;2147483647&amp;quot;&amp;#160; /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;httpTransport maxReceivedMessageSize=&amp;quot;2147483647&amp;quot; maxBufferSize=&amp;quot;2147483647&amp;quot; /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/binding&amp;gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Extra settings which might be required&lt;/strong&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;also, if you do not have&amp;#160; the handler for .svc files you might need to add something like (for IIS7.x) in &amp;lt;system.webserver&amp;gt;&amp;lt;handlers&amp;gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;lt;add name=&amp;quot;svchandler&amp;quot; path=&amp;quot;*.svc&amp;quot; verb=&amp;quot;*&amp;quot; type=&amp;quot;System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot; preCondition=&amp;quot;integratedMode&amp;quot; /&amp;gt; &lt;/p&gt;  &lt;p&gt;small update: This should be added before other handlers have a chance to handle the extension.&lt;/p&gt;  &lt;p&gt;and finally&lt;/p&gt;  &lt;p&gt;serviceHostingEnvironment aspNetCompatibilityEnabled=&amp;quot;true&amp;quot; /&amp;gt;&lt;/p&gt;  &lt;p&gt;inside the &amp;lt;system.servicemodel&amp;gt; tag &lt;/p&gt;  &lt;p&gt;I haven’t added this tag as part of the installation package since there isn’t any “key-attribute” to verify if the tag already exists so you need to add it manually in case it isn’t there.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;You’ll have to google for the IIS6 settings. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;During development of this and testing some VersioningFIleSystem methods I managed to wreck the filesystem. I recommend NativeFilesystem for testing. And as mentioned, existing files will most likely be overwritten.&lt;/p&gt;</id><updated>2009-11-26T07:49:47.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>FindPagesWithCriteria Gadget</title><link href="https://world.optimizely.com/blogs/Shamrez-Iqbal/Dates/2009/10/FindPagesWithCriteria-Gadget/" /><id>&lt;p&gt;My contribution to the Gadget Contest is a gadget for doing findpageswithcriteria-calls. &lt;/p&gt;  &lt;p&gt;I haven’t done asp.net MVC coding before this so it was a new and interesting experience.&lt;/p&gt;  &lt;p&gt;Some points of interest – although the introduction to gadgets article talks about extension-methods for htmlhelper-classes it seems like you do not get Intellisense in the views.&lt;/p&gt;  &lt;p&gt;Did also experience that the Intellisense was working but the Html-helper wasn’t available. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/link/55c19780430042c7b4744ffea983a1f4.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;screen1&quot; border=&quot;0&quot; alt=&quot;screen1&quot; src=&quot;/link/0b8679b57e424730b59c4ea47b1e6877.jpg&quot; width=&quot;244&quot; height=&quot;72&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Screenshot of criteria builder&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href=&quot;/link/ef2ebb8ca73d4553b0d7bb64b7bb4bbb.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;screen2&quot; border=&quot;0&quot; alt=&quot;screen2&quot; src=&quot;/link/9aba84e3731e4a32ab5d8c9c35694973.jpg&quot; width=&quot;244&quot; height=&quot;65&quot; /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The magnificent result-view&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Some further things which could be added and would be make the gadget more editor friendly:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Using the Dynamic Data Store to save searches &lt;/li&gt;    &lt;li&gt;Using Reflection (possibly?) to determine the valuetype automatically &lt;/li&gt;    &lt;li&gt;Possibility to select where to start searching &lt;/li&gt;    &lt;li&gt;Validation and friendly feedback for errors&lt;/li&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Installation instructions (hope it works for you)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;1. add this to web.config&lt;/p&gt;  &lt;p&gt;&amp;lt;modules autoDiscovery=&amp;quot;Minimal&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add name=&amp;quot;FindPages&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;assemblies&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add assembly=&amp;quot;FindPages&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/assemblies&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/add&amp;gt;     &lt;br /&gt;&amp;lt;/modules&amp;gt;&lt;/p&gt;  &lt;p&gt;under the episerver.shell tag&lt;/p&gt;  &lt;p&gt;2. unpack the zip file to your episerver ctp site, open and build the project&lt;/p&gt;  &lt;p&gt;2. add gadget to the page&lt;/p&gt;  &lt;p&gt;3. rule the world?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style=&quot;padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px&quot; id=&quot;scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:ff4d2fd0-4da3-4dc7-8f60-b9ec1b600506&quot; class=&quot;wlWriterEditableSmartContent&quot;&gt;&lt;p&gt;Source and project files &lt;a href=&quot;/link/b4f6af116a6645048b01c2a754f1d067.zip&quot; target=&quot;_blank&quot;&gt;Source and project files&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</id><updated>2009-10-27T18:38:29.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Making Asp.net Ajax services and IIS6/CMS5/(2003) work.</title><link href="https://world.optimizely.com/blogs/Shamrez-Iqbal/Dates/2009/5/Making-Aspnet-Ajax-services-and-IIS6CMS52003-work/" /><id>&lt;p&gt;In the process of migrating a site I encountered a strange problem with asp.net ajax services. &lt;/p&gt;  &lt;p&gt;As you all probably are aware - there are two common approaches for running ajax in asp.net. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;UpdatePanel &lt;/li&gt;    &lt;li&gt;Webservices callable from javascript &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;When the latter approach is used, the methods and class have to be decorated with the ScriptService and ScriptMethod attributes. &lt;/p&gt;  &lt;p&gt;This in turn makes it possible to access the javascript-version of the services by accessing example.asmx/js or example.asmx/jsdebug. In the CMS5 site I got 404s when trying to access those Urls for a service.&lt;/p&gt;  &lt;p&gt;After some testing and trying I found a solution. &lt;/p&gt;  &lt;p&gt;CMS5 sites are – at least in IIS6 – configured with a wildcard application mapping handler. Having this handler one should assume that everything is caught and handled by this. But not so for the /js and /jsdebug urls. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The solution was to add an explicit handler for asmx pointing to the isapi-dll which is used in the wildcard part.&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;I would like to add a screenshot for this but it didn’t work publishing images to the blog so I’ll have to explain manually and perhaps conform to WCAG :-)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;/link/5555a2fb99a14809b7e3a53375ca6e8c.jpg&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;screenie&quot; border=&quot;0&quot; alt=&quot;screenie&quot; src=&quot;/link/f0058e8c8cb34bacb8b4abb6c142d311.jpg&quot; width=&quot;244&quot; height=&quot;144&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;this can be done from the “Home Directory”-tab in site properties. Press the Configure button and add a new mapping there with extension .asmx.&lt;/p&gt;  &lt;p&gt;Most likely the cause of this is a bug in the wildcard application mapping system.&lt;/p&gt;</id><updated>2009-05-27T09:37:16.0100000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Problems with access rights to VPP in a load balanced enviroment</title><link href="https://world.optimizely.com/blogs/Shamrez-Iqbal/Dates/2008/10/Problems-with-access-rights-to-VPP-in-a-load-balanced-enviroment/" /><id>&lt;p&gt;Some weeks ago after installing Cms5 in a load balanced enviroment a problem surfaced with access rights to the VPP-folders. The vpp files for the site was on a fileshare on a seperate server,&amp;#160; and after installing a site on the first webserver, we copied the files to the other server, did some web.config changes,&amp;#160; but the site did not work, and the error message (i do not recall the exact error message now) pointed to the VPP filepath. &lt;/p&gt;  &lt;p&gt;After some reflection and creating a page which simulated the vpp-behaviour we discovered that while one server had access rights to the vpp-files on the other server, but the second webserver didn’t have access rights to it. &lt;/p&gt;  &lt;p&gt;We had to use &lt;a href=&quot;http://setacl.sourceforge.net/&quot;&gt;SetAcl&lt;/a&gt; to fix the permissions for this problem but it turns out that the installer sets explicit ntfs-permissions on the vpp-folder. &lt;/p&gt;  &lt;p&gt;We didn’t experiment with running the installer on the webserver causing problems and its possible that it would not work because of the explicit permissions being set by the installer (they might be replaced on consecutive installs).&lt;/p&gt;</id><updated>2008-10-07T10:49:13.1570000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Security issue? - Editors remain logged in after logging out in Episerver 5 enterprise installations</title><link href="https://world.optimizely.com/blogs/Shamrez-Iqbal/Dates/2008/10/Security-issue---Editors-remain-logged-in-after-logging-out-in-Episerver-5-enterprise-installations/" /><id>&lt;p&gt;Recently, after migrating an enterprise site from v4 to v5 I discovered a potential security issue in v5. &lt;/p&gt;  &lt;p&gt;In v4 if an enterprise site had foo.com and bar.com then foo.com/mytemp.aspx?id=100 and bar.com/mytemp.aspx?id=100 would show the same page and i suppose this also was the reason that once you were logged in to a site all site were accesible in edit-mode. The same also applied to simple addresses for pages. I.e. foo.com/foo and bar.com/foo would result in the same page being shown. &lt;/p&gt;  &lt;p&gt;In V5 the friendly url functionality is rewritten and the “cross-domain” addresses do not work. This has an interesting consequence when working in edit-mode. Whenl logging in to edit-mode for foo.com, and clicking on the node for bar.com this pops up the login box. For some of the editors this can be a really annoying thing because of their workflow with publshing to many sites in a short time. &lt;/p&gt;  &lt;p&gt;But the real security issue is that after logging out from the edit mode interface, the editor will remain logged in on foo.com. &lt;/p&gt;  &lt;p&gt;I have tested this behaviour on a test site running r1 sp3. &lt;/p&gt;  &lt;p&gt;I suppose the only fix for this at the moment is awareness of this behaviour. &lt;/p&gt;</id><updated>2008-10-07T10:19:58.6600000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>p-tags showing up</title><link href="https://world.optimizely.com/blogs/Shamrez-Iqbal/Dates/2008/9/p-tags-showing-up/" /><id>&lt;p&gt;Recently one of our customers had a problem with p-tags appearing on a page. &lt;/p&gt;  &lt;p&gt;I&#39;ve bumped into similar issues and discussed the problem with Steve Celius on #epicode, and concluded that if all buttons in the editor of a field are turned off,&lt;/p&gt;  &lt;p&gt;&amp;lt;episerver:property /&amp;gt; &lt;/p&gt;  &lt;p&gt;will then render the tags with html entities meaning that instead of the tags being processed, they&#39;ll actually just be shown on the page as-is.&lt;/p&gt;  &lt;p&gt;I logged into the site and all the buttons for the property were turned of so it should generate any tags and i tried and tested things and no tags were generated.&lt;/p&gt;  &lt;p&gt;After some further discussion with other people in #epicode, among them erik- and asthiss, i realized that the problem was caused by the fact that some webeditors had enabled &lt;em&gt;All functions available in the Editor &lt;/em&gt;under &lt;em&gt;Permissions for Functions&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;What happened then was that the property would show as a html-property for the some editors - inserting html tags, but when other editors accessed the property, it would show as plain text with tags. &lt;/p&gt;  &lt;p&gt;The solution to the problem was to use &amp;lt;%= CurrentPage[&amp;quot;PropertyName] %&amp;gt; in the page to force the property to process and render the html. &lt;/p&gt;</id><updated>2008-09-05T09:58:08.0000000Z</updated><summary type="html">Blog post</summary></entry></feed>