Jag bloggar numera på http://blog.dileno.com ».

Prenumerera på RSS

Arkiv för EPiServer:

Uppdatera dina språkfiler för att undvika FormatException när du försöker radera en sida i EPiServer

Om du försöker radera en sida i EPiServers redaktörsläge och får ett System.FormatException-felmeddelande så beror det ofta på att du inte har uppdaterade språkfiler på din webbplats.

Det du ska göra är att helt enkelt uppdatera dina språkfiler som ligger i lang-mappen, till de senaste för EPiServer-installationen.

Så här ser felmeddelandet ut:

System.FormatException: Index (zero based) must be greater than or equal to zero 
and less than the size of the argument list.

Och stacken ser ut så här:

[FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.]
System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args) +7483117
System.String.Format(IFormatProvider provider, String format, Object[] args) +107
EPiServer.UI.Edit.DeletePage.CreateReferenceList(PageReferenceCollection deleteData) +318
EPiServer.UI.Edit.DeletePage.OnLoad(EventArgs e) +609
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627

Det som sker är att du försöker radera en sida som har beroenden knutna till sig. I stället för felmeddelandet ska EPiServer visa ett meddelande och ge dig två val - att radera sidan eller avbryta raderingen. Det är här det blir fel, om man inte har uppdaterade språkfiler.

Om man tittar på metoden DeletePage.CreateReferenceList() i Reflector (finns i stacken ovan) så ser man att metoden skickar tillbaka en översatt sträng och en länk:

if (string.Compare(strA, string.Empty) == 0)
{
strA = base.Translate("#reftypeshortcut");
}
SystemMessageContainer systemMessageContainer = base.SystemMessageContainer;
systemMessageContainer.Message = systemMessageContainer.Message + string.Format(strA + "<br>", this.RenderLink(reference));

Det är framför allt base.Translate("#reftypeshortcut") som är intressant - det är nämligen här som problemet uppstår. Tittar man på reftypeshortcut i en gammal språkfil så ser den ut så här:

<reftypeshortcut>{0} is the destination in a shortcut from {1}</reftypeshortcut>

Samma element ser ut så här i en nyare språkfil:

<reftypeshortcut>Page with ID {0} links to this page or some of its descending pages.</reftypeshortcut>

Varpå man kan dra slutsatsen att indexet 1 helt enkelt inte finns i den tidigare språkfilen, om man har uppdaterat webbplatsen, men inte språkfilerna.

Hantera HTML korrekt i EPiServer genom att använda XHTML string

Om du stöter på problem med att HTML-kod från en EPiServer-editor inte visas korrekt så beror det troligtvis på att sidegenskapen med HTML-kod är av typen Long string (>255) i stället för XHTML string (<255).

När du skrivit brödtext (exempelvis i egenskapen som heter MainBody) och publicerar din EPiServer-sida så visas HTML-koden i versaler och validerar alltså inte - om du använder dig av Long string.

Tricket är då alltså att byta egenskapstyp till XHTML string i stället.

Lyckad EPiServer-träff i Stockholm!

EPiServers loggaJag var ikväll på en mycket lyckad första EPiServer-träff i Stockholm, anordnad av Fredrik Haglund och René Voigt. Träffen hölls i Cibers lokaler på Drottninggatan och över 40 personer dök upp.

Under kvällen hölls presentationer gällande riktlinjer i utveckling och hur man kan konfigurera EPiServer. Vi hade även gruppdiskussioner där vi gick in lite djupare på utvecklingsriktlinjer och presenterade det vi kommit fram till - mycket intressant.

Kvällen avslutades med mingel och allmänt nätverkande.

Jag måste säga att detta var en utmärkt initiativ och uppmanar alla som jobbar med EPiServer-utveckling i eller i närheten av Stockholm att gå med i nätverket för EPiServer-utvecklare i Stockholm.

EPiServer, IIS 7 och ClassFactory not initialized

Om du får felmeddelandet ClassFactory not initalized när du försöker köra en EPiServer-webbplats så beror det troligtvis på att du har fel Web.Config-inställningar för din webbplats.

