<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>!FrAgile Thinking &#187; Routing</title>
	<atom:link href="http://blog.jendrusz.pl/tag/routing/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jendrusz.pl</link>
	<description>Software Development, Agile, Microsoft .NET, Muzyka</description>
	<lastBuildDate>Thu, 23 Jul 2009 13:11:23 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.jendrusz.pl' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/8887127bb14be5b999f37b1921b33c0a?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>!FrAgile Thinking &#187; Routing</title>
		<link>http://blog.jendrusz.pl</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.jendrusz.pl/osd.xml" title="!FrAgile Thinking" />
	<atom:link rel='hub' href='http://blog.jendrusz.pl/?pushpress=hub'/>
		<item>
		<title>Pierwsze spojrzenie na ASP.NET MVC &#8211; od wnętrza</title>
		<link>http://blog.jendrusz.pl/2009/01/16/pierwsze-spojrzenie-na-aspnet-mvc-od-wnetrza/</link>
		<comments>http://blog.jendrusz.pl/2009/01/16/pierwsze-spojrzenie-na-aspnet-mvc-od-wnetrza/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 10:07:59 +0000</pubDate>
		<dc:creator>jenrom</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Front Controller]]></category>
		<category><![CDATA[Routing]]></category>

		<guid isPermaLink="false">http://blog.jendrusz.pl/?p=159</guid>
		<description><![CDATA[Główna zaletą a jednocześnie wadą frameworków udostępnionych przez Microsoft jest to, że ich domyślna konfiguracja pozwala na bezproblemowe rozpoczęcie z nimi przygody. Prowadzi to do tego, że aplikacje oparte o te frameworki, wdrożone na środowisku produkcyjnym często korzystają z zbędnych funkcjonalności. Tak też jest z ASP.NET MVC. Plik web.config nowo stworzonego projektu ASP.NET MVC posiada [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jendrusz.pl&blog=5537249&post=159&subd=jendrusz&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Główna zaletą a jednocześnie wadą frameworków udostępnionych przez Microsoft jest to, że ich domyślna konfiguracja pozwala na bezproblemowe rozpoczęcie z nimi przygody. Prowadzi to do tego, że aplikacje oparte o te frameworki, wdrożone na środowisku produkcyjnym często korzystają z zbędnych funkcjonalności. Tak też jest z <a href="http://www.asp.net/mvc/">ASP.NET MVC</a>.</p>
<p>Plik web.config nowo stworzonego projektu ASP.NET MVC posiada w większości przypadków niepotrzebne rejestracje <a href="http://codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx">modułów </a>i <a href="http://codebetter.com/blogs/karlseguin/archive/2006/05/24/145397.aspx">handlerów</a>, pozwalających przykładowo na korzystanie z ASP.NET Ajax. Ponieważ poznając każdą nową technologię staram się &#8222;przegryźć&#8221; prze jej wnętrze, pierwszym z moich kroków w przypadku ASP.NET MVC było przejrzenie kodu, który jest odpowiedzialnie za podstawową realizację zapytania. Po krótkiej analizy wywnioskowałem, że jedynym elementem, który jest rzeczywiście wymagany w pliku web.config do uruchomienia aplikacji ASP.NET MVC jest moduł <strong><a href="http://msdn.microsoft.com/en-us/library/system.web.routing.urlroutingmodule.aspx">System.Web.Routing.UrlRoutingModule</a>.</strong> Dlatego w zależności od trybu puli aplikacji, na której hostowana jest nasza aplikacja, wymagane jest pozostawienie następujących wpisów w pliku web.config:</p>
<p>- w przypadku <strong>managed pipeline mode: Integrated</strong> (dostępny od wersji 7.0 usługi IIS)</p>
<pre class="brush: xml;">
&lt;configuration&gt;
	&lt;system.webServer&gt;
		...
    &lt;modules runAllManagedModulesForAllRequests=&quot;true&quot;&gt;
			&lt;remove name=&quot;UrlRoutingModule&quot;/&gt;
			&lt;add name=&quot;UrlRoutingModule&quot; type=&quot;System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot;/&gt;
		&lt;/modules&gt;
	&lt;/system.webServer&gt;
&lt;/configuration&gt;
</pre>
<p>- w przypadku<strong> managed pipeline mode: Classic</strong></p>
<pre class="brush: xml;">
&lt;configuration&gt;
	&lt;system.web&gt;
    ...
		&lt;httpModules&gt;
			&lt;add name=&quot;UrlRoutingModule&quot; type=&quot;System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&quot;/&gt;
		&lt;/httpModules&gt;
	&lt;/system.web&gt;
&lt;/configuration&gt;
</pre>
<p>Więcej na temat możliwości i różnic wyżej przedstawionych trybów puli aplikacji można znaleźć <a href="http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis7/">tutaj</a>.</p>
<p>Wszystko super, ale po co nam ten UrlRoutingModule?<br />
Aby to zrozumieć należy zapoznać się  z zasadą działania wzorca <a href="http://msdn.microsoft.com/en-us/library/ms978723.aspx">Front Controller</a>, który został zastosowany w ASP.NET MVC. Front Controller jest wzorcem często stosowany w aplikacjach webowy. W jego odpowiedzialności leży obsługiwanie wszystkich zapytań przychodzących do aplikacji i wywoływania komend(operacji) odpowiadającym tym zapytaniom.</p>
<address class="mceTemp mceIEcenter"> </address>
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><img class="size-full wp-image-165" title="frontcontroller_seq_diagram" src="http://jendrusz.files.wordpress.com/2009/01/frontcontroller_seq_diagram.gif?w=450&#038;h=230" alt="Zachowanie wzorca Front Controller" width="450" height="230" /></dt>
<dd class="wp-caption-dd">
<address>Działanie wzorca Front Controller</address>
<address>źródło: http://i.msdn.microsoft.com/ms978723.Des_FrontController_Fig02(en-us,MSDN.10).gif</address>
</dd>
</dl>
<p>Powyższy diagram przedstawia standardowy scenariusz obsługiwania zapytania przy pomocy Front Controllera .<br />
Klient wysyła zapytanie, które jest obsługiwane przez <strong>Handler</strong>. Handler dokonuje operacji wspólnych do wszystkich zapytań a następnie na podstawie adresu URL decyduje, którą z dostępnych komend(<strong>Command</strong>) wywołać. Komenda ta z kolei odpowiedzialna jest za wywołanie określonej logiki biznesowej i za przekierowanie do odpowiedniego widoku(<strong>View</strong>). Ten zaś na podstawie informacji przekazanych przez komendę, generuje stronę, która następnie zwracana jest do klienta.</p>
<p>Interesującym nas elementem w powyższym diagramie jest Handler, którego funkcjonalność w ASP.NET MVC częściowo realizowane jest właśnie przez UrlRoutingModule.</p>
<p>UrlRoutingModule odpowiedzialny jest za znalezienie obiektu typu <a href="http://msdn.microsoft.com/en-us/library/system.web.routing.routedata.aspx"><strong>RouteData</strong></a>, który przechowuje informacje o trasie odpowiadającej adresowi URL obsługiwanego zapytania. Trasa to nic innego jak szablon adresu URL, w którym można zdefiniować parametry. Na podstawie tych parametrów możliwe jest wyszukiwanie potrzebnych nam informacji z adresu URL obsługiwanego zapytania odpowiadającego wybranej trasie. Możliwe trasy są domyślnie definiowane w trakcie startu aplikacji, poprzez dodawanie ich do kolekcji <a href="http://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.aspx"><strong>RouteCollection</strong> </a>w pliku global.asax. Ta kolekcja wykorzystywana jest właśnie przez UrlRoutingModule w celu wcześniej wspomnianego wyszukiwania trasy. Następnie wykorzystując  znaleziony obiekt RouteData (dokładniej mówiąc obiekt implementujący interfejs  IRoutingModule udostępniony przez RouteData), moduł UrlRoutingModule uzyskuje dostęp do obiektu implementującego interfejs <a href="http://msdn.microsoft.com/en-us/library/system.web.ihttphandler.aspx"><strong>IHttpHandler</strong> </a>odpowiedzialnego za dalszą realizację zapytania.</p>
<p>W przypadku ASP.NET MVC jest to najczęściej obiekt klasy <strong>MvcHandler</strong>. Ta klasa realizuje pozostałe funkcjonalności Handlera w wzorcu Front Controller. Wywołuje ona odpowiednią komendę, wykorzystując do tego informacje udostępnione przez obiekt klasy <a href="http://msdn.microsoft.com/en-us/library/system.web.routing.requestcontext.aspx"><strong>RequestContext</strong></a>, który jest wstrzykiwany do obiektu MvcHandlera w trakcie jego konstrukcji. RequestContext posiada obiekt RouteData, który jak już wspominałem daje dostęp do informacji związanych z trasą. Jednym z najbardziej kluczowych informacji w tym przypadku jest parametr <em>controller</em>. Służy on do wyznaczenie klasy posiadającej komendę, która zostanie wykonana w celu zakończenia realizacji zapytania. To tłumaczy domyślną postać wzorców adresów URL przy rejestrowaniu tras w global.asax.</p>
<p>routes.MapRoute(</p>
<p>&#8222;Default&#8221;,                                              // Route name</p>
<p>&#8222;{controller}/{action}/{id}&#8221;,                           // URL with parameters</p>
<p>new { controller = &#8222;Home&#8221;, action = &#8222;Index&#8221;, id = &#8222;&#8221; }  // Parameter defaults</p>
<p>);</p>
<p>Jako, że najlepiej chyba do każdego z nas przemawia obraz a nie treść czytana, dołaczam poniżej diagram sekwencji. Diagram ten przedstawia wcześniej wspomnianą interakcję klas wykorzystywanych przez UrlRoutingModule. Pomija on jedynie aspekt związany z wybraniem odpowiedniej komendy przez klasę MvcHandler, dlatego, że jest to temat warty całego postu <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><a href="http://jendrusz.files.wordpress.com/2009/01/urlroutingmodule_sequencediagram2.jpg"><img class="size-full wp-image-181" title="Diagram sekwencji przedstawiający zachowanie realizowane przez UrlRoutingModule" src="http://jendrusz.files.wordpress.com/2009/01/urlroutingmodule_sequencediagram2.jpg?w=455&#038;h=222" alt="Diagram sekwencji przedstawiający zachowanie realizowane przez UrlRoutingModule" width="455" height="222" /></a></dt>
<dd class="wp-caption-dd">
<address class="mceTemp mceIEcenter">Diagram sekwencji przedstawiający zachowanie realizowane przez UrlRoutingModule</address>
</dd>
</dl>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jendrusz.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jendrusz.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jendrusz.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jendrusz.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jendrusz.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jendrusz.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jendrusz.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jendrusz.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jendrusz.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jendrusz.wordpress.com/159/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jendrusz.pl&blog=5537249&post=159&subd=jendrusz&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jendrusz.pl/2009/01/16/pierwsze-spojrzenie-na-aspnet-mvc-od-wnetrza/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8bcd127033469a9da5c4d426782db6cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jenrom</media:title>
		</media:content>

		<media:content url="http://jendrusz.files.wordpress.com/2009/01/frontcontroller_seq_diagram.gif" medium="image">
			<media:title type="html">frontcontroller_seq_diagram</media:title>
		</media:content>

		<media:content url="http://jendrusz.files.wordpress.com/2009/01/urlroutingmodule_sequencediagram2.jpg" medium="image">
			<media:title type="html">Diagram sekwencji przedstawiający zachowanie realizowane przez UrlRoutingModule</media:title>
		</media:content>
	</item>
	</channel>
</rss>