<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Christofer Löf</title><link>http://blogs.msdn.com/chrislof/default.aspx</link><description>Senior Consultant @ Microsoft Services
</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Kom igång med Visual Studio 2010 Beta 2 och Windows Azure</title><link>http://blogs.msdn.com/chrislof/archive/2009/12/20/kom-ig-ng-med-visual-studio-2010-beta-2-och-windows-azure.aspx</link><pubDate>Sun, 20 Dec 2009 10:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9939136</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9939136.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9939136</wfw:commentRss><description>&lt;p&gt;Nu när julen kommer farandes brukar en hel del människor ta några dagar ledigt. Vad kan då passa bättre än att passa på att kanske lära sig något nytt?&lt;/p&gt;  &lt;p&gt;Visual Studio 2010 Beta 2 släpptes som bekant i oktober månad. Vid den tidpunkten vad den senaste versionen av Windows Azure verktygen för Visual Studio den version som släpptes i juli. Detta gjorde att Visual Studio teamet valde att inte skicka med verktygen för Windows Azure i Visual Studio 2010 Beta 2 då de visste att det kommer en ny version i samband med Windows Azure releasen på PDC. Men det är inte så illa som det kanske låter. De såg istället till att det fanns ett enkelt sätt att installera Windows Azure verktygen när de väl är släppta.&lt;/p&gt;  &lt;p&gt;När du väljer att skapa ett nytt projekt av typen &lt;em&gt;Windows Azure Cloud Service&lt;/em&gt; så kommer du första gången att skickas till webbsidan för nedladdning och installation av &lt;em&gt;Visual Studio Tools for Windows Azure&lt;/em&gt;. En helt respektabel lösning på det hela tycker jag. När Visual Studio 2010 släpps någon gång i vår så kan vi nog vara ganska säkra på att de har synkat releaserna. (&lt;a href="http://haacked.com/archive/2009/11/17/asp.net-mvc-2-beta-released.aspx"&gt;Detta gäller också ASP.NET MVC 2 men är en annan historia&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="new cloud service dialog" border="0" alt="new cloud service dialog" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_thumb_2.png" width="420" height="248" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;När jag har skapat mitt projekt får jag möjligheten att lägga till en eller flera sk &lt;em&gt;Roller. &lt;/em&gt;En &lt;em&gt;Roll&lt;/em&gt; är helt enkelt en viss typ av applikation som kan köras i Windows Azure. Några nyheter som vi kan se här är bland annat roller för WCF och ASP.NET MVC. Just nu kör jag på &lt;a href="http://www.microsoft.com/express/future/default.aspx"&gt;Visual Web Developer 2010 Express&lt;/a&gt; (gratisversionen av Visual Studio) vilket gör att jag inte får tillgång till den nya &lt;em&gt;F# Worker&lt;/em&gt;-rollen. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Create Cloud Service" border="0" alt="Create Cloud Service" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_thumb_4.png" width="420" height="267" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Nu när min molntjänst har skapats har jag fått två projekt i Visual Studio. Det ena projektet är definitionen av min molntjänst (CloudService11) – denna innehåller, bland en hel del annat,&amp;#160; information om vilka roller som ingår och antalet instanser av dessa roller.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_14.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Cloud Service" border="0" alt="Cloud Service" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_thumb_6.png" width="266" height="383" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Med Visual Studio 2010 kommer också .NET Framework 4 (eller om man nu ser på det åt andra hållet). Som standard när jag skapar ett nytt projekt i Visual Studio 2010 så är det förvalt att projektet skall köras på just .NET Framework 4. Vad jag måste ha i åtanke här är att Windows Azure inte, än, stöder .NET Framework 4 utan där är det .NET Framework 3.5 SP1 som gäller. Jag måste alltså ändra vilket ramverk min molntjänst skall baseras på för att kunna publicera den till Windows Azure. Med någon av betalversionerna av Visual Studio 2010 kan jag välja detta direkt när projektet skapas men iom att jag nu gör &lt;em&gt;Express&lt;/em&gt; får jag ändra detta i efterhand. Detta gör jag genom att högerklicka på mitt webbprojekt och välja &lt;em&gt;Properties. &lt;/em&gt;I denna vy ser jag sedan till att &lt;em&gt;Target framework&lt;/em&gt; är satt till &lt;em&gt;.NET Framework 3.5.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_16.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Target Framework" border="0" alt="Target Framework" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_thumb_7.png" width="420" height="229" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vad jag också brukar göra är att ändra antalet instanser av varje roll. Det är nämligen så att man måste ha minst två instanser av varje roll för att fastställda&lt;a href="http://www.microsoft.com/windowsazure/pricing/#windows"&gt; SLA:er skall gälla&lt;/a&gt;. För att göra detta dubbelklickar jag på min roll &lt;em&gt;Hello World &lt;/em&gt;och justerar därefter värdet på &lt;em&gt;Instance count&lt;/em&gt; till 2. Vad som också kan vara värt att lägga märke till här är möjligheten att välja storlek på den virtuella maskin som min roll (webbapplikation i detta fall) kommer installeras och köras i. En &lt;em&gt;Small&lt;/em&gt; är en burk med ca 2GB RAM och 1 processorkärna. &lt;a href="http://msdn.microsoft.com/en-us/library/ee814754.aspx"&gt;För varje storlek dubblas kapaciteten, vilket gör att en ExtraLarge är på ca 16GB RAM och 8 processorkärnor&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_20.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Rollkonfiguration" border="0" alt="Rollkonfiguration" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_thumb_9.png" width="420" height="229" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Jag har nu knåpat på min webbapplikation och vill prova den i Windows Azure. Jag skulle kunna publicera den till molnet och testa där men ett mycket snabbare sätt är att köra den i den lokala simuleringsmiljön &lt;em&gt;Windows Azure Simulation Environment&lt;/em&gt;. Genom att starta debuggern (F5) startas också simuleringsmiljön och min molntjänst publiceras dit.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_22.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Windows Azure simulation environment" border="0" alt="Windows Azure simulation environment" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_thumb_10.png" width="420" height="109" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Genom att öppna &lt;em&gt;Development Fabric&lt;/em&gt; kan jag nu se att jag har två instanser av min &lt;em&gt;Hello World&lt;/em&gt; webbapplikation rullandes.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_24.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Development Fabric" border="0" alt="Development Fabric" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_thumb_11.png" width="420" height="316" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Nu när jag känner mig nöjd med min molntjänst högerklickar jag på mitt molntjänstprojekt och väljer &lt;em&gt;Publish&lt;/em&gt;. Visual Studio skapar då ett paket som är &lt;a href="http://windows.azure.com/"&gt;redo att laddas upp till Windows Azure&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_26.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedVisualStudio2010ochWindowsAzur_CDFE/image_thumb_12.png" width="251" height="108" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Lycka till i molnet och God Jul!&lt;/p&gt;  &lt;p&gt;Mer läsning&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/windowsazure/getstarted/"&gt;Getting Started&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/johanl/archive/2009/09/10/kom-ig-ng-med-windows-azure-idag.aspx"&gt;Kom igång med Windows Azure idag!&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://wadc.cloudapp.net/"&gt;Tävla och vinn i molnet – Windows Azure Developer Challange&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9939136" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/VS2010/default.aspx">VS2010</category></item><item><title>CRUDing with “ActiveRecord for Azure”</title><link>http://blogs.msdn.com/chrislof/archive/2009/12/19/cruding-with-activerecord-for-azure.aspx</link><pubDate>Sat, 19 Dec 2009 10:24:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9939082</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9939082.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9939082</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/chrislof/archive/2009/12/16/introducing-activerecord-for-azure.aspx"&gt;In my previous blog post I introduced you to my little experiment&lt;/a&gt; – a sample implementation of the ActiveRecord pattern for the Windows Azure Storage system which I call “ActiveRecord for Azure”. (It’s easier to refer to something it it has a name – right?). In this post I want to elaborate a little bit further on the features previously mentioned. Since most of us associate the ActiveRecord pattern with MVC style apps I’m going to show the Create, Read, Update and Delete (CRUD) support by implementing a simple Task List application using ASP.NET MVC.&lt;/p&gt;  &lt;h2&gt;Wire it up&lt;/h2&gt;  &lt;p&gt;First I’ve to set up the “ActiveRecord for Azure” environment – that’s; create tables, wire up configuration change handlers etc. I’ve put all this kind of logic into the &lt;em&gt;ActiveRecordEnvironment&lt;/em&gt; class. All I have to do is to call its &lt;em&gt;Start-&lt;/em&gt;method. Probably the best place to do this is in the RoleInstance startup event. To do that I just create a class which derives from &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleentrypoint.aspx"&gt;RoleEntryPoint&lt;/a&gt; and overrides its &lt;em&gt;OnStart&lt;/em&gt; –method.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WebRole &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;RoleEntryPoint
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public override bool &lt;/span&gt;OnStart()
    {
        &lt;span style="color: green"&gt;//start the ActiveRecord environment
        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActiveRecordEnvironment&lt;/span&gt;.Start(&lt;span style="color: blue"&gt;this&lt;/span&gt;);

        &lt;span style="color: blue"&gt;return base&lt;/span&gt;.OnStart();
    }
}&lt;/pre&gt;

&lt;h2&gt;The Model&lt;/h2&gt;