Det kompletta felmeddelandet lyder:

EPiServer.BaseLibrary.ClassFactoryException: ClassFactory not initialized

Det som oftast har hänt är att webbplatsen körs med fel Web.Config-inställningar för den webbserver webbplatsen ligger på. Det är troligt att en webbplats som tidigare körts på IIS 6 genererar ovanstående felmeddelande i IIS 7.

Det finns flera sätt att lösa detta på:

  • Genom att uppdatera Web.Config med rätt inställningar för IIS 7.
  • Genom att köra webbplatsen i en Application Pool med stöd för IIS 6.

Rekommendationen från EPiServer är att uppdatera Web.Config med inställningar för IIS 7. EPiServer har publicerat ett dokument gällande skillnader mellan IIS 6 och IIS 7, där du kan läsa närmre om de förändringar du behöver göra.

Ett annat sätt att lösa problemet på är att aktivera stöd för IIS 6-motorn i nya IIS 7. Det gör du så här:

  • Gå till Aktivera Windows-funktioner under Kontrollpanelen->Program och funktioner->Aktivera eller inaktivera Windows-funktioner.
  • Expandera noden Internet Information Services->Web Management Tools och kryssa i IIS 6 Management Compatibility. Tryck OK.
  • I IIS 7, högerklicka på din webbplats, Välj Manage Web Site->Advanced Settings och välj Classic .NET AppPool under Application Pool. Klart!

Vilket sätt du föredrar beror på hur mycket av IIS 7:s funktionalitet du behöver, samt vilken webbserver webbplatsen ska ligga på när den lanseras.

EPiWiki - nyttigt om EPiServer

Jag skulle vilja göra EPiServer-utvecklare (och fler därtill) uppmärksamma på EPiWiki, en webbplats där Mattias Lövström delar med sig av kodsnippets gällande CMS:et EPiServer, samt publicerar information om nyttiga verktyg och annat som underlättar i en utvecklares vardag.

Jag har haft förmånen att jobba tätt ihop med Mattias Lövström i ett flertal projekt och tycker det är riktigt grymt att han nu även delar med sig av sina kunskaper på Internet.

Tills RSS:en är implementerad (hint hint, Mattias) , bokmärk wikin så länge!

Att sätta rättigheter i EPiServer

Har du stött på en Windows-inloggningsruta någon gång när du surfat till EPiServers admin- eller redaktörsläge? I så fall har du haft rättighetsproblem. Lösningen är också enkel.

Det är viktigt att komma ihåg att rättigheter i EPiServer kan ställas in i två steg:

  • Under Access Rights i adminläget (Set Access Rights)
  • I Web.Config, under <locations>

Under Set Access Rights ger du specifika användargrupper rättigheter i EPiServer-trädet, medan du i Web.Config ger rättigheter till fysiska mappar för webbplatsen.

Lösningen för att sätta korrekta rättigheter är följande:

  • Se till att användaren är medlem i en grupp som har åtkomst till administrationsläget, eller redaktörsläget och de rättigheter användaren ska ha där. Detta ändrar du under Set Access Rights.
  • Lägg till gruppen för vald mapp (location) i Web.Config.

Så här kan det se ut i Web.Config för exempelvis admin-mappen (där SpecificAdmins är den skapade gruppen):

<location path="myui/admin">
<system.web>
<authorization>
<allow roles="WebAdmins,Administrators,SpecificAdmins" />
<deny users="*" />
</authorization>
</system.web>
</location>

När EPiServer ger dig 404 för en fil som existerar

Om du på en EPiServer-webbplats inte kan surfa till en fil som du vet existerar, så beror det ofta på avsaknad av konfigurationsinställningar i Web.Config.

Problemet ter sig som så att du exempelvis har en flash-film som helt enkelt inte visas, och när du surfar till den får du bara ett 404-felmeddelande.

