This post describes a problem with Web API in Sitecore 8.1 Update-2, causing all Web API controllers to return “An error has occurred.” error message on CD-servers. You can skip to my temporary solution at the end, if you experience the same issue.

I have previously written about Sitecore.Services.Client and use of ServicesControllerAttribute for easy implementation of Web API in a Sitecore solution – without any pipeline and routing configuration. After upgrading to Sitecore 8.1 Update-2, and reapplying the tedious manual work of enabling/disabling config files for CD-servers, I found that all our Web API controllers failed with a An error has occurred error message. Here’s the full exception message returned by Web API after disabling customErrors in web.config:

What first caught my eye was that the stack trace contained non of our custom code, and that the error was happening deep inside Sitecore and Web Api. I was hitting a custom controller and not anything related to ExperienceAnalytics, which the stack trace could indicate at first glance.

Here’s what I wrote in a ticket to Sitecore Support:

From the exception stack trace I have narrowed down the issue to Sitecore.Services.Infrastructure.Web.Http.Dispatcher.NamespaceHttpControllerSelector.InitializeControllerDictionary(), which instantiates a HttpControllerDescriptor for each API controller found in any referenced assembly. Some API controllers in the Sitecore.ExperienceAnalytics.dll assembly are decorated with Sitecore.ExperienceAnalytics.Api.Http.Filters.NotFoundExceptionFilterAttribute. This attribute contains a parameterless constructor that is called by internals of ASP.NET Web API. How ever the constructor calls Sitecore.ExperienceAnalytics.Api.ApiContainer.GetLogger() which tries to create an object based on what is defined in an experienceAnalytics/api/logger configuration element. This element does not exist as it’s defined in Sitecore.ExperienceAnalytics.WebAPI.config, which should be disabled on CD servers.

My (temporary) solution

I have resolved the issue by deleting three Sitecore.ExperienceAnalytics assemblies on CD-servers:

Sitecore.ExperienceAnalytics.Client.dll

Sitecore.ExperienceAnalytics.dll

Sitecore.ExperienceAnalytics.ReAggregation.dll

This prevents the code in InitializeControllerDictionary() to find and instantiate the problematic controllers and filters for ExperienceAnalytics.