&lt;p&gt;I’m now ready to implement my &lt;em&gt;Model&lt;/em&gt;. Since it’s a Task List application I’m building the Model at least&amp;#160; needs to have a &lt;em&gt;Task&lt;/em&gt; entity. To store an entity in Windows Azure Tables it has to have three properties called &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd179338.aspx"&gt;RowKey, PartitionKey and Timestamp&lt;/a&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;.&amp;#160; You could certainly write these yourself (or derive from &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storageclient.tableserviceentity.aspx"&gt;TableServiceEntity&lt;/a&gt;) but you have to handle the generation and associations of RowKeys and PartitionKeys “manually”.&amp;#160; The &lt;em&gt;ActiveRecord &lt;/em&gt;base class takes care of this for me and also equips the entity with the CRUD operations.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Task &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ActiveRecord&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Task&lt;/span&gt;&amp;gt;
{
    [&lt;span style="color: #2b91af"&gt;Required&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Title { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    
    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DateTime &lt;/span&gt;Due { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }

    &lt;span style="color: blue"&gt;public bool &lt;/span&gt;Complete { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;

&lt;p&gt;As you probably already recognized I’m using the validation attribute &lt;em&gt;Required&lt;/em&gt; from the &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx"&gt;System.ComponentModel.DataAnnotations&lt;/a&gt; namespace to mark the &lt;em&gt;Title&lt;/em&gt; property as mandatory. ASP.NET MVC 2 now knows how to handle these validation attributes. (No more validation logic scattered through out the app – yay!).&lt;/p&gt;

&lt;h2&gt;The Controller&lt;em&gt;&amp;#160;&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;Listing all Tasks is as simple as calling the &lt;em&gt;All&lt;/em&gt;-method on the Task class (provided by the &lt;em&gt;ActiveRecord&lt;/em&gt; base class)&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActionResult &lt;/span&gt;Index() {
    &lt;span style="color: blue"&gt;return &lt;/span&gt;View(&lt;span style="color: #2b91af"&gt;Task&lt;/span&gt;.All());
}&lt;/pre&gt;

&lt;p&gt;As you can see in the below &lt;em&gt;Edit&lt;/em&gt; Action Method the data access code is minimal. Allowing you to focus on the business problem while leveraging the performance of Windows Azure Table Storage. The “ActiveRecord for Azure” specific code rows are commented with “AR4A” – all other rows are just plain vanilla ASP.NET MVC.&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;HttpPost&lt;/span&gt;]
&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActionResult &lt;/span&gt;Edit(&lt;span style="color: blue"&gt;string &lt;/span&gt;id, &lt;span style="color: #2b91af"&gt;Task &lt;/span&gt;task) {
    &lt;span style="color: blue"&gt;var &lt;/span&gt;existingTask = &lt;span style="color: #2b91af"&gt;Task&lt;/span&gt;.Find(id); &lt;span style="color: green"&gt;//AR4A

    &lt;/span&gt;&lt;span style="color: blue"&gt;try &lt;/span&gt;{
        UpdateModel(existingTask);
        existingTask.Save(); &lt;span style="color: green"&gt;//AR4A

        &lt;/span&gt;&lt;span style="color: blue"&gt;return &lt;/span&gt;RedirectToAction(&lt;span style="color: #a31515"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;);
    }&lt;span style="color: blue"&gt;catch &lt;/span&gt;{
        &lt;span style="color: blue"&gt;return &lt;/span&gt;View(task);
    }
}&lt;/pre&gt;

&lt;p&gt;To delete an entity I just call (you probably already figured this one out – didn’t you?) – Delete.&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;HttpPost&lt;/span&gt;]
&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActionResult &lt;/span&gt;Delete(&lt;span style="color: blue"&gt;string &lt;/span&gt;id) {
    &lt;span style="color: #2b91af"&gt;Task&lt;/span&gt;.Delete(id); &lt;span style="color: green"&gt;//AR4A
    &lt;/span&gt;&lt;span style="color: blue"&gt;return &lt;/span&gt;RedirectToAction(&lt;span style="color: #a31515"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;);
}&lt;/pre&gt;

&lt;p&gt;In the above example I called the static &lt;em&gt;Delete-&lt;/em&gt;method and passed in the Id (RowId) of the &lt;em&gt;Task&lt;/em&gt; to delete. I could also have called the Delete method on the specific Task instance to delete it.&lt;/p&gt;

&lt;h2&gt;Wrapping it up&lt;/h2&gt;

&lt;p&gt;So in just a few minutes I built myself a Task List application using Windows Azure and ASP.NET MVC 2. It’s so nice not having to spend hours on infrastructure code that in itself doesn’t provide any business value – isn’t it? &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/CRUDingwithActiveRecordforAzure_9127/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/CRUDingwithActiveRecordforAzure_9127/image_thumb.png" width="240" height="202" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;You can download the full example below. &lt;strong&gt;Please remember – this comes as-is and should be considered example code only.&lt;/strong&gt;&lt;/p&gt;
&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-fda44bafd37fcedf.skydrive.live.com/embedicon.aspx/blog/ar4a-ArTasks.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9939082" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/Cloud+Storage/default.aspx">Cloud Storage</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/In+English/default.aspx">In English</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/ActiveRecord+for+Azure/default.aspx">ActiveRecord for Azure</category></item><item><title>Introducing “ActiveRecord for Azure”</title><link>http://blogs.msdn.com/chrislof/archive/2009/12/17/introducing-activerecord-for-azure.aspx</link><pubDate>Thu, 17 Dec 2009 12:48:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9938154</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9938154.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9938154</wfw:commentRss><description>&lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;DISCLAIMER: This is a personal spare time experiment.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://www.microsoft.com/windowsazure/" target="_blank"&gt;Windows Azure&lt;/a&gt; Storage system is very capable and will probably fit your and your application needs in a lot of scenarios. I feel that, especially Windows Azure Tables, is far too often forgotten when considering object persistence in the cloud. This post was supposed to show off&amp;#160; &lt;a href="http://blogs.msdn.com/chrislof/archive/2009/05/10/windows-azure-datalagring-tables.aspx" target="_blank"&gt;Windows Azure Tables&lt;/a&gt; together with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.services.client.dataservicecontext.aspx" target="_blank"&gt;WCF Data Services client&lt;/a&gt; in order to try to change the perception of &amp;quot;SQL Azure is the only option&amp;quot;.&lt;/p&gt;  &lt;p&gt;But the accompanying code examples evolved, so.. &lt;/p&gt;  &lt;p&gt;Please say welcome to “ActiveRecord for Azure”&lt;/p&gt;  &lt;p&gt;“ActiveRecord for Azure” (or just AR4A) is what its name implies; a sample implementation of the &lt;a href="http://en.wikipedia.org/wiki/Active_record_pattern" target="_blank"&gt;ActiveRecord&lt;/a&gt;&amp;#160; pattern for the Windows Azure Storage system. Its main objective is to make Windows Azure data access really easy, yet powerful.&lt;/p&gt;  &lt;p&gt;AR4A is built on top of the WCF Data Services client and the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storageclient.aspx"&gt;managed Windows Azure Storage API&lt;/a&gt; - utilizing the great work that's already been put into those libraries. AR4A just adds more simplicity to them.&lt;/p&gt;  &lt;p&gt;To get started you inherit your entities from the ActiveRecord base class followed by telling the ActiveRecord environment to create the required tables. AR4A then handles the persistence of entities, retrieval of entities, &lt;a href="http://blog.smarx.com/posts/windows-azure-tables-expect-continuation-tokens-seriously" target="_blank"&gt;continuation tokens&lt;/a&gt;, table partitions, among other things for you.&lt;/p&gt;  &lt;p&gt;Feature overview (at the point of writing this)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CRUD operations &lt;/li&gt;    &lt;li&gt;Partition management &lt;/li&gt;    &lt;li&gt;Table generation &lt;/li&gt;    &lt;li&gt;Id generation &lt;/li&gt;    &lt;li&gt;Stubs &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To give you a peek of what it looks like, I've revamped the RdChat application that comes with the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=413E88F8-5966-4A83-B309-53B7B77EDF78&amp;amp;displaylang=en"&gt;Windows Azure Training Kit&lt;/a&gt; using AR4A.&lt;/p&gt;  &lt;h3&gt;&lt;strong&gt;&lt;font color="#ffffff"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;h3&gt;“ActiveRecord for Azure” sneak peek&lt;/h3&gt;  &lt;h4&gt;List all messages&lt;/h4&gt;  &lt;h5&gt;Training Kit style&lt;/h5&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;account = &lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt;.FromConfigurationSetting(&lt;span style="color: #a31515"&gt;&amp;quot;DataConnectionString&amp;quot;&lt;/span&gt;);
&lt;span style="color: blue"&gt;var &lt;/span&gt;context = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MessageDataServiceContext&lt;/span&gt;(account.TableEndpoint.ToString(), account.Credentials);

... (non-relevant code)

&lt;span style="color: blue"&gt;this&lt;/span&gt;.messageList.DataSource = context.Messages;
&lt;span style="color: blue"&gt;this&lt;/span&gt;.messageList.DataBind();&lt;/pre&gt;

&lt;h5&gt;AR4A style&lt;/h5&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.messageList.DataSource = &lt;span style="color: #2b91af"&gt;Message&lt;/span&gt;.All();
&lt;span style="color: blue"&gt;this&lt;/span&gt;.messageList.DataBind();&lt;/pre&gt;

&lt;h4&gt;&lt;strong&gt;Add message&lt;/strong&gt;&lt;/h4&gt;

&lt;h5&gt;Training Kit style&lt;/h5&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;account = &lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt;.FromConfigurationSetting(&lt;span style="color: #a31515"&gt;&amp;quot;DataConnectionString&amp;quot;&lt;/span&gt;);
&lt;span style="color: blue"&gt;var &lt;/span&gt;context = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MessageDataServiceContext&lt;/span&gt;(account.TableEndpoint.ToString(), account.Credentials);

context.AddMessage(&lt;span style="color: blue"&gt;this&lt;/span&gt;.nameBox.Text, &lt;span style="color: blue"&gt;this&lt;/span&gt;.messageBox.Text);&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;AddMessage(&lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: blue"&gt;string &lt;/span&gt;body)
{
    &lt;span style="color: blue"&gt;this&lt;/span&gt;.AddObject(&lt;span style="color: #a31515"&gt;&amp;quot;Messages&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Message &lt;/span&gt;{ Name = name, Body = body });
    &lt;span style="color: blue"&gt;this&lt;/span&gt;.SaveChanges();
}&lt;/pre&gt;

&lt;h5&gt;AR4A style&lt;/h5&gt;

&lt;pre class="code"&gt;&lt;span style="color: green"&gt;//just create the message..
&lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;message = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Message&lt;/span&gt;() {
    Body = messageBox.Text,
    Name = nameBox.Text,
};

&lt;span style="color: green"&gt;//..and save it
&lt;/span&gt;message.Save();&lt;/pre&gt;

&lt;h4&gt;Entity&lt;/h4&gt;

&lt;h5&gt;Training Kit style&lt;/h5&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Message &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;TableServiceEntity
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Name { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Body { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;Message()
    {
        PartitionKey = &lt;span style="color: #a31515"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;;
        RowKey = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0:10}_{1}&amp;quot;&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.MaxValue.Ticks - &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.Ticks, &lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt;.NewGuid());
    }
}&lt;/pre&gt;

&lt;h5&gt;AR4A style&lt;/h5&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Message &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ActiveRecord&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Message&lt;/span&gt;&amp;gt; {

    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Name { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;Body { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }

}&lt;/pre&gt;

&lt;h4&gt;Startup&lt;/h4&gt;

&lt;h5&gt;Training Kit style&lt;/h5&gt;

&lt;p&gt;First about ten lines of configuration change handling code. Then:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;account = &lt;span style="color: #2b91af"&gt;CloudStorageAccount&lt;/span&gt;.FromConfigurationSetting(&lt;span style="color: #a31515"&gt;&amp;quot;DataConnectionString&amp;quot;&lt;/span&gt;);

&lt;span style="color: green"&gt;// dynamically create the tables
&lt;/span&gt;&lt;span style="color: #2b91af"&gt;CloudTableClient&lt;/span&gt;.CreateTablesFromModel(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MessageDataServiceContext&lt;/span&gt;),
                                       account.TableEndpoint.AbsoluteUri, account.Credentials);&lt;/pre&gt;

&lt;h5&gt;AR4A style&lt;/h5&gt;

&lt;pre class="code"&gt;&lt;span style="color: green"&gt;//initialize the AR4A environment
&lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActiveRecordEnvironment&lt;/span&gt;.Start(&lt;span style="color: blue"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9938154" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/Cloud+Storage/default.aspx">Cloud Storage</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/In+English/default.aspx">In English</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/ActiveRecord+for+Azure/default.aspx">ActiveRecord for Azure</category></item><item><title>Windows Azure SDK November 2009 ute nu!</title><link>http://blogs.msdn.com/chrislof/archive/2009/11/15/windows-azure-sdk-november-2009-ute-nu.aspx</link><pubDate>Sun, 15 Nov 2009 11:32:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9922614</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9922614.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9922614</wfw:commentRss><description>&lt;p&gt;I går släppte vi &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=772990da-8926-4db0-958f-95c1da572c84&amp;amp;displaylang=en" target="_blank"&gt;Windows Azure Software Development Kit (November 2009)&lt;/a&gt; och &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6967ff37-813e-47c7-b987-889124b43abd&amp;amp;displaylang=en" target="_blank"&gt;Windows Azure Tools for Microsoft Visual Studio (November 2009)&lt;/a&gt; samt &lt;a href="http://code.msdn.microsoft.com/windowsazuresamples" target="_blank"&gt;tillhörande exempel&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Vad är det då som är nytt? Det första vi kan lägga märke till är att förkortningen &lt;em&gt;CTP&lt;/em&gt; inte längre finns med i namnen vilket skvallrar som &lt;em&gt;production quality.&lt;/em&gt; Bland funktioner som är nya eller förädlade kan nämnas;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Möjlighet till kommunikation mellan rollinstanser (SDK) &lt;/li&gt;    &lt;li&gt;Nya API:er för loggning och hälsokontroll. (SDK) &lt;/li&gt;    &lt;li&gt;Hantering av SSL certifikat (SDK) &lt;/li&gt;    &lt;li&gt;Välj vilken typ av virtuell maskin du vill deploya din rollinstans på (SDK) &lt;/li&gt;    &lt;li&gt;Externa ändpunkter på &lt;em&gt;Worker Roles &lt;/em&gt;(SDK) &lt;/li&gt;    &lt;li&gt;Skriv information till lokalt lagringsutrymme utan att riskera att informationen är borta när rollen startas om (SDK) &lt;/li&gt;    &lt;li&gt;Ett “riktigt” &lt;em&gt;Storage Client &lt;/em&gt;bibliotek för åtkomst till Azure Storage (Tables, Queues och Blobs) (SDK) &lt;/li&gt;    &lt;li&gt;Förbättrat &lt;em&gt;Development Storage. &lt;/em&gt;Inget mer “generate tables”&amp;#160; (SDK) – whoho! &lt;/li&gt;    &lt;li&gt;Nya rolltyper: F# Worker, ASP.NET MVC 2, WCF Service (VSTools) &lt;/li&gt;    &lt;li&gt;Stöd för Visual Studio 2010 Beta 2. Även Express. (VSTools)&amp;#160; - sweet! &lt;/li&gt;    &lt;li&gt;Användargränssnitt för hantering av tjänstemodellen (VSTools) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Så nu är det bara att tanka ned, installera, labba, &lt;a href="http://microsoftpdc.com/" target="_blank"&gt;titta på PDC dragningar&lt;/a&gt; nästa vecka för att till slut husera production appar på Windows Azure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/WindowsAzureSDKNovember2009utenu_B05E/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="VS2010 Express med Azure Tools" border="0" alt="VS2010 Express med Azure Tools" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/WindowsAzureSDKNovember2009utenu_B05E/image_thumb.png" width="240" height="192" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9922614" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/VS2010/default.aspx">VS2010</category></item><item><title>Kom igång med PHP på Windows Azure</title><link>http://blogs.msdn.com/chrislof/archive/2009/11/11/kom-ig-ng-med-php-p-windows-azure.aspx</link><pubDate>Wed, 11 Nov 2009 20:32:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9921035</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9921035.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9921035</wfw:commentRss><description>&lt;p&gt;På senare tid har vi på Microsoft introducerat ett antal initiativ för ökad interoperabilitet med PHP.&amp;#160; Det handlar bland annat om &lt;a href="http://blogs.msdn.com/ssds/archive/2009/08/18/9874133.aspx" target="_blank"&gt;drivare för SQL Server&lt;/a&gt;, verktyg för att &lt;a href="http://blogs.msdn.com/interoperability/archive/2009/08/21/a-new-bridge-for-php-developers-to-net-through-rest-php-toolkit-for-ado-net-data-services.aspx" target="_blank"&gt;konsumera ADO.NET Data Services resurser&lt;/a&gt; och &lt;a href="http://php.iis.net/" target="_blank"&gt;exekvering av PHP i Internet Information Services&lt;/a&gt;. Alla dessa är högst relevanta för PHP på Windows Azure men fungerar också lika bra på “vanliga” Windows. För utveckling ämnad Windows Azure har vi tillsammans med våra partners &lt;a href="http://www.soyatec.com/" target="_blank"&gt;Soyatec&lt;/a&gt; och &lt;a href="http://www.realdolmen.com/" target="_blank"&gt;RealDolmen&lt;/a&gt; tagit fram två riktigt smaskiga bitar; &lt;a href="http://phpazure.codeplex.com/" target="_blank"&gt;Windows Azure SDK for PHP&lt;/a&gt; och &lt;a href="http://www.windowsazure4e.org/" target="_blank"&gt;Windows Azure Tools for Eclipse&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Windows Azure SDK for PHP&lt;/h2&gt;  &lt;p&gt;Windows Azure SDK for PHP är ett utvecklingspaket för Windows Azure och &lt;em&gt;Windows Azure Storage&lt;/em&gt; – &lt;a href="http://blogs.msdn.com/chrislof/archive/2009/05/06/windows-azure-datalagring-blobs.aspx" target="_blank"&gt;Blobs&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/chrislof/archive/2009/05/10/windows-azure-datalagring-tables.aspx" target="_blank"&gt;Tables&lt;/a&gt; och &lt;a href="http://blogs.msdn.com/chrislof/archive/2009/05/11/windows-azure-datalagring-queues.aspx" target="_blank"&gt;Queues&lt;/a&gt;. Funktioner är bland andra; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Klasser för CRUD operationer på Blobs, Tables och Queues &lt;/li&gt;    &lt;li&gt;Hjälpklasser för HTTP-transport, felhantering, REST och säkerhet&lt;/li&gt;    &lt;li&gt;Instrumentering och loggning&lt;/li&gt;    &lt;li&gt;Hantering av PHP sessioner i Tables.&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Windows Azure Tools for Eclipse&lt;/h2&gt;  &lt;p&gt;Windows Azure Tools for Eclipse är ett tillägg till Eclipse vilket ger bra verktygsstöd för utveckling av PHP applikationer för Windows Azure. Funktionerna är bland andra;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Projektmallar och migrering av projekt&lt;/li&gt;    &lt;li&gt;Hantering av Windows Azure specifika begrepp som Roller och Tjänstedefinitioner&lt;/li&gt;    &lt;li&gt;Storage Explorer – Hantera dina Windows Azure Storage konton (inkl innehåll)&lt;/li&gt;    &lt;li&gt;Windows Azure project deployment – paketering av ditt projekt och publicering till portal eller &lt;a href="http://msdn.microsoft.com/en-us/library/dd179455.aspx" target="_blank"&gt;Windows Azure Development Fabric&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Windows Azure Tools for Eclipse inkluderar även Windows Azure SDK for PHP, vilket gör att du endast behöver installera ett paket och är därmed snabbt igång.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedPHPpWindowsAzure_12202/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Windows Azure Tools for Eclipse" border="0" alt="Windows Azure Tools for Eclipse" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KomigngmedPHPpWindowsAzure_12202/image_thumb_1.png" width="300" height="243" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h6&gt;(Klicka för större bild)&lt;/h6&gt;  &lt;p&gt;Om du är en PHP utvecklare som använder andra verktyg än Eclipse för att skriva din kod, (kanske &lt;a href="http://www.vim.org/" target="_blank"&gt;Vim&lt;/a&gt; , &lt;a href="http://www.gnu.org/software/emacs/" target="_blank"&gt;Emacs&lt;/a&gt; eller &lt;a href="http://en.wikipedia.org/wiki/Notepad_(Windows)" target="_blank"&gt;Notepad&lt;/a&gt;) så är du inte portad från Windows Azure för det. Du kommer dock troligen få ägna lite mer tid åt att paketera och hantera dina Windows Azure projekt med &lt;a href="http://msdn.microsoft.com/en-us/library/dd179345.aspx" target="_blank"&gt;CSPack, CSRun, DSInit&lt;/a&gt; och hålla tungan rätt i munnen än om du använder Windows Azure Tools for Eclipse.&lt;/p&gt;  &lt;h2&gt;Avslutningsvis&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/windowsazure/getstarted/" target="_blank"&gt;Bekanta dig med Windows Azure&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=aa40f3e2-afc5-484d-b4e9-6a5227e73590&amp;amp;displaylang=en" target="_blank"&gt;Ladda ned Windows Azure SDK&lt;/a&gt; (July CTP)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.windowsazure4e.org/download/" target="_blank"&gt;Installera Windows Azure Tools for Eclipse&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://phpazure.codeplex.com/" target="_blank"&gt;Ladda ned Windows Azure SDK for PHP&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/interoperability/archive/tags/PHP/default.aspx" target="_blank"&gt;Läs mer om vårt arbete med PHP&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Lär mig PHP&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9921035" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/Windows+Azure/default.aspx">Windows Azure</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Interoperability/default.aspx">Interoperability</category></item><item><title>Att enhetstesta WCF-tjänster</title><link>http://blogs.msdn.com/chrislof/archive/2009/11/07/att-enhetstesta-wcf-tj-nster.aspx</link><pubDate>Sat, 07 Nov 2009 16:11:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9919072</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9919072.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9919072</wfw:commentRss><description>&lt;p&gt;Jag möts gång på gång av tappra försök till att “enhetstesta” WCF tjänster där det i själva verket har resulterat i mer eller mindre komplexa integrationstester. Anledningarna till detta har oftast sin grund i att det man byggt nyttjar WCF:s &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontext.aspx" target="_blank"&gt;OperationContext&lt;/a&gt; eller &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.servicesecuritycontext.aspx" target="_blank"&gt;ServiceSecurityContext&lt;/a&gt; för att hämta information från inkommande meddelande eller anropande användare. &lt;/p&gt;  &lt;p&gt;OperationContext och ServiceSecurityContext instansieras av WCF hosten och är således inte tillgängliga utanför WCF:s exekveringskontext. Lösningen på detta anses därför i många fall&amp;#160; vara att helt enkelt bygga “enhetstester” som hostar aktuell WCF-tjänst för att på så vis få tillgång till OperationContext och ServiceSecurityContext instanserna. Jag säger inte att detta är fel. Däremot vill jag absolut kalla denna typ av tester för &lt;em&gt;Integrationstester&lt;/em&gt;. Man testar helt enkelt sin tjänst tillsammans med övriga komponenter av vilka man inte har full kontroll över.&lt;/p&gt;  &lt;p&gt;Låt mig visa ett exempel. Nedan operation returnerar ett klasiskt “Hello” med användarnamnet på anropande användare.&lt;/p&gt;  &lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;OperationBehavior&lt;/span&gt;(Impersonation = &lt;span style="color: #2b91af"&gt;ImpersonationOption&lt;/span&gt;.Required)]
&lt;span style="color: blue"&gt;public string &lt;/span&gt;Hello() {

    &lt;span style="color: blue"&gt;var &lt;/span&gt;user = &lt;span style="color: #2b91af"&gt;ServiceSecurityContext&lt;/span&gt;.Current.WindowsIdentity.Name;
    &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Hello &amp;quot; &lt;/span&gt;+ user;

}&lt;/pre&gt;

&lt;p&gt;&lt;/a&gt;Ur ett enhetstestperspektiv finns det två problem med ovan “enkla” operation.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;ServiceSecurityContext.Current kommer vara &lt;em&gt;null &lt;/em&gt;om operationen inte exekverar inom en WCF host. &lt;/li&gt;

  &lt;li&gt;Om man istället sätter upp ett integrationstest för att få fatt i en instans av ServiceSecurityContext så kommer WindowsIdentity.Name returnera användarnamnet på det konto som exekverar testet. Dvs synnerligen svårt att skriva ett test som alltid är sant. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hur skall jag då göra för att verkligen kunna enhetstesta ovan operation? Som i många andra sammanhang med enhetstestning så får jag helt enkelt addera en abstraktion på, i detta fall, ServiceSecurityContext för att kunna ersätta implementationen med en &lt;em&gt;Mock&lt;/em&gt; eller &lt;em&gt;Stub. &lt;/em&gt;Det som kan röra till det hela i WCF':s fall är att ServiceSecurityContext inte implementerar något &lt;em&gt;Interface &lt;/em&gt;eller basklass som jag kan utgå ifrån. Jag börjar således med att skapa ett Interface som ser likadant ut som ServiceSecurityContext.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Chrislof.ServiceModel.Abstractions {
    
    &lt;span style="color: blue"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IServiceSecurityContext &lt;/span&gt;{

        &lt;span style="color: #2b91af"&gt;AuthorizationContext &lt;/span&gt;AuthorizationContext { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }

        &lt;span style="color: #2b91af"&gt;ReadOnlyCollection&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IAuthorizationPolicy&lt;/span&gt;&amp;gt; AuthorizationPolicies { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }

        &lt;span style="color: blue"&gt;bool &lt;/span&gt;IsAnonymous { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }

        &lt;span style="color: #2b91af"&gt;IIdentity &lt;/span&gt;PrimaryIdentity { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }

        &lt;span style="color: #2b91af"&gt;IWindowsIdentity &lt;/span&gt;WindowsIdentity { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }

    }
}&lt;/pre&gt;

&lt;p&gt;Detta Interface implementerar jag sedan i en sk &lt;em&gt;Wrapper&lt;/em&gt;. Denna wrapper-implementation tar en referens till aktuellt ServiceSecurityContext och vidarebefordrar endast anropen till den “riktiga” ServiceSecurityContext instansen.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;Chrislof.ServiceModel.Abstractions {
    &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;
    /// &lt;/span&gt;&lt;span style="color: green"&gt;Decorates the &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref=&amp;quot;ServiceSecurityContext&amp;quot;/&amp;gt; &lt;/span&gt;&lt;span style="color: green"&gt;for testability
    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;
    &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ServiceSecurityContextWrapper &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IServiceSecurityContext
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;private readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ServiceSecurityContext &lt;/span&gt;_context;

        &lt;span style="color: blue"&gt;public &lt;/span&gt;ServiceSecurityContextWrapper(&lt;span style="color: #2b91af"&gt;ServiceSecurityContext &lt;/span&gt;context) {

            context.ArgumentNotNull(&lt;span style="color: #a31515"&gt;&amp;quot;context&amp;quot;&lt;/span&gt;);
            _context = context;
        }

        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;AuthorizationContext &lt;/span&gt;AuthorizationContext {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_context.AuthorizationContext; }
        }

        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ReadOnlyCollection&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IAuthorizationPolicy&lt;/span&gt;&amp;gt; AuthorizationPolicies {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_context.AuthorizationPolicies; }
        }

        &lt;span style="color: blue"&gt;public bool &lt;/span&gt;IsAnonymous {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_context.IsAnonymous; }
        }

        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IIdentity &lt;/span&gt;PrimaryIdentity {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_context.PrimaryIdentity; }
        }

        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IWindowsIdentity &lt;/span&gt;WindowsIdentity {
            &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WindowsIdentityWrapper&lt;/span&gt;(_context.WindowsIdentity); }
        }
    }
}&lt;/pre&gt;

