söndag 27 april 2008

TinyMCE och medium trust i ASP.NET

Det är alltid lite spännande när man laddar upp en ASP.NET-applikation man utvecklat lokalt till en webbhotellsserver. Kanske har man refererat till något användbart bibliotek som inte finns installerat på webbhotellet, kanske försöker applikationen göra något den inte får. Det senare fick jag smaka lite på nyligen.

Bakgrund: TinyMCE är en gratiskomponent för "rich text editing" utvecklad av ett svenskt företag. Den används för att förvandla vanliga textinmatningsrutor till mer Word-lika fält där användaren kan formatera texten lite som han eller hon vill. Mycket smidigt! Om man till exempel gör ett kommentarsformulär för en blogg kan det vara kul att låta sina besökare enkelt skapa länkar eller göra delar av texten fet, kursiv eller understruken, för att ta ett simpelt exempel. WordPress använder det i sitt adminsystem. Det är en bra komponent.

Eftersom TinyMCE i grunden är 100 % Javascript så konfigureras den också genom Javascriptkod. Det kan lätt bli lite kladdigt, och som ASP.NET-utvecklare tycker jag det är trevligt om man kan samla all konfiguration på ett ställe - i Web.config. Detta har såklart Moxiecode (som utvecklar TinyMCE) tänkt på, och har därför tagit fram en .NET-anpassad version av TinyMCE, som bland annat lägger till en configSection i Web.config där man kan göra alla möjliga inställningar för komponenten. Bra initiativ!

När jag senast, och för första gången i ett ASP.NET-sammanhang, skulle använda TinyMCE (version 3.0.7) laddade jag glatt ner .NET-versionen och konfigurerade den enligt de exempel som fanns tillgänliga. Allt fungerade som en dröm lokalt, men när jag laddade upp min lilla applikation till utrymmet jag hyr av Loopia så smällde det direkt:

Required permissions cannot be aquired.

Whaa? Vad har jag gjort för fel? Inget! Det visar sig att TinyMCE-assemblyn i min bin-katalog kräver "full trust" för att kunna kompileras och köras. Vilket är något som Loopia inte tillåter - i likhet med många andra webbhotell så kör de sin hostingmiljö i "medium trust", vilket innebär att de hostade applikationerna inte kan ta sig vilka friheter som helst. Jag förstår dem till fullo - jag skulle göra likadant.

Låt oss då ta ett steg tillbaka och fråga oss vilken del av TinyMCE det är som gör att komponenten som helhet skulle behöva "full trust". Det är ju en Javascriptkomponent (så står det till och med på utvecklarens hemsida - "100 % Javascript"). Javascript = klientsideteknik. Varför kräver den en massa rättigheter på serversidan?

Min gissning är att det beror på att de bakat in sin så kallade "GZIP Compressor", hädanefter kallad "Ulf", i .NET-versionen av komponenten. Ulf bygger i sin tur på SharpZipLib som enligt uppgift ska kräva "full trust". Ulf är förvisso användbar och ska enligt utvecklaren minska den överförda storleken på TinyMCE med cirka 75 % vilket ju är bra.

Lösning: Jag Googlade som en tok för att hitta någon form av lösning på det här problemet, men hittade inget vettigt. Verkar helt sjukt att ingen stött på det tidigare (alternativt så suger jag obeskrivligt mycket som inte direkt ser hur man fixar det). Vad jag dock av en händelse testade var att ladda hem källkoden till .NET-komponenten, kompilera om den och referera till den istället för till den färdigbyggda assemblyn som jag tidigare använt. Poff - "full trust"-kravet var som bortblåst.

Alltså:
  1. Ladda ned det utvecklaren kallar ".NET Package".
  2. Öppna solution-filen och bygg den med Release-konfigurationen.
  3. Kopiera den resulterande Moxiecode.TinyMCE.dll-filen till din webbapplikations bin-katalog (eller var du nu föredrar att lägga den) och referera till den.
  4. Ladda upp din applikation till ditt webbhotell och kör så det ryker!
Det är högst troligt att denna manuella manöver inte kommer att vara nödvändig länge till - Moxiecode fixar nog det där snart. Men nu vet du hur jag fick göra!

4 kommentarer:

  1. Hade precis samma problem men hos Binero som också kör medium trust. Höll precis på att de upp när jag googlade fram ditt inlägg. Funkar kanon när man bygger ddl-en själv. Tack för tipset!

    SvaraRadera
  2. hi .. dess arbetat Tack så mycket, jag hade detta problem sedan 1 månad och 3 av mina arbetsdagar webbplatser blockeras. Tack för att du lösning ........

    SvaraRadera
  3. weird, I had this happen to me when I upgraded to windows 7. Was working fine on my live site and in my vista dev box but got the dreaded PolicyException after upgrading. Thanks for the fix!

    SvaraRadera