<?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/"
	>

<channel>
	<title>IOCORE &#187; asp.net-mvc</title>
	<atom:link href="http://iocore.se/category/net/aspnet-mvc/feed/" rel="self" type="application/rss+xml" />
	<link>http://iocore.se</link>
	<description>C#, PHP, Shell scripts m.m</description>
	<lastBuildDate>Fri, 14 Oct 2011 23:42:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hämta information från ett körande objekt</title>
		<link>http://iocore.se/ppen-kllkod/hamta-information-fran-ett-korande-objekt/</link>
		<comments>http://iocore.se/ppen-kllkod/hamta-information-fran-ett-korande-objekt/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 12:27:55 +0000</pubDate>
		<dc:creator>Dennis Sangmo</dc:creator>
				<category><![CDATA[Öppen källkod]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[asp.net-mvc]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=447</guid>
		<description><![CDATA[Detta är en uppföljning på ett tidigare inlägg som ni kan finna här:
http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/
Där pratade jag om hur man kan använda sig av Microsofts ramverk &#8220;Management.SEO.Crawler” utan att få användaren att fastna i laddning undertiden &#8220;ListCrawler&#8221;:en arbetade med att söka igenom respektive adress. Detta löstes genom att öppna upp en tråd (Thread) som arbetar parallellt som [...]]]></description>
			<content:encoded><![CDATA[<p>Detta är en uppföljning på ett tidigare inlägg som ni kan finna här:</p>
<p><a href="http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/">http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/</a></p>
<p>Där pratade jag om hur man kan använda sig av Microsofts ramverk &#8220;Management.SEO.Crawler” utan att få användaren att fastna i laddning undertiden &#8220;ListCrawler&#8221;:en arbetade med att söka igenom respektive adress. Detta löstes genom att öppna upp en tråd (Thread) som arbetar parallellt som webbapplikationen. Men för att kunna presentera hur det går för den så måste information hämtas undertiden den körs. Jag kommer nu presentera min lösning på detta problem.</p>
<p><span id="more-447"></span></p>
<h2>Göra trådarna tillgängliga</h2>
<p>När väl användaren har sagt åt &#8220;ListCrawler&#8221;:en att arbeta med att analysera adresserna i en parallell tråd, och sedan skickats vidare till nästa vy, så kan det vara problem att veta vilket &#8220;Thread&#8221;-objekt som är det intressanta. Om ni läst förra inlägget och analyserat koden så har du säkert lagt märke till att det objekt identifierar sig med en av sina egenskaper som utgör sig att vara av typen &#8220;Guid&#8221;. Den &#8216;id&#8217;-nyckeln skickar vi med användaren till den vyn som jag tidigare nämnde. För när användaren väl är där så kommer vi hämta den intressanta informationen med hjälp av Ajax. &#8220;Straightforward&#8221; kan tyckas, vilket det också är, men där finns en sista sak att nämna innan vi hoppar in i koden.</p>
<p>Nu när användaren har sitt guid och anropar efter information med hjälp av Ajax så måste objektet också finnas tillgängligt. Jag löste detta genom att skapa ett statiskt bibliotek som tar hand om alla användarnas sådana &#8220;ListCrawler&#8221; objekt, indexerade med deras Guid objekt. Detta bibliotek befinner sig i ett statiskt objekt som hanterar förfrågningar mot biblioteket. There we have it!</p>
<div class="dean_ch" style="white-space: wrap;">public <span class="kw4">static</span> class JobHandler<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; private <span class="kw4">static</span> readonly Dictionary&lt;Guid, ListCrawler&gt; Jobs = new Dictionary&lt;Guid, ListCrawler&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Biblioteket med alla Crawler objekt</span></p>
<p>&nbsp; &nbsp; <span class="co1">// Metod som hämtar ett ListCrawlerobjekt med en Duid</span><br />
&nbsp; &nbsp; private <span class="kw4">static</span> ListCrawler GetWorkingListCrawler<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Jobs.<span class="me1">ContainsKey</span><span class="br0">&#40;</span>id<span class="br0">&#41;</span> ? Jobs<span class="br0">&#91;</span>id<span class="br0">&#93;</span> : <span class="kw2">null</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> bool HasWorkingCrawler<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; var wlc = GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> wlc != <span class="kw2">null</span> &amp;amp;&amp;amp; wlc.<span class="me1">HasWorkingCrawler</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> ProgressInformationDTO GetProgressInformation<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>.<span class="me1">ProgressInformation</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">string</span> GetBaseDirectoryPath<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>.<span class="me1">FullDirectoryPath</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">void</span> Start<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>HasWorkingCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var lc = GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lc.<span class="me1">Start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; public <span class="kw4">static</span> <span class="kw4">void</span> Stop<span class="br0">&#40;</span>Guid id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>HasWorkingCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var lc = GetWorkingListCrawler<span class="br0">&#40;</span>id<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lc.<span class="me1">Stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp;public <span class="kw4">static</span> <span class="kw4">void</span> AddListCrawler<span class="br0">&#40;</span>ListCrawler lc<span class="br0">&#41;</span><br />
&nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;Jobs.<span class="me1">Add</span><span class="br0">&#40;</span>lc.<span class="me1">Id</span>, lc<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp;<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<h2>JavaScript</h2>
<p>Till detta så är det också en del javascript som arbete i användarens webbläsare. Koden består av ett intervall som kör fuktionen &#8220;DoIt&#8221; varje sekund. &#8220;DoIt&#8221; gör ett Ajax-anrop till kontrollern som i sin tur hämtar informationen från rätt &#8220;ListCrawler&#8221;-objekt och skickar tillbaka den till användarens webbläsare som i sin tur trycker ut den informationen till rätt element.</p>
<div class="dean_ch" style="white-space: wrap;">$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">ready</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; setInterval<span class="br0">&#40;</span>DoIt, <span class="nu0">1000</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#continue&quot;</span><span class="br0">&#41;</span>.<span class="me1">hide</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#abortTakeMeBack&quot;</span><span class="br0">&#41;</span>.<span class="me1">hide</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#abortBtn&quot;</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">getJSON</span><span class="br0">&#40;</span><span class="st0">&quot;/Home/Abort&quot;</span>, <span class="br0">&#123;</span> <span class="st0">&quot;jobId&quot;</span>: <span class="st0">&quot;@ViewBag.jobId&quot;</span> <span class="br0">&#125;</span>, <span class="kw2">function</span> <span class="br0">&#40;</span>data, textStatus, jqXHR<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="me1">status</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#abortTakeMeBack&quot;</span><span class="br0">&#41;</span>.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window.<span class="me1">clearInterval</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> DoIt<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">getJSON</span><span class="br0">&#40;</span><span class="st0">&quot;/Home/Status&quot;</span>, <span class="br0">&#123;</span> <span class="st0">&quot;jobId&quot;</span>: <span class="st0">&quot;@ViewBag.jobId&quot;</span><span class="br0">&#125;</span>, <span class="kw2">function</span> <span class="br0">&#40;</span>data, textStatus, jqXHR<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="me1">complete</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window.<span class="me1">clearInterval</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#infoText&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span><span class="st0">&quot;Your analize is now complete!&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#continue&quot;</span><span class="br0">&#41;</span>.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#infoText&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span><span class="st0">&quot;Your analize is in progress! This could take several minutes. &quot;</span> + textStatus<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="me1">error</span> != <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#progressError&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">error</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#CurrentUri&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">CurrentUri</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#BytesDownloaded&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">BytesDownloaded</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#UrlCounter&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">UrlCounter</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#TotalUrls&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">TotalUrls</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="me1">Percent</span> != undefined<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#progressText&quot;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>data.<span class="me1">Percent</span> + <span class="st0">&quot;%&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&quot;#progressBar&quot;</span><span class="br0">&#41;</span>.<span class="me1">width</span><span class="br0">&#40;</span>data.<span class="me1">Percent</span> + <span class="st0">&quot;%&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/ppen-kllkod/hamta-information-fran-ett-korande-objekt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crawla en lista av adresser med &#8220;Microsoft.Web.Management.SEO.Crawler&#8221;</title>
		<link>http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/</link>
		<comments>http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 09:26:54 +0000</pubDate>
		<dc:creator>Dennis Sangmo</dc:creator>
				<category><![CDATA[Öppen källkod]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[asp.net-mvc]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=440</guid>
		<description><![CDATA[Jag fick i uppdrag att bygga en applikation som skulle kunna söka igenom hemsidor efter valideringsfel, punkter som inte följde generella standarder exempelvis ut en sökmotoroptimerings vinkel. Eftersom jag tidigare haft mycket erfarenhet av att använda mig av ett tillägg i IIS server vid namn &#8220;Microsoft SEO Toolkit&#8221;, så valde jag att bygga denna applikation [...]]]></description>
			<content:encoded><![CDATA[<p>Jag fick i uppdrag att bygga en applikation som skulle kunna söka igenom hemsidor efter valideringsfel, punkter som inte följde generella standarder exempelvis ut en sökmotoroptimerings vinkel. Eftersom jag tidigare haft mycket erfarenhet av att använda mig av ett tillägg i IIS server vid namn &#8220;Microsoft SEO Toolkit&#8221;, så valde jag att bygga denna applikation kring det bibliotek som tillkommer när tillägget installeras. De kallar ramverket &#8220;Microsoft.Web.Management.SEO.Crawler&#8221; och har faktiskt många fördelar, men också många brister&#8230; Bara det faktum att Inga metoder är dokumenterade, så man får till viss det testa sig fram.</p>
<p>För att komma igång med biblioteket kan ni läsa en artikel som tar upp några av grunderna här: <a rel="nofollow" href="http://blogs.iis.net/carlosag/archive/2009/11/18/iis-seo-toolkit-start-new-analysis-automatically-through-code.aspx">http://blogs.iis.net/carlosag/archive/2009/11/18/iis-seo-toolkit-start-new-analysis-automatically-through-code.aspx</a></p>
<p>Problemet med resultatet i den guiden är det faktum att i en MVC lösning så vill man inte att en webbsida skall stå still och ladda undertiden analysen genomförs. En laddnings-vy hade kanske varit en bättre ide, vilket är det jag kommer fokusera mig på i detta inlägg.</p>
<p>Hemligheten bakom denna lösning är baserad på en teknik som kallas &#8220;Threading&#8221; som tillåter dig att köra flera processer parallellt istället för att behöva vänta på att hela analysen är utförd. Till detta använder jag mig av Ajax för att hämta ut nuvarande status på det arbetande objektet samtidigt som den arbetar i en annan tråd.</p>
<p>Och nu till lite kod:</p>
<div class="dean_ch" style="white-space: wrap;">using System;<br />
using System.<span class="me1">Collections</span>.<span class="me1">Generic</span>;<br />
using System.<span class="me1">Threading</span>;<br />
using Microsoft.<span class="me1">Web</span>.<span class="me1">Management</span>.<span class="me1">SEO</span>.<span class="me1">Crawler</span>;<br />
using System.<span class="me1">IO</span>;</p>
<p>public class ListCrawler<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public Guid Id <span class="br0">&#123;</span> get; private set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">string</span> DirectoryPath <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public ProgressInformationDTO ProgressInformation <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">string</span> FullDirectoryPath<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>!SettingIsApplied || !ProgressInformation.<span class="me1">IsComplete</span><span class="br0">&#41;</span> ? <span class="st0">&quot;&quot;</span> : Path.<span class="me1">Combine</span><span class="br0">&#40;</span>DirectoryPath,Id.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public bool HasWorkingCrawler <span class="br0">&#123;</span> get <span class="br0">&#123;</span> <span class="kw1">return</span> WorkingCrawler != <span class="kw2">null</span>; <span class="br0">&#125;</span> <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public bool WorkingCrawlerIsActive <span class="br0">&#123;</span> get <span class="br0">&#123;</span> <span class="kw1">return</span> ProcessThread.<span class="me1">IsAlive</span>; <span class="br0">&#125;</span> <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; private WebCrawler WorkingCrawler <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private List CrawlerList <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private bool SettingIsApplied <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private Thread ProcessThread <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private CrawlerSettings Settings <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public ListCrawler<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Settings = new CrawlerSettings<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CrawlerList = new List<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProcessThread = new Thread<span class="br0">&#40;</span>Execute<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SettingIsApplied = <span class="kw2">false</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Id = Guid.<span class="me1">NewGuid</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public bool Start<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SettingIsApplied<span class="br0">&#41;</span> ProcessThread.<span class="me1">Start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> SettingIsApplied;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public <span class="kw4">void</span> Stop<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ProcessThread.<span class="me1">IsAlive</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProcessThread.<span class="me1">Abort</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WorkingCrawler = <span class="kw2">null</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; private <span class="kw4">void</span> Execute<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">TotalUrlCount</span> = CrawlerList.<span class="me1">Count</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">UrlCounter</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span>var item in CrawlerList<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">UrlCounter</span>++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var dir = Path.<span class="me1">Combine</span><span class="br0">&#40;</span>DirectoryPath, Id.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Settings.<span class="me1">StartUrl</span> = item.<span class="me1">Uri</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Settings.<span class="me1">Name</span> = ProgressInformation.<span class="me1">UrlCounter</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">Crawler</span> = new WebCrawler<span class="br0">&#40;</span>Settings<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WorkingCrawler = item.<span class="me1">Crawler</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">Crawler</span>.<span class="me1">Start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">CurrentUrl</span> = item.<span class="me1">Crawler</span>.<span class="me1">Settings</span>.<span class="me1">StartUrl</span>.<span class="me1">AbsoluteUri</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">TotalBytesDownloaded</span> += WorkingCrawler.<span class="me1">BytesDownloaded</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>item.<span class="me1">Crawler</span>.<span class="me1">IsRunning</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">TotalBytesDownloaded</span> += WorkingCrawler.<span class="me1">BytesDownloaded</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.<span class="me1">Sleep</span><span class="br0">&#40;</span><span class="nu0">500</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">Crawler</span>.<span class="me1">Report</span>.<span class="me1">Save</span><span class="br0">&#40;</span>dir<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ProgressInformation.<span class="me1">IsComplete</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>Vad är det då som händer här?</p>
<p>Detta är ett objekt som tillhandahåller en lista med adresser och &#8220;Crawler&#8221;-objekt som skall sökas igenom. Den har också en egenskap som är av typen &#8220;Thread&#8221; som jag kallar &#8220;ProgressThread&#8221; som instansieras i objektets konstruktor med metoden &#8220;Execute&#8221;. Det betyder att när tråden körs så kommer metoden &#8220;Execute&#8221; köras i den tråden ifrån rätt scope, vilket den gör när &#8220;Start&#8221;-metoden anropas.</p>
<p>I metoden &#8220;Execute&#8221; så händer en del saker men det som jag vill trycka på är att vi kan få &#8220;Thread&#8221;-objektet att sova utan att beröra resten av applikationen och det faktum att jag loopar igenom och analyserar alla objekt i listan.</p>
<p>Enkelt, eller hur?</p>
<p>Nästa vecka tar jag upp hur man kan göra för att hämta ut data från det körande objektet.</p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/ppen-kllkod/crawla-en-lista-av-adresser-med-microsoft-web-management-seo-crawler-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC &#8211; komprimera html med actionfilter</title>
		<link>http://iocore.se/utveckling/aspnet-mvc-komprimera-html-med-actionfilter/</link>
		<comments>http://iocore.se/utveckling/aspnet-mvc-komprimera-html-med-actionfilter/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 15:56:38 +0000</pubDate>
		<dc:creator>Alexander Nyquist</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Utveckling]]></category>
		<category><![CDATA[asp.net-mvc]]></category>

		<guid isPermaLink="false">http://iocore.se/?p=429</guid>
		<description><![CDATA[Genom att komprimera sin html kan man spara åtskillig datamängd. Jag tänkte här dela med mig av ett Actionfilter till ASP.NET MVC för att komprimera all output (genom att strippa bort onödig whitespace). Med nedanstående filter sparade jag 46kb per sidvisning, vilket blir relativt mycket om man har en välbesökt sida.
Först kommer definitionen av attributet [...]]]></description>
			<content:encoded><![CDATA[<p>Genom att komprimera sin html kan man spara åtskillig datamängd. Jag tänkte här dela med mig av ett Actionfilter till ASP.NET MVC för att komprimera all output (genom att strippa bort onödig whitespace). Med nedanstående filter sparade jag 46kb per sidvisning, vilket blir relativt mycket om man har en välbesökt sida.</p>
<p>Först kommer definitionen av attributet som används för att kunna anropa filtret.</p>
<div class="dean_ch" style="white-space: wrap;">
public class OptimizeHtmlOutputAttribute : ActionFilterAttribute<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> OnResultExecuting<span class="br0">&#40;</span>ResultExecutingContext filterContext<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HttpResponseBase response = filterContext.<span class="me1">HttpContext</span>.<span class="me1">Response</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span class="me1">Filter</span> = new OptimizeHtmlFilter<span class="br0">&#40;</span>response.<span class="me1">Filter</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Filtret består utav lite mer kod, dock är funktionen som utför allt arbete den överlagrade metoden &#8220;Write&#8221;.</p>
<div class="dean_ch" style="white-space: wrap;">
public class OptimizeHtmlFilter : Stream<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; private readonly StringBuilder _responseHtml;<br />
&nbsp; &nbsp; &nbsp; &nbsp; private readonly Stream _responseStream;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public OptimizeHtmlFilter<span class="br0">&#40;</span>Stream inputStream<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream = inputStream;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseHtml = new StringBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#region Filter overrides</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public StringBuilder ResponseHtml<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> _responseHtml; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override bool CanRead<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">true</span>; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override bool CanSeek<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">true</span>; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override bool CanWrite<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="kw2">true</span>; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">long</span> Length<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="nu0">0</span>; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">long</span> Position <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> Close<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream.<span class="me1">Close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> Flush<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream.<span class="me1">Flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">long</span> Seek<span class="br0">&#40;</span><span class="kw4">long</span> offset, SeekOrigin origin<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _responseStream.<span class="me1">Seek</span><span class="br0">&#40;</span>offset, origin<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> SetLength<span class="br0">&#40;</span><span class="kw4">long</span> length<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream.<span class="me1">SetLength</span><span class="br0">&#40;</span>length<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">int</span> Read<span class="br0">&#40;</span>byte<span class="br0">&#91;</span><span class="br0">&#93;</span> buffer, <span class="kw4">int</span> offset, <span class="kw4">int</span> count<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> _responseStream.<span class="me1">Read</span><span class="br0">&#40;</span>buffer, offset, count<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#endregion</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; public override <span class="kw4">void</span> Write<span class="br0">&#40;</span>byte<span class="br0">&#91;</span><span class="br0">&#93;</span> buffer, <span class="kw4">int</span> offset, <span class="kw4">int</span> count<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> stringBuffer = Encoding.<span class="kw1">Default</span>.<span class="me1">GetString</span><span class="br0">&#40;</span>buffer<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var sb = new StringBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var lines = stringBuffer.<span class="me1">Split</span><span class="br0">&#40;</span>Environment.<span class="me1">NewLine</span>.<span class="me1">ToCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, StringSplitOptions.<span class="me1">RemoveEmptyEntries</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span>var line in lines<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.<span class="me1">Append</span><span class="br0">&#40;</span>line.<span class="me1">Trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buffer = Encoding.<span class="kw1">Default</span>.<span class="me1">GetBytes</span><span class="br0">&#40;</span>sb.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _responseStream.<span class="me1">Write</span><span class="br0">&#40;</span>buffer, <span class="nu0">0</span>, buffer.<span class="me1">Length</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Filtret används sedan genom att dekorera Actions (eller för den delen controllers) med [OptimizeHtmlOutput], exempelvis:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="br0">&#91;</span>OptimizeHtmlOutput<span class="br0">&#93;</span><br />
public ActionResult Html<span class="br0">&#40;</span><span class="kw4">int</span> id<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;var report = _repository.<span class="me1">GetReport</span><span class="br0">&#40;</span>id<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> View<span class="br0">&#40;</span><span class="st0">&quot;Csv&quot;</span>, new CsvReport<span class="br0">&#40;</span>report<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Dock bör man komma ihåg att inte optimera där det inte behövs. Man bör alltid profilera koden för att se vart flaskhalsarna sitter.</p>
]]></content:encoded>
			<wfw:commentRss>http://iocore.se/utveckling/aspnet-mvc-komprimera-html-med-actionfilter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