&lt;p&gt;För att nyttja ovan ServiceSecurityContextWrapper i min tjänsteimplementation adderar jag en constructor och ett privat fält som håller referensen till wrappern.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;Service(&lt;span style="color: #2b91af"&gt;IServiceSecurityContext &lt;/span&gt;securityContext) {
    _securityContext = securityContext;
}&lt;/pre&gt;

&lt;p&gt;Hello-operationen justeras till följande.&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;OperationBehavior&lt;/span&gt;(Impersonation = &lt;span style="color: #2b91af"&gt;ImpersonationOption&lt;/span&gt;.Required)]
&lt;span style="color: blue"&gt;public string &lt;/span&gt;Hello() {

    &lt;span style="color: blue"&gt;var &lt;/span&gt;user = &lt;font color="#ff0080"&gt;_securityContext&lt;/font&gt;.WindowsIdentity.Name;
    &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Hello &amp;quot; &lt;/span&gt;+ user;

}&lt;/pre&gt;

&lt;p&gt;Detta gör att jag nu kan tilldela min tjänst med ett ServiceSecurityContext som jag har full kontroll över inom ramen av mitt enhetstest. Jag använder i nedan exempel ramverket &lt;a href="http://code.google.com/p/moq/" target="_blank"&gt;Moq&lt;/a&gt; för att skapa en ServiceSecurityContext-stub som returnerar mitt användarnamn.&lt;/p&gt;