Problemet löser du genom att lägga till den aktuella filens filändelse som http-handler i Web.Config och mappa filändelsen mot EPiServers StaticFileHandler, som finns i EPiServer.Web.StaticFileHandler. Så här:

<add path="*.swf" verb="GET,HEAD" type="EPiServer.Web.StaticFileHandler, EPiServer" />

Notera att EPiServers StaticFileHandler är ett substitut för System.Web.StaticFileHandler. Stöter du på problem med filhanteringen i EPiServer kan det vara värt att testa StaticFileHandler:n i ASP.NET i stället.

Automatisk inloggning på en EPiServer-webbplats

Det finns vissa fall när du vill att inloggningen till en EPiServer-webbplats ska ske automatiskt, exempelvis när det handlar om ett intranät. Det som då behövs är att göra inställningar i IIS och i Web.Config för webbplatsen.

IIS-inställningar

I IIS, gå in i egenskaperna för din webbplats. Välj Directory Security -> Edit (under Anonymous access and authentication control) och se till följande:

  • Anonymous access ska ej vara ikryssat
  • Digest authentication och Basic authentication ska inte heller vara ikryssat
  • Integrated Windows authentication ska vara ikryssat

Bild på inställningar för Authentication Methods i IIS

Web.Config-inställningar

I Web.Config för EPiServer-webbplatsen behövs följande:

  • WindowsRoleProvider ska användas för rollhantering
  • Windows-autentisering ska vara aktiverat

Använd WindowsRoleProvider

Under <system.web> finns elementet roleManager där du kan ange ett antal inställningar för vilken rollhantering som ska användas på webbplatsen. WindowsRoleProvider ska vara standardhanteraren. Så här ska sektionen i Web.Config se ut:

<system.web>
<roleManager enabled="true" defaultProvider="WindowsRoleProvider" cacheRolesInCookie="true">
<providers>
<clear />
<add name="WindowsRoleProvider" applicationName="EPiWebsite" type="EPiServer.Security.WindowsRoleProvider, EPiServer" />
</providers>
</roleManager>
</system.web>

Det är även en god idé att elementet membership (ligger nedanför roleManager i Web.Config) använder sig av WindowsMemberShipProvider.

Windows-autentisering

Det sista steget för att slippa inloggningsrutan till en EPiServer-webbplats är att använda sig av Windows-autentisering i stället för Forms. Det gör du genom att använda dig av elementet authentication:

<authentication mode="Windows" />

Språkhantering på enspråkiga EPiServer-webbplatser och language-attributet

Om du har en enspråkig EPiServer-webbplats så ska du normalt sett kunna surfa in på webbplatsen och se innehållet utan att behöva skriva in exempelvis /en eller /sv efter adressen - det vill säga om du surfar in på www.webbplats.com så ska den automatiskt visa innehållet på rätt språk.

Jag har senast på en enterprisewebbplats med en enspråkig webbplats och flera flerspråkiga webbplatser sida vid sida stött på problem med språkhanteringen.

När jag surfade in på den enspråkiga webbplatsen (www.webbplats.com) så visades fel innehåll. När jag däremot surfade in på www.webbplats.com/en så visades rätt innehåll.

Lägg till language-attributet på site-elementet i Web.Config

Lösningen på problemet är att specifikt sätta språket för webbplatsen i Web.Config. Leta upp <sites> i Web.Config (alternativt episerver.Config om du har separata konfigurationsfiler) och lägg till language="språkid" i site-elementet, så att det ser ut så här:

<sites>
<site language="en" description="My EPiServer website" siteId="MyEPiWebsite">
<siteSettings ...></siteSettings>
</site>
</sites>

Så löser du problemet med EPiServer CMS 5 R2 SP1 och TypeInitializationException

Jag har i dagarna uppgraderat till senaste versionen av EPiServer, nämligen CMS 5 R2 SP1. När jag använder nya Deployment Center för att installera en ny webbplats så fungerade webbplatsen klockrent - men när jag skulle tillbaka till en ännu ej uppgraderad EPi-webbplats stötte jag på problem, nämligen följande:

[TypeInitializationException: The type initializer for 'EPiServer.DataAbstraction.UnifiedPathInfo' threw an exception.

Uppgradera din EPi CMS 5-webbplats till SP1

Efter några om och men tog jag backup på den befintliga EPi-databasen för webbplatsen och använde sedan Deployment Center för att uppgradera webbplatsen till senaste EPiServer-versionen. (I Deployment Center, välj alternativet Upgrade site with SQL Server database -> Run och välj sedan din webbplats under noden som dyker upp.) Då fungerade webbplatsen igen.

Värt att notera

Innan jag uppgraderade till senaste versionen av EPiServer stötte jag dock på ett antal tips som kan vara värda att notera:

På irc-kanalen #epicode fick jag även förslaget att dubbelkolla så att sökvägarna till CMS 5-specifika installationen var korrekta - framför allt se till att inga dubbla snedstreck (alltså \\) dykt upp.

Det kompletta felmeddelandet

Som referens, här är det kompletta felmeddelandet jag fick:

Stack trace:

[TypeInitializationException: The type initializer for 'EPiServer.DataAbstraction.UnifiedPathInfo' threw an exception.]
at EPiServer.DataAbstraction.UnifiedPathInfo.Load(String path)
at EPiServer.FileSystem.DefaultAccessControlList..ctor(String path)
at EPiServer.Web.Hosting.DirectoryAccessControl..ctor(String virtualPath)
at EPiServer.Web.Hosting.UnifiedDirectory.get_DirectoryAC()
at EPiServer.Web.Hosting.UnifiedDirectory.QueryAccess()
at EPiServer.Web.Hosting.UnifiedDirectory.QueryDistinctAccess(AccessLevel access)
at EPiServer.Web.Hosting.VirtualPathVersioningProvider.GetDirectory(String virtualPath)
at EPiServer.Web.Hosting.VirtualPathHandler.InitializeProviders(ProviderSettingsCollection providers)
at EPiServer.Web.InitializationModule.InitializeVirtualPathProviders(VirtualPathElement vpElement)
at EPiServer.Web.InitializationModule.Initialize(EPiServerSection config, Settings settings, ConnectionStringSettingsCollection connectionStringSettings)
at EPiServer.Web.InitializationModule.StaticInitialization()
at EPiServer.Web.InitializationModule.Application_BeginRequest(Object sender, EventArgs e)
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

[Inner exception TypeInitializationException: The type initializer for 'EPiServer.CacheManager' threw an exception.]
at EPiServer.StaticCacheKey.EnsureKey()
at EPiServer.StaticCacheKey..ctor(String keyName)
at EPiServer.DataAbstraction.UnifiedPathInfo..cctor()

Att byta standardspråk på en enspråkig EPiServer-webbplats

Om du har en EPiServer-webbplats som är enspråkig så är det troligt att språket som är valt är standardspråket för EPiServer - det vill säga engelska. Detta medför att CultureInfo för webbplatsen är en-GB vilket i sin tur genererar bland annat fel format för datum - om innehållet på webbplatsen är på ett annat språk än engelska.

Ändra standardspråk i EPiServer-databasen

Det smidigaste sättet att sätta ett standardspråk i EPiServer är att gå in databasen för webbplatsen och ändra i tabellen tblLanguageBranch:

  1. Använd SQL Server Management Studio för att leta upp din EPiServer-databas och leta upp tabellen tblLanguageBranch.
  2. Högerklicka på tblLanguageBranch och välj Open Table.
  3. Om du har en enspråkig webbplats visas en rad där LanguageID-kolumnen har en-GB som värde. Byt ut en-GB mot sv-SE (eller ditt val av standardspråk) och gå ut ur tabellen igen. Klart!

Så här ska tabellen se ut om du har satt svenska som standardspråk för webbplatsen:

Tabellen tblLanguageBranch i EPiServer

Observera att detta är gjort på EPiServer CMS 5 R2 och inte testat i en annan EPiServer-version.

Till sidhuvudet

Clicky Web Analytics