👋 Nový obsah na borekb.cz

Info Tento blog je v "read-only módu" a nový obsah již nebude přibývat. O vývoji píšu na DevBlog.

Nasazení ASP.NET aplikace využívající SQL Server Express na běžném hostingu

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=coko­liv_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.

Zařazeno do kategorií |
Josef Rousek (Ne, 2006-01-22 13:37):

Taky jsem se s tímto problémem potýkal, a řešení jsem našel na fóru aspwebu

Peter (St, 2006-03-29 11:31):

Chlape, tak to mas u mna. Potykal som sa s rovnakymi problemami, teraz vsetko slape. Stacilo ako si pisal, dat kazdemu connectionstringu unikatne meno a pripojit k nemu tu sekciu s aspnet.mdb

Vazne dik za tvoj blog.

Borek (St, 2006-03-29 13:04):

2 Peter: Rádo se stalo.

Daniel Steigerwald (Čt, 2006-04-20 02:02):

Taky sem to řešil :) Problémem je defaultní cesta k souboru databaze, jez je umistena v machine configu, kde by ji nikdo nehledal. Pekna pastička, tak na hodinu googlovani.

Borek (Čt, 2006-04-20 10:20):

Taky jsem dobu Googloval, než mě napadlo podívat se, jak to řeší webové starter kity.

Fitik (Út, 2006-06-27 19:56):

Uvedeny navod pomohl na strane externiho hostingu. Diky. Objevila se mi ale chybka s tim spojena. Kdyz jsem zadal Database=mojedb, tak to sice funguje na hostingu, ale dela to chybu u me na lokale, pokud v Server Exploreru (Visual Studio) jen otevru tu svoji databazi (je to teda defaultni ASPNETDB.MDF) hodi to pak pri otevreni stranek chybu: Exception Details: System.Data.SqlCli­ent.SqlExcepti­on: Cannot open database „mojedb“ requested by the login. The login failed. Login failed for user ‚jmeno windows usera‘. Nevi nekdo co s tim? Diky..

Anonymous (Út, 2007-05-01 14:27):

Mal som podobny problem s freehostingom na aspweb.cz… Co sa tyka supportu je to tam hroza, chcel som vyskusat server pred tym ako si vyberiem platenu verziu… ...chcelo by to zopar prikladov ako nastavit web config.

Priklad: pouzivam VS2005 cize .NET 2.0 ale pouzil som free verziu sql2000, rozbehat to bez navodu…uff par hodin som sa potrapil stym co bezne na severoch riesim par minut.

Pritom stacilo vypnut integrated security na False… stacilo na to upozornit niekde v helpe…

<connectionStrings> <remove name=„LocalSqlSer­ver“ /> <add name=„LocalSqlSer­ver“ connectionStrin­g=„Data Source=mssqlser­ver;database=db0000;In­tegrated Security=False­;Connect Timeout=120;u­ser=usr_db000;pas­sword=test;“ providerName=„Sys­tem.Data.SqlCli­ent“ /> </connectionStrin­gs>

rarouš (Pá, 2007-05-04 15:42):

Tak dneska jsem tvůj návod také upotřebil, děkuji :)

Fantomasmag (Čt, 2007-05-24 20:11):

Díky za pomoc, přeně tohle jsem Googlil až jsem to našel na tvým blogu ;-)

Jack (Po, 2007-11-26 23:04):

No ja stale hledam a nenachazim reseni jak zprovoznit databazi na asp2.cz , vyzkousel sem kde co ale proste nejde, nekdo naky napad?

Anonymous (So, 2009-04-18 21:04):

Díky za to, konečně mi ASPNETDB.MDF šlape:-)

Komentáře jsou uzavřeny (blog je v read-only módu). Pokud mě chcete kontaktovat, můžete mailem.