&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color: blue"&gt;public void &lt;/span&gt;Hello_WhenCalled_ReturnsHelloWithCurrentUser() {

    &lt;span style="color: blue"&gt;const string &lt;/span&gt;user = &lt;span style="color: #a31515"&gt;&amp;quot;Chrislof&amp;quot;&lt;/span&gt;;

    &lt;span style="color: blue"&gt;var &lt;/span&gt;securityContext = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IServiceSecurityContext&lt;/span&gt;&amp;gt;();
    securityContext.SetupGet(x =&amp;gt; x.WindowsIdentity.Name).Returns(user);
    
    &lt;span style="color: blue"&gt;var &lt;/span&gt;service = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Service&lt;/span&gt;(securityContext.Object);

    &lt;span style="color: blue"&gt;var &lt;/span&gt;response = service.Hello();

    &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: #a31515"&gt;&amp;quot;Hello Chrislof&amp;quot;&lt;/span&gt;,response);

}&lt;/pre&gt;

&lt;p&gt;Ovan konstruktor som kräver en parameter är inget som WCF diggar alls som standard. (&lt;a href="http://blogs.msdn.com/chrislof/archive/2009/01/28/wcf-och-dependency-injection.aspx" target="_blank"&gt;Se tidigare artikel ang detta&lt;/a&gt;) Jag behöver dessutom få WCF att ge mig en instans av min ServiceSecurityContextWrapper. Det absolut enklaste sättet att lösa detta är att infoga en defaultkonstruktor utan parametrar och i den instansiera ServiceSecurityContextWrapper.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;Service() : 
    &lt;span style="color: blue"&gt;this&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ServiceSecurityContextWrapper&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ServiceSecurityContext&lt;/span&gt;.Current)) {}&lt;/pre&gt;

&lt;p&gt;Ovan exempel finns att ladda ned här nedan. Projektet inkluderar även ett mer avancerat scenario med en &lt;a href="http://msdn.microsoft.com/en-us/library/ms731774(VS.85).aspx" target="_blank"&gt;ServiceAuthorizationManager&lt;/a&gt;. Använd gärna mina &lt;em&gt;Abstraktions-&lt;/em&gt;klasser men kom ihåg – de kommer &lt;em&gt;as-is&lt;/em&gt; utan någon som helst garanti eller support.&lt;/p&gt;

&lt;p&gt;Happy testing!&lt;/p&gt;
&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-fda44bafd37fcedf.skydrive.live.com/embedicon.aspx/blog/UnitTestingWcf.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9919072" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/Practices/default.aspx">Practices</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Testing/default.aspx">Testing</category></item><item><title>Routing med WCF 4</title><link>http://blogs.msdn.com/chrislof/archive/2009/11/02/routing-med-wcf-4.aspx</link><pubDate>Mon, 02 Nov 2009 22:17:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9916404</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9916404.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9916404</wfw:commentRss><description>&lt;p&gt;Att införa en eller flera sk &lt;em&gt;Message Routers&lt;/em&gt; i sin tjänsteorienterade lösning görs av olika anledningar. Vanligtvis rör det sig om mer avancerade behov som att kunna brygga mellan protokoll och transport sätt, versionshantera kontrakt, centraliserad säkerhetshantering med mera. Den grundläggande förmågan som Routern har för att möjliggöra allt detta är att inspektera inkommande meddelande och sedan skicka det vidare till definierad mottagare baserat på ett regelverk.&lt;/p&gt;  &lt;p&gt;WCF 4 tillhandahåller en färdig Routing-tjänst - Det du behöver göra är att konfigurera den efter dina behov.&lt;/p&gt;  &lt;h2&gt;Content Based Routing&lt;/h2&gt;  &lt;p&gt;Som jag skrev ovan bygger Routerns förmågor på att kunna skicka vidare ett inkommande meddelande till en definierad måltjänst. I mitt exempel denna gång visar jag vad som kallas för &lt;em&gt;Content Based Routing&lt;/em&gt; – dvs inspektera meddlandekroppen (läs Body) och skicka sedan vidare meddelandet baserat på meddelandeinnehåll.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="routing" border="0" alt="routing" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/RoutingmedWCF4_13668/routing_5.gif" width="331" height="222" /&gt; &lt;/p&gt;  &lt;p&gt;Konsumenten (C) har en &lt;em&gt;Proxy&lt;/em&gt; baserad på en ordertjänsts kontrakt (S). Istället för att ansluta till ordertjänstens ändpunkt så ansluter konsumenten till Routern (R). Routern kontrollerar om meddelandet kommer från en Premiumkund och skickar i sådant fall meddelandet vidare till en ordertjänst specifik för just Premiumkunder - 15% rabatt!. (I ett mer “riktigt” scenario skulle det kanske snarare röra sig om SLA-nivå eller liknande istället för en så enkel sak som rabatt.)&lt;/p&gt;  &lt;p&gt;Det första som behöver göras är naturligtvis att exponera Routing-tjänsten. &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.routing(VS.100).aspx" target="_blank"&gt;Det finns ett par olika kontrakt att välja på&lt;/a&gt; beroende på det kommunikationsmönster du önskar – &lt;em&gt;Message Exchange Pattern&lt;/em&gt;. I detta fall använder jag &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.routing.irequestreplyrouter(VS.100).aspx" target="_blank"&gt;IRequestReplyRouter&lt;/a&gt;. Implementationen &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.routing.routingservice(VS.100).aspx" target="_blank"&gt;RoutingService&lt;/a&gt; är densamma för alla tillgängliga kontrakt.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;services&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;service &lt;/span&gt;&lt;span style="color: red"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;routing&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;System.ServiceModel.Routing.RoutingService&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;host&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;baseAddresses&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;baseAddress&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://localhost:8080/router&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;baseAddresses&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;host&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpoint
      &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;basic&lt;/span&gt;&amp;quot;
      &lt;span style="color: red"&gt;address&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;basic-request-reply&lt;/span&gt;&amp;quot;
      &lt;span style="color: red"&gt;binding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;basicHttpBinding&lt;/span&gt;&amp;quot;
      &lt;span style="color: red"&gt;contract&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;System.ServiceModel.Routing.IRequestReplyRouter&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;service&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;services&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Nästa steg är att definiera de ändpunkter som Routern skall kunna skicka vidare meddelanden till. &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;client&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpoint
    &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;premiumCustomer&lt;/span&gt;&amp;quot;
    &lt;span style="color: red"&gt;address&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;net.tcp://localhost:8091/orders/premium-customer&lt;/span&gt;&amp;quot;
    &lt;span style="color: red"&gt;binding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;netTcpBinding&lt;/span&gt;&amp;quot;
    &lt;span style="color: red"&gt;contract&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;*&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpoint
    &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ordinaryCustomer&lt;/span&gt;&amp;quot;
    &lt;span style="color: red"&gt;address&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://localhost:8090/orders/ordinary-customer&lt;/span&gt;&amp;quot;
    &lt;span style="color: red"&gt;binding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;basicHttpBinding&lt;/span&gt;&amp;quot;
    &lt;span style="color: red"&gt;contract&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;*&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;client&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Så långt är det inga konstigheter – Det är nu det balla börjar på riktigt. &lt;/p&gt;

&lt;p&gt;Hjärtat i Routing-tjänsten är vad som kallas &lt;em&gt;Filter Tables &lt;/em&gt;och &lt;em&gt;Filters.&lt;/em&gt; Det är helt enkelt där jag definierar regelverket för hur meddelanden skall tolkas och skickas vidare. Jag vill i mitt exempel genomsöka meddelandekroppen efter kundnamnet “VS2010” och agera därefter. För att göra det använder jag filtertypen &lt;em&gt;XPath&lt;/em&gt;.&lt;em&gt; &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.routing.configuration.filtertype(VS.100).aspx" target="_blank"&gt;Det finns även här ett antal alternativ&lt;/a&gt;.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;routing&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;namespaceTable&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;prefix&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;c&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;namespace&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;urn:chrislof-examples&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;namespaceTable&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;filters&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;filter &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ordinaryCustomerFilter&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;filterType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;XPath&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;filterData&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;//c:customerName != 'VS2010'&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;filter &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;premiumCustomerFilter&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;filterType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;XPath&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;filterData&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;//c:customerName = 'VS2010'&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;filters&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;filterTables&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;filterTable &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;filterTable&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;filterName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ordinaryCustomerFilter&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;endpointName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ordinaryCustomer&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;filterName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;premiumCustomerFilter&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;endpointName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;premiumCustomer&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;filterTable&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;filterTables&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;routing&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;I filtertabellen definierar jag vilken ändpunkt meddelandet skall skickas vidare till om specificerat filter returnerar en match. &lt;/p&gt;

&lt;h2&gt;Dags att provköra!&lt;/h2&gt;

&lt;p&gt;Jag tycker mig behöva en ny Laptop och lägger därmed en order på en ny.&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Place order" border="0" alt="Place order" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/RoutingmedWCF4_13668/image_3.png" width="677" height="112" /&gt; &lt;/p&gt;

