Jeg er i gang med at udvikle en Silverlight applikation, hvor jeg gerne vil vise at applikationsstakken ikke nødvendigvis behøver være Microsoft bare fordi front-enden er det.
Så nu hedder applikationsstakken WCF som kommuikationslag, Castle Windsor som IOC/DI Container, Log4Net som logger, Fluent Nhibernate med NHLinq som OR-mapper og til sidst MySQL som primær Database provider, men SQLite til ”Unit-Test” samt i udviklingsmiljø.
Den positive nyhed først: ”Løsningen kører nu i medium trust i shared hosting”, men jeg har haft stærkt brug for min stædighed for at nå dertil :)
Grunden til at jeg bliver nød til at skrive herom er at jeg endnu ikke er løbet på andre der har kunnet sige dette samme - i hvert fald ikke om FluentNHibernate.
Moralen til jer der ikke har lyst at læse om detaljerne er en gammel kending: ”Kend dit deployment miljø og release dertil fra start”. Det var ikke oprindeligt planen at løsningen skulle releases i shared hosting, så for mig har det været et dejligt lille eventyr på bagkant, som jeg gerne ville have løst undervejs i små bider. I nævnte applikationsstak har jeg haft udfordringer med samtlige bestanddele hvilket også har overrasket mig en del.
Medium trust
Hos de billigere hosting-udbydere vil dine applikationer som regel kun få lov at køre under et begrænset sikkerhedsniveau ide der hostes mange løsninger på samme maskine. De fleste tillader ikke mere end medium-trust, hvor det første du skal sikre dig er:
[assembly: AllowPartiallyTrustedCallers]
For at et assembly overhovedet får lov til at blive loaded af .NET-runtimet som kører i medium trust er det et krav at alle assemblies er kompileret med attributten AllowPartiallyTrustedCallers.
Nemmeste måde at tjekke det på er ved hjælp af reflector:

Castle Windsor kan bygges i en mode hvor dette flag sættes, MEN! Der vil stadig være et problem med dynamicProxy som muligvis er løst hvis du tjekker trunk versionen ud og bygger den. Men det jeg endte med at gøre var at hente denne version. Det opløftende her var at jeg fandt løsningen hos Martijn Boland, som var den første der udviklede et CMS Cuyahoga som kunne køre på MONO. Det brugte jeg selv for nogle år siden – både til egen side og en løsning jeg lavede til en motorcykel-forhandler.
Fluent NHibernate er afhængig af NHibernate som er afhængig af Castle Windsor. Derfor måtte jeg tjekke kildekoden ud til FluentNNHibernate samt Linq og kombilere disse op imod NHibernate 2.1.2.4 overskrevet med omtalte version af Castle. Den stabile version af NHibernate havde et problem i kombination med MySQL.
Der ud over måtte jeg slå reflection optimizeren fra i FluentNHibernate, selvom Martijn ikke nævner at have gjort dette.
Environment.UseReflectionOptimizer = false;
Men jeg har på fornemmelsen at Automapperen i FluentNHibernate benytter denne på en måde så det går galt. Her gav jeg op i at finde en begrundelse men var bare glad for at jeg ikke skulle ændre andet :)
MySQL 6.2.1.0 benyttede jeg i den binære udgave og virkede med ovennævnte udgave af NHibernate.
Log4Net loggede intet i starten. Dette skyldes at der på sektioner i web.config tilmed skal sættes trust-level:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" allowDefinition="Everywhere"/>
Tilmed er APP_DATA bedste folder til formålet. Det er ikke altid du får lov at skrive andre steder.
SQLite kan ikke køre i medium trust, da den er afhængig af en native win32 dll som godt nok er indeholdt i System.Data.SQLite.DLL. Da jeg kun bruger SqLite til udvikling og test var dette ikke noget stort problem. Dog har jeg måtte undgå referencen fra mit projekt til denne dll og isedet kopiere den ind i bin output bin mappen efter behov. For bare det at den ligger i bin mappen ved deployment giver problemer.
Shared Hosting og WCF
I et shared hosting setup kan der være flere baseadresser der peger på samme ressource. Dette kan give problemer som gør at WCF ikke kan instanciere din sevice host. Min løsning var at implementere min egen ServiceHostFactory.
Puha. Selvom jeg har undladt en masse detaljer føler jeg trætheden kommer i gang fra dengang jeg brugte adskillige timer på disse problemer. Så derfor understrejer jeg lige igen. Nu virker det!
Selvom der har været en del problemer synes jeg alligevel også det er fedt, at man rent faktisk kan få en professionel applikationsstak op og køre i et billigt shared hosting enviroment. Så med denne post i baghånden er der ingen undskyldning for ikke at bruge alle de lækre open source komponenter der ligger derude og venter på at blive downloaded :)