<?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; ASP.NET MVC</title>
	<atom:link href="http://blog.jendrusz.pl/tag/aspnet-mvc/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; ASP.NET MVC</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>Testowanie konfiguracji routingu w ASP.NET MVC</title>
		<link>http://blog.jendrusz.pl/2009/02/20/testowanie-konfiguracji-routingu-w-aspnet-mvc/</link>
		<comments>http://blog.jendrusz.pl/2009/02/20/testowanie-konfiguracji-routingu-w-aspnet-mvc/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 08:16:42 +0000</pubDate>
		<dc:creator>jenrom</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://jendrusz.wordpress.com/?p=223</guid>
		<description><![CDATA[Jedną z największych zalet architektury ASP.NET MVC jest prostota pisania testów jednostkowych, co umożliwia łatwą pracę tym wszystkim, którzy stosują TDD. Zdarzają się jednak przypadki, w których wymagana jest od programisty znajomość „zakamarków” frameworka w celu napisania, wydawałoby się prostego, testu. Jednym z takich przypadków jest testowanie routingu zapytań do odpowiedniej akcji kontrolera. Głównym problemem [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jendrusz.pl&blog=5537249&post=223&subd=jendrusz&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Jedną z największych zalet architektury ASP.NET MVC jest prostota pisania testów jednostkowych, co umożliwia łatwą pracę tym wszystkim, którzy stosują TDD.  Zdarzają się jednak przypadki, w których wymagana jest od programisty znajomość „zakamarków” frameworka w celu napisania, wydawałoby się prostego, testu. Jednym z takich przypadków jest testowanie <a href="http://msdn.microsoft.com/en-us/library/system.web.routing.aspx">routingu</a> zapytań do odpowiedniej akcji kontrolera.</p>
<p>Głównym problemem jest sprzężenie komponentów routingu z klasą HttpContext. Klasa <a href="http://msdn.microsoft.com/en-us/library/system.web.httpcontext.aspx">HttpContext</a> moim zdaniem jest zmorą w przypadku wszystkich testów jednostkowych funkcjonalności wykorzystujących klasy z przestrzeni <a href="http://msdn.microsoft.com/en-us/library/system.web.aspx">System.Web</a>. W przeszłości, pisząc aplikacje oparte o ASP.NET Web Forms zmuszony byłem do tworzenia klasy adoptującej HttpContext, którą w prosty sposób potrafiłem zastąpić na potrzeby testów obiektami <a href="http://xunitpatterns.com/Test%20Double.html">Test Double</a>. W ASP.NET MVC problem ten został wyeliminowany poprzez wprowadzenie klasy <a href="http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase.aspx">HttpContextBase</a>. Mimo to nadal pozostaje problem z tym, że klasa ta posiada zbyt wiele metod i właściwości zwracających często nam potrzebne obiekty. Najczęściej chodzi tutaj o obiekty klas HttpResponse i HttpRequest. Klasy te, podobnie jak klasa HttpContext, posiadają swoje odpowiedniki pozwalające na łatwiejsze testowanie &#8211; <a href="http://msdn.microsoft.com/en-us/library/system.web.httpresponsebase.aspx">HttpResponseBase </a>i <a href="http://msdn.microsoft.com/en-us/library/system.web.httprequestbase.aspx">HttpRequestBase</a>.</p>
<p>To wszystko prowadzi do tego, że testowanie routingu w ASP.NET MVC wymaga z naszej strony dużego nakładu pracy by przygotować odpowiednio obiekty potrzebne do wykonania się testu. Na dodatek to nie koniec problemów. Wykorzystując routing w ASP.NET MVC, jako programiści nie jesteśmy zmuszeni do pisania skomplikowanej logiki, gdyż jedyne co musimy zrobić, to dodać jedną linię kodu domyślnie w klasie Application (global.asax) i już nasze zapytanie HTTP zostanie  przekierowane do odpowiedniej akcji. W testach już tak łatwo nie jest, dlatego, że nie jesteśmy w stanie w prosty sposób sprawdzić, która z metod, będąca naszą akcją, zostanie wywołana. Aby dojść do sposobu pozwalającego na sprawdzenie wyniku, wymagane od nas jest zapoznanie się z operacjami wchodzącymi w skład routingu zapytania, które zostały przeze mnie opisane w jednym z poprzednich <a href="http://blog.jendrusz.pl/2009/01/16/pierwsze-spojrzenie-na-aspnet-mvc-od-wnetrza/">postów</a>, oraz z paroma innymi klasami takimi jak ControllerActionInvoker czy MvcHandler.</p>
<p>W efekcie końcowym stworzymy test podobny do tego jak ten, poniżej, który weryfikują poprawność domyślnej konfigurację routingu.</p>
<pre>
//routes.MapRoute("Default",  "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" }

[Test]
public void should_route_to_the_home_page()
{
var httpContext = MockRepository.GenerateStub();
var httpRequest = MockRepository.GenerateStub();
httpContext.Stub(x =&gt; x.Request).Return(httpRequest);
string testedRequestUrl = "~/Home";
httpRequest.Stub(x =&gt; x.AppRelativeCurrentExecutionFilePath).Return(testedRequestUrl);
var routeData = RouteTable.Routes.GetRouteData(httpContext);
var controllerName = routeData.GetRequiredString("controller");
var actionName = routeData.GetRequiredString("action");
Assert.IsTrue(string.Equals(controllerName, "Home",StringComparison.OrdinalIgnoreCase));
Assert.IsTrue(string.Equals(actionName, "Index", StringComparison.OrdinalIgnoreCase));
}
</pre>
<p>W sumie okazuje się, że test nie jest znów tak trudny jak to się zapowiadało, ale… Zawsze musi być jakieś, ale:). Powyższy test może stwarzać problemy w trakcie refaktoryzacji. Kryteria powyższego testu polegają na porównywaniu ciągu znaków określających nazwę akcji (metody) i nazwę klasy kontrolera, który posiada daną akcję. Problem leży w tym, że ciągi te nie zostaną automatycznie zastąpione przez narzędzia refaktoryzujące takie jak naprzykład Resharper w przypadku zmiany nazwy akcji lub kontrolera.</p>
<p>Istnieje jednak alternatywa i jest ona dostępna w ramach projektu <a href="http://www.codeplex.com/MVCContrib">MVC Contrib</a>. Biblioteka MvcContrib.TestHelper wchodząca w skład tego projektu posiada klasę <a href="http://code.google.com/p/mvccontrib/source/browse/trunk/src/MvcContrib.TestHelper/MvcContrib.TestHelper/RouteTestingExtensions.cs?spec=svn769&amp;r=769">RouteTestingExtensions</a> z metodami rozszerzającymi pozwalającymi w bardzo prosty sposób dokonać odrobinę magii opartej o lambda expressions, co w efekcie pozwoli nam pisać testy takie jak ten poniższy.</p>
<pre>
[Test]
public void should_route_to_the_home_page()
{
"~/home".Route().ShouldMapTo(h =&gt; h.Index());
}
</pre>
<p>Jak widać test ten jest banalnie prosty i nie wymaga z naszej strony prawie że żadnego nakładu pracy, a co najważniejsze każdy jest w stanie rozpocząć przygodę z testowaniem przez siebie zdefiniowanych route.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jendrusz.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jendrusz.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jendrusz.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jendrusz.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jendrusz.wordpress.com/223/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jendrusz.pl&blog=5537249&post=223&subd=jendrusz&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jendrusz.pl/2009/02/20/testowanie-konfiguracji-routingu-w-aspnet-mvc/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>
	</item>
		<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>