&lt;p&gt;Routern anser inte att jag är en Premiumkund och skickar således ordern vidare till &lt;em&gt;OrdinaryOrderService&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/RoutingmedWCF4_13668/image_10.png" width="677" height="112" /&gt; &lt;/p&gt;

&lt;p&gt;När jag istället beställer en Server i namnet &lt;em&gt;VS2010&lt;/em&gt; skickar Routern beställningen till &lt;em&gt;PremiumOrderService&lt;/em&gt; och ger mig därmed 15% rabatt.&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Place order" border="0" alt="Place order" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/RoutingmedWCF4_13668/image_11.png" width="677" height="112" /&gt; &lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/RoutingmedWCF4_13668/image_12.png" width="677" height="112" /&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;Avslutningsvis&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/chrislof/archive/2009/10/14/ws-discovery-med-wcf-4.aspx" target="_blank"&gt;Precis som med Discovery&lt;/a&gt; är ovan möjligt att implementera med WCF 3.x. Ett lysande exempel på det är &lt;a href="http://servicesengine.codeplex.com/" target="_blank"&gt;Managed Services Engine&lt;/a&gt;. Det är dock nu med WCF 4 betydligt enklare att implementera flera av dessa förmågor som MSE:n besitter på egen hand.&lt;/p&gt;

&lt;p&gt;Exemplet kan du ladda ned här. (Kräver VS2010 Beta 2)&lt;/p&gt;
&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-fda44bafd37fcedf.skydrive.live.com/embedicon.aspx/blog/WcfRouting.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9916404" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/VS2010/default.aspx">VS2010</category></item><item><title>Förändringar mellan WF4 Beta 1 och Beta 2</title><link>http://blogs.msdn.com/chrislof/archive/2009/10/20/f-r-ndringar-mellan-wf4-beta-1-och-beta-2.aspx</link><pubDate>Tue, 20 Oct 2009 18:11:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9910085</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9910085.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9910085</wfw:commentRss><description>&lt;p&gt;Få har nog missat att Visual Studio 2010 Beta 2 och .NET Framework 4 Beta 2 &lt;a href="http://blogs.msdn.com/robf/archive/2009/10/20/visual-studio-2010-beta-2-tillg-nglig-samt-msdn-relaunch.aspx"&gt;släpptes till MSDN prenumeranter igår&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Beta 2 innehåller en hel del förändringar baserade på kommentarer från er Betatestare världen över. Förändringar gällande Windows Workflow Foundation (WF) har &lt;a href="http://blogs.msdn.com/mwinkle/" target="_blank"&gt;Matt Winkler&lt;/a&gt; beskrivit i två alldeles strålande artiklar.&amp;#160; Den första beskriver generellt om förändringar i ramverket&amp;#160; medans den andra fokuserar på förändringar gjorda i designern (tack).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/endpoint/archive/2009/10/20/wf4-changes-between-beta-1-and-beta-2.aspx" target="_blank"&gt;WF4 Changes Between Beta 1 and Beta 2&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/mwinkle/archive/2009/10/20/wf4-designer-enhancements-in-vs-2010-beta-2.aspx" target="_blank"&gt;WF4 Designer Enhancements in VS 2010 Beta 2&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Tycker du som jag ? – Det är en spännande tid just nu :)&lt;/p&gt;  &lt;h6&gt;Jag vet.. Det är för enkelt att bara länka vidare. &lt;/h6&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9910085" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/Workflow/default.aspx">Workflow</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/WF/default.aspx">WF</category></item><item><title>WS-Discovery med WCF 4</title><link>http://blogs.msdn.com/chrislof/archive/2009/10/14/ws-discovery-med-wcf-4.aspx</link><pubDate>Wed, 14 Oct 2009 14:30:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9907164</guid><dc:creator>chrislof</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9907164.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9907164</wfw:commentRss><description>&lt;p&gt;Att WCF 4 nu kommer med stöd för &lt;a href="http://specs.xmlsoap.org/ws/2005/04/discovery/ws-discovery.pdf"&gt;WS-Discovery&lt;/a&gt; protokollet tycker jag är en riktig höjdare. Protokollet i sig är ingen nyhet men det är först i .NET 4.0 som WCF-stacken levereras med detta direkt &amp;quot;från fabrik&amp;quot;. &lt;/p&gt;  &lt;p&gt;Med hjälp av WS-Discovery kan tjänster och konsumenter kommunicera och hitta varandra utan något behov av tjänsteregister eller liknande. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Hur fungerar det då?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I mitt exempel (som jag lånat från &lt;a href="http://specs.xmlsoap.org/ws/2005/04/discovery/ws-discovery.pdf"&gt;WS-Discovery specifikationsdokumentet&lt;/a&gt;) har jag en konsument som söker efter en skrivare. Förfrågan skickas ut på nätverket och till svar får jag en lista med Endpoints som påstår sig implementera det kontrakt jag specificerat i min förfrågan (Probe).&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="discovery-probe" border="0" alt="discovery-probe" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/WSDiscoverymedWCF4_E0CE/discovery-probe_3.gif" width="352" height="242" /&gt; &lt;/p&gt;  &lt;p&gt;Det första jag måste göra för att få fart i detta är att skapa två sk &lt;em&gt;DiscoveryEndpoints&lt;/em&gt;; en på konsumentsidan och en på tjänstesidan. Denna typ av Endpoint finns med i WCF 4's uppsättning av sk &lt;em&gt;Standard Endpoints&lt;/em&gt; varför jag endast behöver lägga till ett Endpoint-element och sätta dess nytillkomna &lt;em&gt;Kind&lt;/em&gt; egenskap i konfiguration. Adresser , Bindningar och Kontrakt (som vi är vana vid att definiera på en Endpoint) hanterar WCF åt oss på Standard Endpoints.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpoint &lt;/span&gt;&lt;span style="color: red"&gt;kind&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;udpDiscoveryEndpoint&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;font size="1"&gt;&lt;em&gt;Ovan: Endpoint-definition tjänst.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;discoClient = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DiscoveryClient&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UdpDiscoveryEndpoint&lt;/span&gt;());
&lt;span style="color: blue"&gt;var &lt;/span&gt;criteria = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FindCriteria&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IPrintService&lt;/span&gt;));
&lt;span style="color: blue"&gt;var &lt;/span&gt;result = discoClient.Find(criteria);

&lt;span style="color: blue"&gt;var &lt;/span&gt;numberOfPrintersFound = result.Endpoints.Count;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Ovan: Konsument skickar förfrågan efter en skrivare&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Oftast är det ju också som så att jag söker efter en mer specifik skrivare. Vi har trots allt sju våningsplan på vårat kontor i Kista och det vore ju angenämt om min utskrift kunde hamna på en skrivare på det våningsplan jag anger. Ibland söker jag även efter en skrivare som klarar att skriva ut i färg. &lt;/p&gt;

&lt;p&gt;Denna typ av sökkriterier definieras i form av &lt;em&gt;Scopes&lt;/em&gt; och &lt;em&gt;Extensions&lt;/em&gt;. Dessa egenskaper kan tjänsterna exponera och när jag skickar en förfrågan om tjänst som uppfyller mina ställda kriterier så kommer jag endast få svar från tjänster som har matchande egenskaper definierade.&lt;/p&gt;

&lt;p&gt;I nedan exempel påstår skrivaren att den är lokaliserad på plan 3...&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpointBehaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpointDiscovery&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;scopes&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;scope&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ldap:///ou=floor3,ou=kista,o=chrislof-example,c=local&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;scopes&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpointDiscovery&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpointBehaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;... Och konsumenten adderar ett &lt;em&gt;Scope&lt;/em&gt; med samma värde i sin förfrågan.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;criteria = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FindCriteria&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IPrintService&lt;/span&gt;));
criteria.Scopes.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;ldap:///ou=floor3,ou=kista,o=chrislof-example,c=local&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

&lt;p&gt;I WS-Discovery finns det också funktionalitet definierad så att tjänster kan notifiera varandra om sin existens (&lt;em&gt;Announce&lt;/em&gt;). Det handlar i praktiken om att skicka ut notifiering om &amp;quot;Hej! Jag har startat upp nu - och jag finns på denna adress&amp;quot; alternativt &amp;quot;Vill bara tala om att jag stängs ned nu...&amp;quot;. Även detta är i WCF 4 implementerat med &lt;em&gt;Standard Endpoints&lt;/em&gt;, vilket gör det väldigt enkelt att anamma.&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="discovery-announce" border="0" alt="discovery-announce" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/WSDiscoverymedWCF4_E0CE/discovery-announce_3.gif" width="332" height="248" /&gt; &lt;/p&gt;

&lt;p&gt;Den lilla detaljen som jag måste beaktas är att Announcement-Endpointen måste definieras genom ett &lt;em&gt;ServiceDiscovery&lt;/em&gt;-behavior. Men detta är allt som jag behöver göra på tjänstesidan. &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceDiscovery&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;announcementEndpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpoint &lt;/span&gt;&lt;span style="color: red"&gt;kind&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;udpAnnouncementEndpoint&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;announcementEndpoints&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceDiscovery&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;På konsumentsidan behöver jag instansiera AnnouncementService och lyssna på dess Events OnlineAnnouncementReceived och OfflineAnnouncementReceived för att kunna agera därefter. Jag behöver även exponera denna tjänst med en Announcement Standard Endpoint.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;Konsument och Tjänst - och nu en Konsument som exponerar en Tjänst? Nja - Tjänster kan också vara konsumenter samt vice versa.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;announcementService = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;AnnouncementService&lt;/span&gt;();

announcementService.OfflineAnnouncementReceived += (o, e) =&amp;gt; 
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Bye {0}&amp;quot;&lt;/span&gt;, e.AnnouncementMessage.EndpointDiscoveryMetadata.Address);

announcementService.OnlineAnnouncementReceived += (o, e) =&amp;gt;
    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Hi! {0}&amp;quot;&lt;/span&gt;, e.AnnouncementMessage.EndpointDiscoveryMetadata.Address);&lt;/pre&gt;

&lt;p&gt;Så om jag knyter an till mitt tidigare exempel med skrivaren - så får jag i detta fall en notifiering om att skrivaren stängs av.&lt;/p&gt;
&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="announce" border="0" alt="announce" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/WSDiscoverymedWCF4_E0CE/image_5.png" width="677" height="154" /&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Hela tiden i ovan exempel är det sk &lt;em&gt;Ad Hoc Discovery&lt;/em&gt; (utan mellanhand) som används. Detta begränsar användandet till det lokala nätet då det är baserat på multicast meddelanden. För att möjliggöra Discovery över t ex Internet måste en sk &lt;em&gt;Discovery Proxy Service&lt;/em&gt; implementeras. Denna tjänst är inget som vid skrivandets stund levereras färdigt utan måste implementeras manuellt med utgångspunkt från &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.discovery.discoveryproxybase(VS.100).aspx"&gt;DiscoveryProxyBase&lt;/a&gt;. När man använder denna modell, med en Discovery Proxy , kallas det för &lt;em&gt;Managed Discovery&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Att visa hur man implementerar en Discovery Proxy är utanför omfattningen av denna artikel.&lt;/p&gt;

