Až doposud jsem si myslel, že nasazení ASP.NET aplikací je snadnou až triviální záležitostí. Podle všech reklamních sloganů i logiky architektury ASP.NET by měl fungovat zázrak jménem xcopy deployment, zvlášť když nový SQL Server 2005 umožňuje databáze jednoduše nahrát jako jeden nebo několik MDF souborů. Jak ale vypadala realita, když jsem někde na netu potřeboval zprovoznit ASP.NET aplikaci do školy?
Začal jsem na svém hostingu, kde ASP.NET a SQL Server 2005 Express běží někdy od listopadu. Jakýkoliv pokus o práci s databází však končil chybou „Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed.“ Asi hodinu jsem se problém snažil řešit s pracovníkem podpory, na webu jsem pročetl mnoho článků a diskuzních fór, ale vše bez úspěchu (mezi nejlepší zdroje patřil článek Tomáše Petříčka Nejčastější chybové hlášky SQL Express 2005 a diskuze na MSDN forums). Chyba je kdoví kde – možná jsou na nějaký soubor špatně nastavená práva, možná by pomohla reinstalace, ale jisté bylo jen to, že na mém hostingu aplikaci zřejmě nezprovozním.
I zavítal jsem na stránku LCD za web, kde byly odkazy na 4 freehostingové služby, jmenovitě ASPWEB.cz, ASP2.cz, ASPX.sk a Quantasoft. ASP2.cz se mi nepodařilo rozchodit vůbec, aspx.sk mělo nekompatibilní verzi SQL Express, takže zbyly ASPWEB.cz a Quantasoft. Na Quantasoftu jsem poprvé okusil úžasný pocit, když se aplikace rozběhla a dokonce zobrazila data z mého souboru Inventory.mdf. Stejně daleko jsem se dostal i na aspwebu.
Zakopaný pes byl ale na všech hostinzích s přihlašováním do aplikace. Tato část využívá membership služby ASP.NET 2.0 (počtěte si ve fajnovém článku Scotta Mitchella), tedy databázi ASPNETDB.MDF. A s tou byl kříž. V pravidelných intervalech jsem zkoušel změnit membership providera v souboru web.config, hledat nějakou pomoc na Googlu a mlátit hlavou o stůl, ale nic nepomáhalo. Chyba „An attempt to attach an auto-named database for file I:\…\App_Data\aspnetdb.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.“ ne a ne zmizet. Rady v různých diskuzích byly většinou z cesty, až mě napadlo podívat se, jak to řeší Personal Web Site Starter Kit. A to mě zachránilo. Postup, jak rozchodit ASP.NET aplikaci na sdíleném hostingu, by tedy měl být následující:
- Do všech connection stringů přidat Database=cokoliv_unikatniho. Tím se zamezí konfliktu jmen a chybě „database with the same name exists, or specified file cannot be opened, or it is located on UNC share“
- Upravit connection string k ASPNETDB databázi. To lze udělat vložením následujícího kódu do souboru web.config:
<configuration>
<connectionStrings>
<!-- zde jsou nějaké vlastní connection stringy -->
<remove name="LocalSqlServer"/>
<add name="LocalSqlServer"
connectionString="Data Source=.\SQLEXPRESS;
Integrated Security=True;
User Instance=True;
Database=myuniquedb;
AttachDBFilename=|DataDirectory|\aspnetdb.mdf"
providerName="System.Data.SqlClient"
/>
</connectionStrings>
</configuration>
Důležité je nezapomenout na tag <remove
name="LocalSqlServer">
, který odstraňuje defaultně definovaný
connection string k ASPNETDB databázi definovaný v souboru
machine.config.
Po splnění obou dvou bodů se šance na úspěšné nasazení ASP.NET aplikace podstatně zvýší. Jsou to takové maličkosti, nad kterými lze ale strávit hodně času a bez kterých to prostě na sdíleném hostingu fungovat nebude.
Taky jsem se s tímto problémem potýkal, a řešení jsem našel na fóru aspwebu