If you are planning on using DI on your Sitecore 7.2 and later projects, you should be aware that Sitecore has itself started using MVC in some of it’s features. For example, if on an image field you click “Browse”, then “Upload”, this diaglog window will call the URL /api/sitecore/Media/Upload?sc_database=master which is an MVC route.
The issue is, if you have set the Controller Factory of your application to your own (this was done when using a Castle Windsor implementation) then you need to ensure you have registered the instances of IController within the Sitecore DLLs as well as your own. The DLLs you need to register are Sitecore.Speak.Client, Sitecore.Mvc and Sitecore.Mvc.DeviceSimulator. For example, in Castle Windsor you would need to add something like the following to your Installer which registers your controllers:
For further reading, look at Sitecore support ticket #429145
In a Sitecore instance that contains multiple sites, you may have found that links between different sites can result in incorrect URLs.
For example, suppose we have the following Sitecore structure:
- Site A (www.site-a.com)
- Site B (www.site-b.com)
Typically, a link from anywhere on Site A to Page B might result in a URL like “www.site-a.com/sitecore/site-b/page-b”, rather than the expected “www.site-b.com/page-b”.
There are a number of things you need to get right in order for this to work properly:
- The SiteResolving property needs to be set to true on the UrlOptions when calling LinkProvider.GetItemUrl().
There is a bug in that the Sitecore config setting (Rendering.SiteResolving) is never used to set this property automatically. This can be easily fixed by extending the LinkProvider with a few lines of code.
- Site definitions must have both hostName and targetHostName attributes set in order for site resolving to work (even if the sites in question all use the same hostnames)
If you want language to be preserved correctly across cross-site links then also:
- The Rendering.SiteResolvingMatchCurrentLanguage setting must be set to true
- The casing of the language names must be the same between the definitions in the Sitecore tree and the language attributes on the site site definitions, as a case-sensitive match is performed.
Some relevant articles:
If you need to log to a database instead of a text file, you can use Log4Net to do it by just changing some config: http://sitecoreblog.alexshyba.com/2010/07/sitecore-logging-write-it-to-sql.html
If you want to only log a small number of things to the database (but still log everything else to the existing log), then instead of adding the sql adonet appender to the main root logger in the config, create a new logger node and add the sql ado appender to that. Eg:
<logger name=”PublishLog” additivity=”false”>
Then when logging, explicitly use this logger using the Sitecore Logger Factory. Eg: “Sitecore.Diagnostics.LoggerFactory.GetLogger(“PublishLog”)”
Its really simple to get these setup together. Once you have your Sitecore MVC project up and running:
- Install Autofac from Nuget
- Install Autofac ASP.NET MVC 5 Integration (note, select the appropriate version you require)
- Create a new intializer class (see below)
- Update the AssemblyInfo and add: [assembly: PreApplicationStartMethod(
- See http://haacked.com/archive/2010/05/16/three-hidden-extensibility-gems-in-asp-net-4.aspx/ for more info on this approach. It avoids needing to update global.asax. This tip was taken from http://www.jasonbert.com/2013/11/03/tip-move-your-ioc-from-global-asax/
- Update the config as per https://github.com/tcuk/minq/wiki/MVC-Configuration
- Enjoy DI into your controllers
public static class Initializer
static IContainer _containerProvider;
public static void Initialize()
var builder = new ContainerBuilder();
_containerProvider = builder.Build();
There is a new setting in 6.6 that changes the behaviour of languageEmbedding=never in the linkManager code:
LANGUAGES ALWAYS STRIP LANGUAGE
This setting specifies if the StripLanguage processor in the <preprocessRequest> pipeline will parse and remove languages from
the URL, even when the languageEmbedding attribute of the linkProvider is set to "never". You should only change this setting
to "false" if the default behavior causes problems in your solution.
Default value: true
<setting name="Languages.AlwaysStripLanguage" value="false"/>
This was causing issues post upgrade since we relied on the presence of /en to define different site entries.
A quick sql script can find any big offenders:
COUNT(DISTINCT Version) AS VersionCount,
(SELECT Name FROM [dbo].[Items] WHERE ID = VF.ItemId) AS Name
FROM VersionedFields VF
GROUP BY ItemID, Language
ORDER BY VersionCount DESC
A quick sql script can find any big offenders:
SELECT TOP 1000
COUNT(*) AS Total,
(SELECT Name FROM [dbo].[Items] J WHERE J.ID = I.ParentID) AS Name
FROM [dbo].[Items] I
GROUP BY ParentID
ORDER BY Total DESC
If you want to find out average load times for eg how long nodes take to load use the following iis log query and then filter the data in excel:
cs-uri-stem AS URI,
FROM 'C:\###FOLDER TO LOG FILES###\*'
WHERE cs-method = 'POST' and (
/*loading a node*/
cs-uri-stem like '%Content-Editor%' or
/*loading children of a node*/
cs-uri-stem like '%execute.aspx%'
/*opening languages for a node*/
cs-uri-query like '%Gallery.Languages%'
ORDER BY time-taken DESC
See IIS Log parser for how to run these queries.