&lt;p&gt;Ladda ned ovan exempel här:&lt;/p&gt;
&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-fda44bafd37fcedf.skydrive.live.com/embedicon.aspx/blog/Wcf4Discovery.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9907164" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/VS2010/default.aspx">VS2010</category></item><item><title>Introduktion till SOA Advanced Application Blocks</title><link>http://blogs.msdn.com/chrislof/archive/2009/10/06/introduktion-till-soa-advanced-application-blocks.aspx</link><pubDate>Tue, 06 Oct 2009 21:19:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9903874</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9903874.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9903874</wfw:commentRss><description>&lt;p&gt;&lt;em&gt;SOA Advanced Application Blocks&lt;/em&gt; är en samling av applikationsblock (á la Enterprise Library) som är baserade på mönster som vi konsulter har samlat på oss, tillsammans med partners och kunder, genom engagemang vid framtagandet av tjänsteorienterade lösningar. &lt;/p&gt;  &lt;p&gt;Applikationsblocken ämnar att hjälpa den enskilda utvecklaren vid implementeringen av applikationer som skall ingå i en tjänsteorienterad arkitektur genom att bidra med byggstenar för förmågor som ofta efterfrågas. Applikationsblocken kan användas tillsammans eller var för sig. Undantaget är &lt;em&gt;Service Agent&lt;/em&gt; applikationsblocket som är beroende av &lt;em&gt;Directory Service &lt;/em&gt;applikationsblocket.&lt;/p&gt;  &lt;p&gt;Följande applikationsblock är del av &lt;em&gt;SOA Advanced Application Blocks &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Untitled3" border="0" alt="Untitled3" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/IntroduktiontillSOAAdvancedApplicationBl_1331B/Untitled3_3.gif" width="558" height="197" /&gt;&lt;/p&gt;  &lt;h3&gt;Requestor Side Caching Application Block&lt;/h3&gt;  &lt;p&gt;Detta applikationsblock möjliggör caching av responsmeddelanden från tjänster och har stöd för både offline och online scenarion.&lt;/p&gt;  &lt;h3&gt;Directory Service Application Block&lt;/h3&gt;  &lt;p&gt;Detta applikationsblock möjliggör dynamisk namnupplösning av ändpunktsadresser från en central tjänstekatalog, vilket medför en lös koppling mellan klientapplikationen och den faktiska platsen för en ändpunkt.&lt;/p&gt;  &lt;h3&gt;Policy Service Application Block&lt;/h3&gt;  &lt;p&gt;Detta block möjliggör en centraliserad hantering av regler (läs Policy) som är associerade med tjänster. Dessa regler kan hanteras och appliceras på tjänster i runtime.&lt;/p&gt;  &lt;h3&gt;Service Agent Application Block&lt;/h3&gt;  &lt;p&gt;Tjänsteagenten (läs Service Agent) utökar det sk Proxy-mönstret genom att tillföra ytterligare förmågor med hjälp av de övriga applikationsblocken. Det gör det t ex möjligt för klienten att dynamiskt hitta platsen för en ändpunkt och därefter konfigurera bindningarna att möta kraven som ställs av tjänstens definierade regler.&lt;/p&gt;  &lt;p&gt;Jag kommer i en artikelserie framöver gå in mer i detalj på varje enskilt applikationsblock.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9903874" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/EntLib/default.aspx">EntLib</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/SOAAB/default.aspx">SOAAB</category></item><item><title>Förenklad konfiguration med WCF 4</title><link>http://blogs.msdn.com/chrislof/archive/2009/10/02/f-renklad-konfiguration-med-wcf-4.aspx</link><pubDate>Fri, 02 Oct 2009 21:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9902590</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9902590.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9902590</wfw:commentRss><description>&lt;p&gt;När jag med WCF 3.x väljer att generera en Proxy med hjälp av &lt;i&gt;svcutil&lt;/i&gt; eller &lt;i&gt;Add Service Reference&lt;/i&gt; i Visual Studio så läggs det till en hel del konfiguration i .config-filen. Mycket av denna information kan jag, som oftast, ta bort. Det som minst måste vara kvar är definitionerna av den adress, binding och det kontrakt som tjänsten jag skall konsumera använder - vilket kan rymmas på tre rader. Men även dessa tre rader konfiguration är något som jag upplever som hinder för många för att vilja ta till sig WCF.&lt;/p&gt;  &lt;p&gt;En glädjande nyhet för alla, oavsett om du hoppat på WCF tåget eller inte, är att vi med WCF 4 inte behöver ha ens ett system.serviceModel element i vår .config-fil för att göra en tjänst åtkomlig för konsumtion. Det är lite som med &lt;a href="http://www.microsoft.com/windows/virtual-pc/default.aspx" mce_href="http://www.microsoft.com/windows/virtual-pc/default.aspx"&gt;XP Mode&lt;/a&gt; i Windows 7 - det finns ingen anledning längre att inte uppgradera. &lt;/p&gt;  &lt;h3&gt;Default Endpoints&lt;/h3&gt;  &lt;p&gt;Grunden till detta är något som kallas för Default Endpoints - baserat på mitt val av protokollschema bygger WCF-stacken upp mina Endpoints automatiskt.&lt;/p&gt;  &lt;p&gt;Titta på nedan exempel. Förutom tjänstekontraktet MotorbikeService är detta allt som min applikation nu består av. Ingen app.config för att definiera tjänsten eller dess Endpoints , och allt jag behöver göra i koden är att ange de URI:er där jag vill ha tjänsten exponerad.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args) {&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;host = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: rgb(43,145,175)"&gt;ServiceHost&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43,145,175)"&gt;MotorbikeService&lt;/span&gt;),&lt;br /&gt;        &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: rgb(43,145,175)"&gt;Uri&lt;/span&gt;(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;http://localhost:8080/bikeStore&amp;quot;&lt;/span&gt;),&lt;br /&gt;        &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: rgb(43,145,175)"&gt;Uri&lt;/span&gt;(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;net.tcp://localhost:8081/bikeStore&amp;quot;&lt;/span&gt;));&lt;br /&gt;    host.Open();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;endpoint &lt;span style="color: blue"&gt;in &lt;/span&gt;host.Description.Endpoints) {&lt;br /&gt;        &lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;{0} - {1}&amp;quot;&lt;/span&gt;, endpoint.Address, endpoint.Binding.Name));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.Read();&lt;br /&gt;    host.Close();&lt;br /&gt;}&lt;/pre&gt;

&lt;p&gt;När jag väljer att köra applikationen så ser vi också vilka Bindings WCF-stacken har valt åt mig, baserat på ändpunkternas protokollscheman.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="BasicHttpBinding" border="0" alt="BasicHttpBinding" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_thumb_1.png" width="677" height="392" mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_thumb_1.png" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Mappningarna mellan protokollschema och Binding är definierade i machine.config. Vill du t ex ändra standard Binding för http-schemat till en Binding med stöd för WS-* protokollen så kan du göra det på maskin nivå men också på applikationsnivå i app.config.&lt;/p&gt;

&lt;p&gt;Nu, när jag går ifrån WCF:s standardkonventioner, behöver jag lägga till system.serviceModel-elementet i min app.config. Därefter ändrar jag mappningen från BasicHttpBinding till WS2007Binding i protocolMappings-elementet. &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;!-- &lt;/span&gt;&lt;span style="color: green"&gt;ändra default binding för http-schemat till ws2007HttpBinding &lt;/span&gt;&lt;span style="color: blue"&gt;--&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;protocolMapping&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;scheme&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;binding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ws2007HttpBinding&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;protocolMapping&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Kör jag applikationen igen så ser vi att WCF-stacken nu bygger upp en WS2007Binding åt mig istället.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="WS2007Binding" border="0" alt="WS2007Binding" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_thumb_2.png" width="677" height="392" mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_thumb_2.png" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Alla mina tjänster som är exponerade över en HTTP-Endpoint kommer nu att använda WS2007Binding:en med dess standardinställningar. För att göra justeringar i dessa standardinställningar behövde jag i WCF 3.x överrida dem med en explicit Binding-konfiguration per Endpoint. Med WCF 4 kan jag nu överrida standardinställningarna på en Binding genom att definiera en namnlös Binding-konfiguration.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;!-- &lt;/span&gt;&lt;span style="color: green"&gt;ändra default binding för http-schemat till ws2007HttpBinding &lt;/span&gt;&lt;span style="color: blue"&gt;--&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;protocolMapping&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;scheme&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;binding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ws2007HttpBinding&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;protocolMapping&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;ws2007HttpBinding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;       &amp;lt;!-- &lt;/span&gt;&lt;span style="color: green"&gt;flödande transaktioner som default &lt;/span&gt;&lt;span style="color: blue"&gt;--&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;binding &lt;/span&gt;&lt;span style="color: red"&gt;transactionFlow&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;ws2007HttpBinding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h3&gt;Förenklad IIS hosting&lt;/h3&gt;

&lt;p&gt;För att husera WCF-tjänster i IIS:en så är vi vana vid att skapa en .svc-fil som pekar ut vilken tjänst som skall hantera förfrågan. Med WCF 3.x räckte det inte att skapa denna fil – vi var även tvungen att definiera minst en Endpoint i web.config. &lt;b&gt;Detta är med WCF 4 historia -&amp;#160; jag lägger dit min .svc-fil och är därmed klar att erbjuda tjänsten för konsumtion.&lt;/b&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background: yellow; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: maroon"&gt;ServiceHost &lt;/span&gt;&lt;span style="color: red"&gt;Service&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;ByeAsmx.MotorbikeService&amp;quot; &lt;/span&gt;&lt;span style="background: yellow; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/chrislof/archive/2009/09/01/rest-med-wcf-4-beta-1.aspx" mce_href="http://blogs.msdn.com/chrislof/archive/2009/09/01/rest-med-wcf-4-beta-1.aspx"&gt;Om du minns min förra artikel&lt;/a&gt; om WCF 4 så har jag nu också ett frestande val att lägga till system.serviceModel-elementet i web.config &lt;a href="http://blogs.msdn.com/chrislof/archive/2009/09/01/rest-med-wcf-4-beta-1.aspx" mce_href="http://blogs.msdn.com/chrislof/archive/2009/09/01/rest-med-wcf-4-beta-1.aspx"&gt;och därmed slopa .svc-filen.&lt;/a&gt;&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;serviceHostingEnvironment&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;serviceActivations&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;relativeAddress&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/BikeStore&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;service&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ByeAsmx.MotorbikeService&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;serviceActivations&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;serviceHostingEnvironment&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="inge .svc" border="0" alt="inge .svc" src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_thumb.png" width="565" height="61" mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/FrenkladkonfigurationmedWCF4_1464D/image_thumb.png" /&gt;&lt;/a&gt; 

&lt;p&gt;.svc-fil eller &lt;i&gt;Address Activation&lt;/i&gt; för dina asmx-ersättare? &lt;/p&gt;

&lt;p&gt;Exempelkod finns att ladda ned här.&lt;/p&gt;
&lt;iframe style="border-bottom: rgb(221,229,233) 1px solid; border-left: rgb(221,229,233) 1px solid; padding-bottom: 0px; background-color: rgb(255,255,255); margin: 3px; padding-left: 0px; width: 240px; padding-right: 0px; height: 66px; border-top: rgb(221,229,233) 1px solid; border-right: rgb(221,229,233) 1px solid; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-fda44bafd37fcedf.skydrive.live.com/embedrowdetail.aspx/blog/Wcf4SimplifiedConfig.zip" frameborder="0" marginwidth="0" scrolling="no" mce_src="http://cid-fda44bafd37fcedf.skydrive.live.com/embedrowdetail.aspx/blog/Wcf4SimplifiedConfig.zip"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9902590" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/VS2010/default.aspx">VS2010</category></item><item><title>Principer för tjänstedesign</title><link>http://blogs.msdn.com/chrislof/archive/2009/09/27/principer-f-r-tj-nstedesign.aspx</link><pubDate>Sun, 27 Sep 2009 22:40:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9900045</guid><dc:creator>chrislof</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9900045.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9900045</wfw:commentRss><description>&lt;p&gt;Nyttan med Tjänster är som störst när de återanvänds om och om igen. Detta är en av anledningarna till varför Webbtjänster (oftast SOAP/HTTP) är ett populärt sätt att implementera dessa Tjänster - det ger oss nåbarhet från många olika plattformar. Med nåbarheten kommer också möjligheten till återanvändning.&lt;/p&gt;  &lt;p&gt;Allt för sällan finns det ett gemensamt register över tillgängliga tjänster. Men även om det skulle finnas ett register krävs det att man förhåller sig till ett antal principer för att hjälpa konsumenterna att hitta rätt tjänst och slutligen rätt operation(er) i detta register.&lt;/p&gt;  &lt;p&gt;Jag har i denna artikel sammanställt de principer som jag anser är de viktigaste att anamma för att maximera återanvändningen av enskilda tjänster.&lt;/p&gt;  &lt;h2&gt;Namnge för konsumtion&lt;/h2&gt;  &lt;p&gt;Använd namn och begrepp som är bekanta för de som skall konsumera tjänsterna. Oftast är begrepp från den aktuella domänen mer meningsfulla för konsumenten än tekniska begrepp. &lt;/p&gt;  &lt;p&gt;En tumregel kan också vara att använda substantiv till tjänstenamn och verb till operationsnamn.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IManageMotorbikeData
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;int &lt;/span&gt;InsertMotorbikeRecord();

    &lt;span style="color: blue"&gt;bool &lt;/span&gt;UpdateMotorbikeRecord();
}&lt;/pre&gt;

