ASP.NET Web Pages aneb jak Microsoft nechává vyniknout PHP

Když Microsoft před časem uvedl ASP.NET Web Pages, nebylo žádným tajemstvím, že se jedná o přímou alternativu k “hrůzám” typu PHP nebo klasickému ASP (ty hrůzy píšu záměrně v uvozovkách, tak jen PHPko vidí řada .NET vývojářů). Web Pages jdou, podobně jako jeho předobrazy, na tvorbu stránek přímočaře – žádné abstrakce nad HTML/HTTP jako u Web Forms, žádné patterny, routy apod. jako v případě MVC, prostě se kód začne vykonávat seshora dolů a jen se občas provede nějaká ta dynamická instrukce.

Asi nejlépe je podobnost vidět na kódu:

// PHP
<p>Dnes je <?php echo date(...) ?></p>

// ASP.NET Web Pages
<p>Dnes je @DateTime.Now</p>

Podoba tedy velká a navíc mají Web Pages, aspoň z teoretického pohledu, rozhodně co nabídnout:

  • Dynamická část stránky může používat .NET.
  • Syntaxe vychází z (nebo v některých sekcích je) C#.
  • Kombinace ASP.NET + IIS je pro mě daleko čitelnější a předvídatelnější než PHP + Apache (tam jsem v minulosti často řešil, proč mi lokálně skvěle fungující aplikace po nasazení ukazuje chyby; u ASP.NET + IIS tohle skoro neznám, až na výjimky, viz níže).
  • V nástrojích funguje napovídání, což platí jak ve Visual Studiu, tak ve WebMatrixu. Poměrně komfortní nástroje jsou navíc k dispozici zdarma.

Pokud tedy člověk tíhne k .NETímu světu, což třeba můj případ je, vypadají Web Pages jako jasná volba. A Microsoft chtěl, aby to byla jasná volba.

Jenže pak přijdou maličkosti. Třeba ten zápis proměnných pomocí zavináče – na první pohled je to úspornější než v PHP, ale tam je aspoň zcela jasno, kde blok PHP začíná a kde končí. U výrazu @DateTime.Now</p> musí parser “uhodnout”, že výraz končí před špičatou závorkou. Tady konkrétně to není nic složitého, ale co když byste za slovem Now nechtěli uzavírat odstavec, ale třeba pokračovat tečkou a nějakým dalším slovem? Spadne parser nebo nespadne? (Spadne.) Když bude zavináč součástí emailové adresy, spadne parser nebo nespadne? (Nespadne.) Když budete chtít do stránky zapsat Twitter jméno typu @borekb, spadne parser nebo nespadne? (Spadne, musí se použít @@). Dá se Twitter username rovnou zapsat do HTML atributu? (Nedá, parser spadne a escapování dvěma zavináči tentokrát nefunguje, musí se použít jiný zápis.)

Prostě když zabřednete do detailů, začne být kontextové vyhodnocování zavináče spíš nepříjemnost než pomůcka. Navíc jsem pravidla nikde na MSDN nenašel striktně popsané, což celou věc ještě komplikuje (musíte se spoléhat na blog posty nebo vlastní experimentování).

To je ale ještě relativně maličkost. Co se mi nelíbilo podstatně víc, byl boj s Web Pages, když jsem chtěl přidat jednoduchoučkou funkcionalitu do jednoho mikrowebu (v podstatě jsem potřeboval jeden if, který určitý HTML fragment vloží v závislosti na doméně). Tohle by měl být hlavní use case pro Web Pages (nebo PHP nebo něco podobného), ale bylo to nepříjemně komplikované – posuďte sami.

Výchozím stavem je tedy složka, kde je soubor index.html a pak pár dalších CSS / JS / JPEG souborů, nic dalšího. Prostě miniaturní statický webík, do kterého jsem potřeboval přidat špetku dynamiky.

Nejdřív jsem tedy HTML soubor přejmenoval na *.cshtml, aby byl jako dynamický rozpoznán (ekvivalent toho, kdybych ho ve světě PHP přejmenoval na index.php). Přidal jsem kousek kódu, který jsem potřeboval, a teď už samozřejmě nešlo HTML soubor jen tak otevřít, byl potřeba nějaký lokální webový server (stejně jako u PHP). Tohle má Microsoft naštěstí dobře pořešené, vše potřebné obsahuje nástroj WebMatrix odkazovaný výše, takže jsem naimportoval složku, dal run a… – spadlo to na nějaké chybě. Ok, chyběl mi stadardní ASP.NETí soubor web.config, tak jsem přidal přesně stejný, jaký WebMatrix tvoří pro nové projekty podle šablony, a spadlo to znovu – tentokrát kvůli chybě “Could not determine which version of ASP.NET Web Pages to use”. Někde jsem našel, že je do web.configu potřeba přidat toto:

<appSettings>
    <add key="webPages:Version" value="2.0" />
</appSettings>

Hurá, lokální web server se rozběhl, ale pro změnu byla rozbitá diakritika, ačkoliv HTTP hlavičky i kódování zdrojových souborů bylo korektně nastavené na UTF-8. Další půl hodina googlení a výsledkem bylo, že je buďto nutno zdrojové soubory přeuložit do UTF-8 s BOM (OT: nesnáším BOM!), nebo přidat tohle do web.configu:

