Bogue avec SSRS (2012-2014) en mode intégré à SharePoint 2013

Nous avons découvert un bogue avec Reporting Services intégré à SharePoint 2013. Le bogue est présent avec SSRS 2012 SP2 / Add-in SP2 et SSRS 2014 SP2 / Add-in 2014.

Symptôme

Le menu Actions de la barre d’outil ne respecte pas la langue du site SharePoint où le rapport a été déployé :

Bug

Dans cet exemple, le site est en anglais ainsi que toute l’interface de Reporting Services … sauf les entrées du menu Actions –> Export de la barre d’outils.

Le comportement

Ce menu est dynamiquement chargé lorsqu’un utilisateur l’ouvre :

clip_image002

La réponse HTTP est un gros bloc de texte, contenant une série de <ie:menuitem  pour chaque entrée du menu.

Le comportement erroné est le suivant : le premier accès à ce menu, par n’importe quel utilisateur de l’application Web, détermine la langue qui sera utilisée pour ces entrées de menu. Ainsi, si après un IIS Reset vous lancez un rapport SSRS sur un site français et que vous ouvrez le menu Actions, les entrées seront en français (ce qui est bon).  Mais par la suite, elles seront en français même pour des rapports hébergés dans un site en anglais …

L’explication

Le problème c’est que Microsoft a utilisé une cache mémoire (et statique) pour ces libellés …

La classe Microsoft.ReportingServices.SharePoint.UI.WebParts.ActionMenu du Dll Microsoft.ReportingServices.SharePoint.UI.WebParts.dll (GAC) utilise une cache statique :

namespace Microsoft.ReportingServices.SharePoint.UI.WebParts
{
internal sealed class ActionMenu : CompositeControl, IScriptControl
{
(…)
private static IDictionary<string, string> m_localizedRenderingExtensions;

   (…)

private static string GetLocalizedRenderingExtension(string extensionName)
{
  if (ActionMenu.m_localizedRenderingExtensions == null)
      {
ActionMenu.m_localizedRenderingExtensions = (IDictionary<string, string>) new Dictionary<string, string>();
ActionMenu.m_localizedRenderingExtensions.Add(« XML », ReportViewerStrings.XmlRenderingExt);
ActionMenu.m_localizedRenderingExtensions.Add(« CSV », ReportViewerStrings.CsvRenderingExt);
ActionMenu.m_localizedRenderingExtensions.Add(« PDF », ReportViewerStrings.PdfRenderingExt);
ActionMenu.m_localizedRenderingExtensions.Add(« EXCELOPENXML », ReportViewerStrings.ExcelRenderingExt);
ActionMenu.m_localizedRenderingExtensions.Add(« IMAGE », ReportViewerStrings.ImageRenderingExt);
ActionMenu.m_localizedRenderingExtensions.Add(« WORDOPENXML », ReportViewerStrings.WordRenderingExt);
ActionMenu.m_localizedRenderingExtensions.Add(« MHTML », ReportViewerStrings.MhtmlRenderingExt);
}
if (!string.IsNullOrEmpty(extensionName) && ActionMenu.m_localizedRenderingExtensions.ContainsKey(extensionName))
return ActionMenu.m_localizedRenderingExtensions[extensionName];
return (string) null;
}

Ce qu’on peut faire

J’ai signalé ce bogue sur Microsoft Connect si vous souhaitez voter.

Au moins vous aurez une explication à donner à vos utilisateurs …

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s