&lt;p&gt;Ovan: Tjänstedefinition som använder verb och IT-begrepp. &lt;/p&gt;

&lt;p&gt;Nedan: Tjänstedefinition som använder substantiv och verb från verksamhetsdomänen.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IMotorbikeService
&lt;/span&gt;{
    &lt;span style="color: #2b91af"&gt;Motorbike &lt;/span&gt;CreateNewMotorbike();

    &lt;span style="color: #2b91af"&gt;Parts &lt;/span&gt;UpgradeBikeWithCarbonParts(&lt;span style="color: #2b91af"&gt;Motorbike &lt;/span&gt;motorbike);
}&lt;/pre&gt;

&lt;h2&gt;Balansera antalet operationer per tjänst&lt;/h2&gt;

&lt;p&gt;Hitta en bra balans mellan antal tjänster och antal operationer per tjänst. &lt;/p&gt;

&lt;p&gt;En tjänst blir ofta den enhet som testas och till slut släpps för konsumtion, vilket gör att tjänster med stort antal operationer kan påverka många konsumenter samt att de tar längre tid att testa och kvalitetssäkra. Har man istället många tjänster med få operationer per tjänst kan det bli svårare att hitta tjänsten med önskad operation.&lt;/p&gt;

&lt;h2&gt;Tjänsterna skall vara sammanhängande&lt;/h2&gt;

&lt;p&gt;Detta hänger till viss del ihop med föregående princip. Designa tjänsterna på så vis att dess operationer hör ihop. Vad som gör att de hänger ihop kan dock variera. Det kan t ex röra sig om;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Operationerna skall täcka de funktioner som behövs för att uppfylla ett scenario&lt;/li&gt;

  &lt;li&gt;Operationer som skall täcka de funktioner som kan utföras på en viss typ av entitet&lt;/li&gt;

  &lt;li&gt;En konsument har efterfrågat en tjänst med en specifik uppsättning operationer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Använd grovkorniga parametrar&lt;/h2&gt;