<globalization fileEncoding="utf-8" />

Sláva, po perných chvilkách plných rozčilování mi web konečně zase běhal na lokálu.

Když jsem ho odladil a byl čas na deploy, vzpomněl jsem si na Azure Web Sites, jak maj hezký Git deploy apod., takže jsem si založil novou Web Sajtu, nakonfiguroval deployment, pushnul a… zase to na něčem spadlo. Bylo to možná proto, že index.cshtml není v 10seznamu automaticky zobrazovaných souborů (stadardně tam jsou index.html, Default.aspx a podobně), tak jsem vlezl do administrace, našel tam odpovídající sekci a index.cshtml přidal. Což vedlo k další chybě, “This type of page is not served.”

Tady jsem toho měl dost. Po další chvilce googlení a dotazů na Stack Overflow se mi dostalo rady, ať udělám Web Deploy z WebMatrixu a kašlu na Git, což taky nakonec zafungovalo. Důvod byl patrně v tom, že standardní projekt má u sebe složku bin a App_Data a v nich kupu DLLek, což jsem u projektu transformovaného z jednoduchého statického webu neměl (a na lokále to ani nebylo potřeba).

Pro srovnání, co bych musel udělat v PHP, kdybych potřeboval udělat úplně to samé? Změnil bych index.html na index.php, přidal potřebný kousek kódu, vytvořil Azure Web Site, pushnul a bylo by hotovo.

Tím nechci ASP.NET a celý ekosystém okolo úplně pohanět, PHP má své problémy a osobně je vnímám jako výraznější, než to, že jsem se takovou dobu s*al se zprovozněním jednoho blbého mikrowebu, ale to si fakt člověk říká, jestli chce Microsoft vývojáře nalákat nebo odradit. Web Pages jsou úplně novou technologií, jejímž cílem je právě nízká nebo nulová bariéra vstupu pro kohokoliv, ať už pro stávající .NET vývojáře nebo i pro nově příchozí. Microsoft měl každou příležitost udělat to skutečně jednoduché a bezbolestné, navíc jsem deployoval ne na nějaký pochybný hosting, ale přímo k nim do Azure, a přesto to byl proces, který mi zabral dvě hodiny.

Takže poučení, minimálně pro mě, pro příště? Pokud budu chtít stránky obohatit o nějakou drobňoučkou logiku, sáhnu po PHP. Because it just works.

10 thoughts on “ASP.NET Web Pages aneb jak Microsoft nechává vyniknout PHP
  1. Existuje racionální důvod, proč nemít rád BOM? Tedy kromě toho, že ho neumí PHP?
    Mě přijde daleko rozumnější, když na začátku souboru je informace o kódování, než když ho musí parser věštit. Já bych BOM zavedl povinný.

  2. Mně vadí spíš situace kolem BOMu než těch pár bajtů samotných. BOM měl být buď všude, nebo nikde, ale dnešní situace je vážně otravná – čas od času ztratím hodinu nebo dvě kvůli tomu, že něco BOM podporuje, něco ho vyžaduje, něco ho mít nesmí apod.

    Nepíšu to vyloženě jako problém ASP.NET, ale je fakt, že mi připadá, že zbytek světa funguje v pohodě bez BOMu, jen .NET / VS ho tlačí a občas skoro i “vyžaduje” na místech, kde to není nutné.

  3. Souhlas, až na to “na místech, kde to není nutné” – s tím mám právě problém, podle mě je to nutné všude. Bez BOM nikdy s jistotou neurčíš, jestli jde o UTF-8 soubor nebo ne. Sice se s 99% pravděpodobností trefíš, ale stejně.

  4. Imho je dost nefér srovnávat syntaxi čistého PHP a šablonovacího jazyka ASP.NET Web Pages. Kdyby ti to servírovalo třeba Nette, tak bys tam měl {=date(...)} a bez zavináčové magie a se správným kontextovým escapováním ;)

  5. Borku, a kolik z těhle problémů bys byl ušetřen, kdybys založil ten projekt rovnou jako “dynamický” a nakopíroval do něj ty stávající soubory?

    Jinak ale musím souhlasit, že Razor je i pro mě “nedeterministický” :(

  6. Filip: Byla to jen ukázka a možná ne úplně dobře zvolená, mě šlo o podmíněné vložení určitého kusu HTML, a tam už ani tak nejde o šablonovací jazyk (Razor vs. Latte) jako spíš o tu dynamickou technologii samotnou (ASP.NET Web Pages vs. PHP). Dík za doplnění.

  7. Augi: hodně a trochu jsem to zvažoval. Nicméně už ze zvědavosti jsem to chtěl udělat touhle cestou, protože Microsoft poslední dobou tlačí ideu, že .NET jsou teď “kostičky lega”, které se dají skládat dohromady a v jednom projektu klidně míchat více technologií, začít s jednou, přidat další atd. Tak jsem začal se statickým webem a chtěl přidat “kostičku” Web Pages a tady to teda pekelně dřelo. MS by si měl uvědomit, že kostičky se nepřidávají pomocí File > New Project.

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax