Dopo una migrazione di un sito da
SharePoint 2013 a
SharePoint 2016, con alcune parti custom come web part, page layouts, masterpage, ecc....., mi sono trovato questo errore accedendo ad una pagina custom:
Message : Application error when access /_layouts/15/nomeCartella/login.aspx, Error=Could not load type
'Definition.Layouts.Definition.Login'. at
System.Web.UI.TemplateParser.GetType(String typeName, Boolean ignoreCase, Boolean throwOnError) at
System.Web.UI.TemplateParser.ProcessInheritsAttribute(String baseTypeName, String codeFileBaseTypeName,
String src, Assembly assembly) at
System.Web.UI.TemplateParser.PostProcessMainDirectiveAttributes(IDictionary parseData)
apparentemente non riusciva a caricare la classe indicata
Definition.Layouts.Definition.Login.
Questa classe era all'interno di una
.dll che sicuramente veniva caricata, in quanto altri componenti presenti nella stessa funzionavano regolarmente.
Un analisi approfondita dei log di
SharePoint non dava indicazioni aggiuntive sulla causa.
Analizzando i sorgenti in
Visual Studio, erano presenti varie dipendenze ad altre
.dll custom e di sistema.
Per restringere il campo ho usato
ILSpy per capire quale dipendenze usava la classe indicata, ne aveva una sola:
Microsoft.SharePoint.IdentityModel.
Essendo il progetto creato per
SharePoint 2013, ho supposto che venisse
cercata la versione
15.0.0.0 di
Microsoft.SharePoint.IdentityModel anziché la versione
16.0.0.0 usata da
SharePoint 2016.
Un aggiunta di un
bindingRedirect nel
web.config con range
15.0.0.0 ÷ 16.0.0.0 della web application ha risolto:
...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
...
<dependentAssembly>
<assemblyIdentity name="Microsoft.SharePoint.IdentityModel" publicKeyToken="71e9bce111e9429c" culture="neutral" />
<bindingRedirect oldVersion="15.0.0.0" newVersion="16.0.0.0" />
</dependentAssembly>
...