&lt;p&gt;Att definiera &amp;quot;grovkorniga&amp;quot; parametrar för en operation medför flera fördelar. För det första blir den enklare att använda. För det andra underlättare det kommande versionshantering av tjänstekontraktet då en förändring i datastrukturen inte behöver förändra signaturen på operationen.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;int &lt;/span&gt;CreateNewMotorbike(&lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: blue"&gt;string &lt;/span&gt;brand, &lt;span style="color: blue"&gt;string &lt;/span&gt;color, &lt;span style="color: blue"&gt;double &lt;/span&gt;price);&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Ovan: Finkorniga parametrar&lt;/p&gt;

&lt;p&gt;Nedan: Grovkorniga parametrar&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;Motorbike &lt;/span&gt;CreateNewMotorbike(&lt;span style="color: #2b91af"&gt;MotorbikeDetails &lt;/span&gt;newMotorbike);&lt;/pre&gt;

&lt;h2&gt;Men tänk på..&lt;/h2&gt;

&lt;p&gt;När många i din organisation tycker att det fungerar kanon med Webbtjänster och vill ha mer och antalet konsumenter ökar - det är då problemen med konsumtion brukar uppenbara sig. &lt;em&gt;Hur avvecklar vi en tjänst?&lt;/em&gt; &lt;em&gt;Hur uppgraderar vi en tjänst från v1 till v2 utan att behöva uppdatera 20 konsumerande system?&lt;/em&gt; Rekommendationen är att samtidigt som du tar till dig ovan principer överväger att implementera ett virtualieringslager. &lt;a href="http://download.microsoft.com/download/2/D/E/2DE3C816-4B05-42E7-AC19-170F9F7F21B6/Why%20Service%20Virtualization%20Matters%20.pdf"&gt;Why Service Virtualization Matters&lt;/a&gt; är ett utmärkt whitepaper som introducerar dig till just detta.&lt;/p&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9900045" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/MSE/default.aspx">MSE</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Principles/default.aspx">Principles</category></item><item><title>Kom och prata Azure med mig på Microsoft Summit</title><link>http://blogs.msdn.com/chrislof/archive/2009/09/07/kom-och-prata-azure-med-mig-p-microsoft-summit.aspx</link><pubDate>Mon, 07 Sep 2009 16:28:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9892225</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9892225.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9892225</wfw:commentRss><description>&lt;p&gt;Den 1:a oktober huserar vi &lt;a href="http://www.microsoft.com/sverige/summit/home.mspx" target="_blank"&gt;Microsoft Summit&lt;/a&gt; på Kistamässan. &lt;/p&gt;  &lt;p&gt;Jag kommer finnas på plats under dagen för att diskutera dina tekniska frågor rörande &lt;a href="http://www.azure.com" target="_blank"&gt;Azure Services Platform&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;- Hur migrerar vi bäst applikation x till Windows Azure?     &lt;br /&gt;- Skulle .NET Service Bus kunna hjälpa oss i sammanhang y?      &lt;br /&gt;- SQL Azure eller Windows Azure Storage?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Vill du vara helt säker på att få en pratstund med mig så rekommenderar jag att du &lt;a href="http://www.microsoft.com/sverige/summit/boka-mote.mspx" target="_blank"&gt;bokar en tid&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9892225" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/Azure+Services+Platform/default.aspx">Azure Services Platform</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Microsoft+Summit/default.aspx">Microsoft Summit</category></item><item><title>REST med WCF 4 Beta 1</title><link>http://blogs.msdn.com/chrislof/archive/2009/09/01/rest-med-wcf-4-beta-1.aspx</link><pubDate>Tue, 01 Sep 2009 18:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9889909</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9889909.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9889909</wfw:commentRss><description>&lt;P&gt;Med WCF 4 introduceras en hel del nyheter. Denna artikel fortsätter på det &lt;A href="http://blogs.msdn.com/chrislof/archive/2009/08/06/tillbaka-till-framtiden-med-rest.aspx" target=_blank mce_href="http://blogs.msdn.com/chrislof/archive/2009/08/06/tillbaka-till-framtiden-med-rest.aspx"&gt;REST-tema jag påbörjade tidigare&lt;/A&gt; och fokuserar specifikt på vad som är nytt i WCF 4 Beta 1 som hjälper oss i byggandet av REST-tjänster. Inte helt oväntat är det till stor del funktionalitet som vi känner igen från &lt;A href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644" target=_blank mce_href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644"&gt;REST Starter Kit&lt;/A&gt; som nu hittat in i själva ramverket. Någonting säger mig att så kommer det också fortsatt vara vid Beta 2 lanseringen men, det är bara en personlig gissning.&lt;/P&gt;
&lt;H2&gt;Hjälpsida&lt;/H2&gt;
&lt;P&gt;Hjälpsidan är i själva verket en Atom Feed. De flesta Web Browsers har dock någon form av Feed läsare i sig, vilket du kan se i nedan exempel där Internet Explorer visar Feed:en i ett läsbart format, vilket gör att du väldigt enkelt kan se tjänstens exponerade resurser. Vidare ger hjälpsidan information om URI-format, responsformat, exempel på responstyper etc. Skriv in “help” efter tjänstens basadress för att visa hjälpsidan.&lt;/P&gt;
&lt;P&gt;&lt;IMG style="WIDTH: 419px; HEIGHT: 358px" src="http://dnebmw.blu.livefilestore.com/y1pqLcCgnrPXLEv5-c2Mt1ASlnm6faWQ5H5IjzVCBkIdRlS8YLERBb90gJTXHRZqu7odndOeGZ_YkBuvh0DKFPtnPgXA7zAA7jj/helppage.jpg" width=832 height=662 mce_src="http://dnebmw.blu.livefilestore.com/y1pqLcCgnrPXLEv5-c2Mt1ASlnm6faWQ5H5IjzVCBkIdRlS8YLERBb90gJTXHRZqu7odndOeGZ_YkBuvh0DKFPtnPgXA7zAA7jj/helppage.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Då hjälpsidan är en Atom Feed innebär det också att du har möjlighet att programmatiskt prenumerera på hjälpsidans innehåll om du så önskar.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Men hur aktiverar man det då?&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Saken är den att funktionen är aktiverad som standard. Det är &lt;EM&gt;webHttpBehavior&lt;/EM&gt; som har begåvats med ytterligare en egenskap - &lt;EM&gt;enableHelp&lt;/EM&gt;, vilken är satt till “true” som standard av &lt;EM&gt;WebServiceHost&lt;/EM&gt;.&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;endpointBehaviors&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
  &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;behavior &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;HelpBehavior&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;webHttp &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;enableHelp&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;" &lt;SPAN style="COLOR: blue"&gt;/&amp;gt;
  &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;behavior&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;endpointBehaviors&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;H2&gt;WAS aktivering av tjänster utan .svc-fil.&lt;/H2&gt;
&lt;P&gt;RESTafarier kan inte tolerera URL:er som inte "ser snygga ut", eller är &lt;EM&gt;RESTfulla&lt;/EM&gt;. De kommer gilla detta.&lt;/P&gt;
&lt;P&gt;Med WCF 3.5 sker WAS aktivering av en tjänst mha en .svc fil, vilket i detta fall genererar en URI enligt nedan.&lt;/P&gt;
&lt;P&gt;&lt;IMG style="WIDTH: 453px; HEIGHT: 39px" src="http://dnebmw.blu.livefilestore.com/y1pwIeDYPH_uKyuwOrDJX5iBuRqwSm_uNL322oTsFYed-YqNGBkQ-CMRk5KSLpzeypKsItyvZZUGjEBD78QGlQXsA/notsonice.jpg" width=453 height=39 mce_src="http://dnebmw.blu.livefilestore.com/y1pwIeDYPH_uKyuwOrDJX5iBuRqwSm_uNL322oTsFYed-YqNGBkQ-CMRk5KSLpzeypKsItyvZZUGjEBD78QGlQXsA/notsonice.jpg"&gt;&lt;/P&gt;
&lt;P&gt;I WCF 4 kommer möjligheten att göra denna aktivering baserat på en relativ adress. I följande exempel har jag angivit att den relativa adressen "/Customers" skall aktivera min tjänst “CustomerService”. På så vis kan jag nu tydligare få till exponeringen av min kollektion av kunder.&lt;/P&gt;
&lt;P&gt;&lt;IMG style="WIDTH: 418px; HEIGHT: 36px" src="http://dnebmw.blu.livefilestore.com/y1pX1SJZ5oBaZvinQET6xffGYSWpbkxEBbV5mkd7z62REBbEcISKjjoN-RuHbo6iakM3jA9EiJz0kGRKmkQV7mluA/nice.jpg" width=418 height=36 mce_src="http://dnebmw.blu.livefilestore.com/y1pX1SJZ5oBaZvinQET6xffGYSWpbkxEBbV5mkd7z62REBbEcISKjjoN-RuHbo6iakM3jA9EiJz0kGRKmkQV7mluA/nice.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Så, kasta din .svc fil och lägg till detta i web.config istället:&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;serviceHostingEnvironment&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
  &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;serviceActivations&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;relativeAddress&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;Customers&lt;/SPAN&gt;" &lt;SPAN style="COLOR: red"&gt;service&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;NoSvcFile.CustomerService&lt;/SPAN&gt;" 
         &lt;SPAN style="COLOR: red"&gt;factory&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;System.ServiceModel.Activation.WebServiceHostFactory&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;/&amp;gt;
  &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;serviceActivations&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;serviceHostingEnvironment&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;H2&gt;HTTP Caching&lt;/H2&gt;
&lt;P&gt;En av fördelarna med REST är att du kan dra nytta av HTTP infrastruktur för Caching, t ex IIS:ens output cache. Detta sker i WCF 4 med en integration gjord till ASP.NET:s Caching förmågor. Med det nya attributet &lt;EM&gt;AspNetCacheProfile&lt;/EM&gt; kan du ange vilken Cache Profile du vill använda för specifik operation.&lt;/P&gt;&lt;PRE class=code&gt;[OperationContract]
[WebGet]
[AspNetCacheProfile(&lt;SPAN style="COLOR: #a31515"&gt;"defaultCacheProfile"&lt;/SPAN&gt;)]
&lt;SPAN style="COLOR: blue"&gt;public &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;List&lt;/SPAN&gt;&amp;lt;Customer&amp;gt; GetCustomers() {&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;Definiera sedan Cache Profilen i web.config som vanligt.&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;system.web&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
  &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;compilation &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;debug&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;" &lt;SPAN style="COLOR: red"&gt;targetFrameworkMoniker&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;.NETFramework,Version=v4.0&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;/&amp;gt;
  &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;caching&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;outputCacheSettings&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;outputCacheProfiles&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
        &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;add &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;name&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;defaultCacheProfile&lt;/SPAN&gt;" &lt;SPAN style="COLOR: red"&gt;duration&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;10&lt;/SPAN&gt;" &lt;SPAN style="COLOR: red"&gt;varyByParam&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;*&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;/&amp;gt;
      &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;outputCacheProfiles&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
    &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;outputCacheSettings&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;caching&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;
&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #a31515"&gt;system.web&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;H2&gt;Exempelkod&lt;/H2&gt;
&lt;P&gt;Ladda ned exempel för ovan här:&lt;/P&gt;&lt;IFRAME style="BORDER-BOTTOM: #dde5e9 1px solid; BORDER-LEFT: #dde5e9 1px solid; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #ffffff; MARGIN: 3px; PADDING-LEFT: 0px; WIDTH: 240px; PADDING-RIGHT: 0px; HEIGHT: 66px; BORDER-TOP: #dde5e9 1px solid; BORDER-RIGHT: #dde5e9 1px solid; PADDING-TOP: 0px" marginHeight=0 src="http://cid-fda44bafd37fcedf.skydrive.live.com/embedrowdetail.aspx/blog/dev10-4beta1rest.zip" frameBorder=0 marginWidth=0 scrolling=no mce_src="http://cid-fda44bafd37fcedf.skydrive.live.com/embedrowdetail.aspx/blog/dev10-4beta1rest.zip"&gt;&lt;/IFRAME&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9889909" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/REST/default.aspx">REST</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/VS2010/default.aspx">VS2010</category></item><item><title>Kanban med Team Foundation Server på 15 minuter</title><link>http://blogs.msdn.com/chrislof/archive/2009/08/11/kanban-med-team-foundation-server-p-15-minuter.aspx</link><pubDate>Wed, 12 Aug 2009 00:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9865025</guid><dc:creator>chrislof</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrislof/comments/9865025.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrislof/commentrss.aspx?PostID=9865025</wfw:commentRss><description>&lt;P&gt;Det börjar ploppa upp en del verktyg på nätet för att hålla koll på sina projekt med hjälp av ett sk &lt;EM&gt;Kanban Board&lt;/EM&gt;. Idén i sig härstammar från Taiichi Ohno's produktionssystem med ursprung hos Toyota. Jag dyker inte in djupare än så i historien och mina tankarna kring Kanban och Lean. Med denna artikel vill jag bara påvisa att man kan tillämpa detta även med Team Foundation Server. Jag visar här hur du med enkla sätt kan skapa er ett Kanban Board utan att behöva bygga processmallar och liknande. Allt som krävs är lite Reporting Services kunskap.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;-Ett Kanban Board tack. &lt;BR&gt;-15 minuter en kvart kompis.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Go!&lt;/P&gt;
&lt;H2&gt;0 min&lt;/H2&gt;
&lt;P&gt;Teamprojekt baserat på processmallen MSF for Agile Software Development 5.0 finns skapat sedan tidigare. &lt;A href="http://msdn.microsoft.com/en-us/library/bb737953(VS.100).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/bb737953(VS.100).aspx"&gt;Jag är även med i nödvändiga SQL roller&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;1 min&lt;/H2&gt;
&lt;P&gt;Jag sätter upp &lt;EM&gt;Areas&lt;/EM&gt; och &lt;EM&gt;Iterations&lt;/EM&gt; för att använda som processteg och &lt;EM&gt;User Story&lt;/EM&gt; status.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001_2.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image001 border=0 alt=clip_image001 src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001_thumb.png" width=244 height=227 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001_thumb.png"&gt;&lt;/A&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002_2.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image002 border=0 alt=clip_image002 src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002_thumb.png" width=244 height=227 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Siffran innan namnet på processteget är endast till för sorteringens skull i rapporten. Siffran inom parantes anger gränsvärdet för maximalt antal User Stories för det steget. Stegen och gränsvärdena är helt plockade ur luften för denna demonstrations skull!&lt;/P&gt;
&lt;H2&gt;2 min&lt;/H2&gt;
&lt;P&gt;Jag skapar ett Report Server projekt ...&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B4%5D.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B4%5D.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image001[4] border=0 alt=clip_image001[4] src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B4%5D_thumb.png" width=385 height=273 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B4%5D_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;... och en rapport.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B4%5D.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B4%5D.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image002[4] border=0 alt=clip_image002[4] src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B4%5D_thumb.png" width=396 height=258 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B4%5D_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;H2&gt;2:30 min&lt;/H2&gt;
&lt;P&gt;Jag lägger till en datakälla till rapporten...&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B6%5D.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B6%5D.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image001[6] border=0 alt=clip_image001[6] src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B6%5D_thumb.png" width=401 height=310 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B6%5D_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;... och ett Dataset.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B6%5D.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B6%5D.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image002[6] border=0 alt=clip_image002[6] src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B6%5D_thumb.png" width=408 height=345 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B6%5D_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Som fråga för Dataset:et anger jag SQL utrycket:&lt;/P&gt;&lt;PRE class=code&gt;SELECT 
    System_Id, 
    System_Title,
    IterationName,
    AreaName,
    System_AssignedTo,
    Microsoft_VSTS_Scheduling_StoryPoints,
    Microsoft_VSTS_Common_StackRank
FROM
    CurrentWorkItemView
WHERE
    System_WorkItemType = 'User Story' AND
    System_State = 'Active'
ORDER BY
    ISNULL(Microsoft_VSTS_Common_StackRank,9999),
    System_Id&lt;/PRE&gt;
&lt;H2&gt;4 min&lt;/H2&gt;
&lt;P&gt;Dags att bygga rapporten!&lt;/P&gt;
&lt;P&gt;Jag släpar först ut en &lt;EM&gt;List&lt;/EM&gt;-kontroll från verktygslådan. Sedan tar jag bort ev&lt;EM&gt; Row Group&lt;/EM&gt; och lägger till fältet &lt;EM&gt;IterationName&lt;/EM&gt; som en &lt;EM&gt;Column Group&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B8%5D.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B8%5D.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image001[8] border=0 alt=clip_image001[8] src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B8%5D_thumb.png" width=421 height=333 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B8%5D_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Jag släpar sedan ut ytterligare en &lt;EM&gt;List&lt;/EM&gt;-kontrol som jag lägger i detaljarean på den första listan. Denna skall lista alla User Stories för aktuellt processteg.&lt;/P&gt;
&lt;P&gt;I listan lägger jag sedan en &lt;EM&gt;Rectangle&lt;/EM&gt;-kontroll för som skall agera &lt;EM&gt;Story Card&lt;/EM&gt;. I denna &lt;EM&gt;Rectangle&lt;/EM&gt;-kontroll lägger jag fälten &lt;EM&gt;System_Id&lt;/EM&gt;, &lt;EM&gt;System_Title&lt;/EM&gt;, &lt;EM&gt;Assigned_To&lt;/EM&gt; och &lt;EM&gt;Microsoft_VSTS_Scheduling_StoryPoints&lt;/EM&gt;. Jag har nu en rapport som i designern ser ut på följande sätt:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B8%5D.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B8%5D.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image002[8] border=0 alt=clip_image002[8] src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B8%5D_thumb.png" width=419 height=358 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image002%5B8%5D_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;H2&gt;7 min&lt;/H2&gt;
&lt;P&gt;Att illustrera statusen på en User Story väljer jag att göra genom att sätta bakgrundsfärgen på &lt;EM&gt;Rectangle&lt;/EM&gt;-kontrollen. Är Story:n &lt;EM&gt;Blocked&lt;/EM&gt;, dvs ingen gör något annat än att försöka lösa problemet, skall bakgrunden vara röd. Är Story:n &lt;EM&gt;Ready&lt;/EM&gt;, dvs någon kan ta Story:n vidare till "sitt" steg, skall bakgrunden vara grön. I övriga skall bakgrunden vara gul.&lt;/P&gt;
&lt;P&gt;Detta löser jag genom att ange ett utryck för &lt;EM&gt;Rectangle&lt;/EM&gt;-kontrollens bakgrundsfärg.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B10%5D.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B10%5D.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image001[10] border=0 alt=clip_image001[10] src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B10%5D_thumb.png" width=406 height=314 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B10%5D_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;&lt;PRE class=code&gt;=IIf(Fields!AreaName.Value = "Blocked", "Firebrick", IIf(Fields!AreaName.Value = "Ready", "PaleGreen", "Khaki"))&lt;/PRE&gt;
&lt;H2&gt;9 min&lt;/H2&gt;
&lt;P&gt;Sätter lite kantfärger och fontstilar.&lt;/P&gt;
&lt;P&gt;För att kunna klicka på en User Story och därmed få fram aktuellt &lt;EM&gt;Work Item&lt;/EM&gt;, sätter jag &lt;EM&gt;Action&lt;/EM&gt; egenskapen på &lt;EM&gt;System_Title&lt;/EM&gt; textboxen till &lt;EM&gt;Go to URL&lt;/EM&gt;. URL:en jag anger är till TFS Web Access Work Item Editor.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B12%5D.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B12%5D.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image001[12] border=0 alt=clip_image001[12] src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B12%5D_thumb.png" width=390 height=243 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B12%5D_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;&lt;PRE class=code&gt;="javascript:void(window.open('http://&lt;EM&gt;tfs&lt;/EM&gt;/sites/&lt;EM&gt;DefaultCollection&lt;/EM&gt;/&lt;EM&gt;project&lt;/EM&gt;/_layouts/tswa/UI/Pages/WorkItems/WorkItemEdit.aspx?id=" &amp;amp; Fields!System_Id.Value &amp;amp; "'))"&lt;/PRE&gt;
&lt;H2&gt;11 min&lt;/H2&gt;
&lt;P&gt;Deploy till Reporting Services. Inga konstigheter.&lt;/P&gt;
&lt;H2&gt;13 min&lt;/H2&gt;
&lt;P&gt;Jag möblerar om på projektets standard &lt;EM&gt;Dashboard&lt;/EM&gt;.&lt;/P&gt;
&lt;H2&gt;15 min&lt;/H2&gt;
&lt;P&gt;Klart!&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B14%5D.png" mce_href="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B14%5D.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image001[14] border=0 alt=clip_image001[14] src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B14%5D_thumb.png" width=527 height=439 mce_src="http://blogs.msdn.com/blogfiles/chrislof/WindowsLiveWriter/KanbanmedTeamFoundationServerp15minuter_14A71/clip_image001%5B14%5D_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;TFS måste vara det bästa sedan skivat bröd?&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9865025" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrislof/archive/tags/Practices/default.aspx">Practices</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Productivity/default.aspx">Productivity</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/Lean/default.aspx">Lean</category><category domain="http://blogs.msdn.com/chrislof/archive/tags/VS2010/default.aspx">VS2010</category></item></channel></rss>