<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.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/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>MSMVPS.COM</title><link>http://msmvps.com/blogs/</link><description>The Ultimate Destination for Blogs by Current and Former Microsoft Most Valuable Professionals.
</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Fake Squirrel Mail emails</title><link>http://msmvps.com/blogs/spywaresucks/archive/2013/05/24/1831339.aspx</link><pubDate>Thu, 23 May 2013 23:18:53 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831339</guid><dc:creator>sandi</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/spywaresucks.metablogapi/0172.image_5F00_1A4C8BFD.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;float:left;padding-top:0px;padding-left:0px;margin:10px 10px 0px 0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" align="left" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/spywaresucks.metablogapi/5355.image_5F00_thumb_5F00_429BBE51.png" width="555" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Text of email:&lt;/p&gt;  &lt;p&gt;“&lt;em&gt;Dear E-Mail User     &lt;br /&gt;Due to the package compromise of 1.4.11,1.4.12 and 1.4.13, we are forced to release 1.4.15 to ensure no confusions. While initial review didn&amp;#39;t uncover a need for concern, several proof of concepts show that the package alterations introduce a high risk security issue, allowing remote inclusion of files. These changes would allow a remote user the ability to execute exploit code on a victim machine, without any user interaction on the victim&amp;#39;s server. This could grant the attacker the ability to deploy further code on the victim&amp;#39;s server.      &lt;br /&gt;So upgrade to&amp;#160; Squirrel Mail Development Team by&amp;#160; click Squirrel Mail Login SquirrelMail 1.4.15 Released      &lt;br /&gt;We STRONGLY advise all users of 1.4.11, 1.4.12 and 1.4.13 upgrade immediately.&lt;/em&gt;”&lt;/p&gt;  &lt;p&gt;The page, when I looked at it anyway, didn’t contain any exploits. It&amp;#39;s a simple email address/password harvest (of course very valuable to spammers).&amp;#160; Of course, you should still stay away from the page. It’s behavior could change at any moment (or even change depending on your IP address, or browser used, or time of date or who knows what…)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831339" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/spywaresucks/archive/tags/Security_2C00_+safety+and+privacy+on+the+Internet/default.aspx">Security, safety and privacy on the Internet</category></item><item><title>OWA 2013 CU1 Redirection is Broken for Legacy Mailboxes</title><link>http://msmvps.com/blogs/expta/archive/2013/05/23/owa-2013-cu1-redirection-is-broken-for-legacy-mailboxes.aspx</link><pubDate>Thu, 23 May 2013 21:42:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831330</guid><dc:creator>The EXPTA {blog}</dc:creator><slash:comments>0</slash:comments><description>Exchange 2013 CU1 includes a new native module for HTTP to HTTPS redirection in OWA 2013. This means that users only need to enter the URL for the OWA 2013 server or load balancer to gain access to OWA. For example, a user can enter webmail.contoso.com Read More......(&lt;a href="http://msmvps.com/blogs/expta/archive/2013/05/23/owa-2013-cu1-redirection-is-broken-for-legacy-mailboxes.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831330" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/expta/archive/tags/tip/default.aspx">tip</category><category domain="http://msmvps.com/blogs/expta/archive/tags/troubleshooting/default.aspx">troubleshooting</category><category domain="http://msmvps.com/blogs/expta/archive/tags/Exchange+2010/default.aspx">Exchange 2010</category><category domain="http://msmvps.com/blogs/expta/archive/tags/Exchange+2013/default.aspx">Exchange 2013</category><category domain="http://msmvps.com/blogs/expta/archive/tags/CU1/default.aspx">CU1</category></item><item><title>Unleash Your Inner App Developer (Part 7) - Code Writing First Steps</title><link>http://msmvps.com/blogs/kevinmcneish/archive/2013/05/23/unleash-your-inner-app-developer-part-7-code-writing-first-steps.aspx</link><pubDate>Thu, 23 May 2013 19:32:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831317</guid><dc:creator>KevinMcNeish</dc:creator><slash:comments>0</slash:comments><description>This week&amp;#39;s post is now live on the iPhoneLife web site: http://www.iphonelife.com/blog/31369/unleash-your-inner-app-developer-object-oriented-programming This week&amp;#39;s post includes a step-by-step video as we cover: Object-orientation in Objective-C Inheritance Passing messages Converting the prototype into a real app All the best! Kevin McNeish Author: iOS App Development for Non-Programmers book series Twitter: @kjmcneish...(&lt;a href="http://msmvps.com/blogs/kevinmcneish/archive/2013/05/23/unleash-your-inner-app-developer-part-7-code-writing-first-steps.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831317" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/kevinmcneish/archive/tags/iOS+6/default.aspx">iOS 6</category><category domain="http://msmvps.com/blogs/kevinmcneish/archive/tags/iPhone+Apps/default.aspx">iPhone Apps</category><category domain="http://msmvps.com/blogs/kevinmcneish/archive/tags/Writing+Apps/default.aspx">Writing Apps</category><category domain="http://msmvps.com/blogs/kevinmcneish/archive/tags/iOS+6.1/default.aspx">iOS 6.1</category><category domain="http://msmvps.com/blogs/kevinmcneish/archive/tags/MacInCloud/default.aspx">MacInCloud</category><category domain="http://msmvps.com/blogs/kevinmcneish/archive/tags/How+to+Create+Apps/default.aspx">How to Create Apps</category><category domain="http://msmvps.com/blogs/kevinmcneish/archive/tags/Apple+Apps/default.aspx">Apple Apps</category></item><item><title>Un Buen Proyecto (2)</title><link>http://msmvps.com/blogs/lopez/archive/2013/05/23/un-buen-proyecto-2.aspx</link><pubDate>Thu, 23 May 2013 11:02:58 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831262</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2013/05/16/un-buen-proyecto-1.aspx"&gt;Anterior Post&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ya tratamos el principal tema que nuestro proyecto tiene que cumplir para ser un buen proyecto: solucionar el problema al cliente. Puede que sea sólo un colaborador, entre otros proyectos, para llegar a esa solución. Por ejemplo, me pasa muchas veces que el proyecto que me toca es de programación de una aplicación, pero la solución total del problema implica su instalación, mantenimiento y adopción. Otras veces no: nuestro proyecto abarca toda su ciclo de vida, por lo menos de la primer versión.&lt;/p&gt;  &lt;p&gt;Puede suceder algo que muchas veces se nos pasa por alto:&lt;/p&gt;  &lt;p&gt;- No podemos estar seguros de que lo que entregamos es un buen proyecto al terminarlo y entregarlo.&lt;/p&gt;  &lt;p&gt;Hay que ver si realmente funciona en el campo, en la vida real.&lt;/p&gt;  &lt;p&gt;Pongamos un ejemplo. Sea nuestro cliente es una compañía de seguros y su problema es que está perdiendo clientes porque los productores de seguros tardan mucho en otorgarle una póliza o no. La solución evaluada es: poner una aplicación en línea que reduzca el tiempo de aceptación o rechazo de un día a quince minutos. Hacemos la aplicación, pero al llegar a desplegarse y ser usado se muere cada media hora por la presión de uso, y la causa es el código de nuestro proyecto. O peor, trabaja bien, soporta la carga, pero otorga aceptaciones a cualquier caso. En ambos casos, nuestro proyecto no habrá sido un “buen proyecto”.&lt;/p&gt;  &lt;p&gt;Es por eso que en nuestro proceso es importante las pruebas de carga y las pruebas funcionales. A lo que voy, es que muchas de las actividades que realizamos terminan teniendo su origen en la necesidad de cumplir con ser un buen proyecto. Un proyecto puede parecer “bueno”: tener todo “en regla”, haber sido programado con todos los patrones, ante las entradas correctas dar el resultado correcto, pero fracasar en su implementación porque no revisamos que, así como lo tenemos programado, no soporta más de diez usuarios simultáneos.&lt;/p&gt;  &lt;p&gt;Aparece la cuestión de la calidad de nuestro entregable. Podemos discutir luego si la calidad es responsabilidad del equipo ágil, o si hace falta un equipo aparte de QA (Quality Assurance). Pero vemos que todo esto es motivado por la necesidad de cumplir con lo que espera el cliente: la solución de su problema.&lt;/p&gt;  &lt;p&gt;Para poner un ejemplo “al revés”: al cliente no le importa que lo que entregamos sea escalable como Facebook, si su problema y solución (digamos, un sistema de compras) necesita solamente atender a veinte usuarios (los representantes de sus proveedores principales).&lt;/p&gt;  &lt;p&gt;En próximos posts: si una solución es exitosa, hay que mantenerla; el aporte de TDD y el proceso de desarrollo.&lt;/p&gt;  &lt;p&gt;Nota personal: lo de no poder ver si es un buen proyecto al terminarlo, me fue sugerido por Aristóteles. No encuentro la cita ahora, pero cuando habla de “eudamonia” en su “Etica a Nicómaco”, habla de lo que yo traduzco como “buena vida”, “con los dioses a favor”. Dice Aristóteles que muchas veces, un hombre al morir no puede estar seguro de haber llegado a la “buena vida”: puede que el resultado dependa de su influencia en otros hombres, aún luego de su muerte. (me temo que Aristóteles hablaba de “hombres”, ciudadanos con derechos, y no de “seres humanos”; mujeres abstenerse, era el Borat de los filósofos ;-).&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831262" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Agil/default.aspx">Desarrollo Agil</category></item><item><title>Looking for how to build a hosted email add in for Essentials?</title><link>http://msmvps.com/blogs/bradley/archive/2013/05/22/looking-for-how-to-build-a-hosted-email-add-in-for-essentials.aspx</link><pubDate>Thu, 23 May 2013 05:57:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831232</guid><dc:creator>bradley</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/jj991858.aspx"&gt;http://msdn.microsoft.com/en-us/library/jj991858.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are looking for an example of how to build a hosted mail plug in for Essentials you can now download the sample from Microsoft&lt;/p&gt;
&lt;p&gt;Download it from here &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=34860"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=34860&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And the sample files are then installed on your machine&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/bradley/2860.example.PNG"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/bradley/2860.example.PNG" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831232" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bradley/archive/tags/Essentials/default.aspx">Essentials</category></item><item><title>Microsoft Security Bulletin Minor Revisions - May 22, 2013 </title><link>http://msmvps.com/blogs/donpatterson/archive/2013/05/22/microsoft-security-bulletin-minor-revisions-may-22-2013.aspx</link><pubDate>Thu, 23 May 2013 01:05:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831214</guid><dc:creator>Don</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;Summary&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The following bulletins have undergone minor revision increments.&lt;br /&gt;Please see the bulletins for more details.&lt;br /&gt;&lt;br /&gt; * MS12-081&lt;br /&gt; * MS13-037&lt;br /&gt; * MS13-MAY&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;Bulletin Information:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* &lt;b&gt;MS12-081 - Critical&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;  - &amp;raquo;&lt;a href="http://technet.microsoft.com/security/bulletin/ms12-081"&gt;technet.microsoft.com/security/b&amp;middot;&amp;middot;&amp;middot;ms12-081&lt;/a&gt;&lt;br /&gt;  - Reason for Revision: V1.1 (May 22, 2013): Added a link to&lt;br /&gt;    Microsoft Knowledge Base Article 2758857 under Known Issues&lt;br /&gt;    in the Executive Summary.&lt;br /&gt;  - Originally posted: December 11, 2012&lt;br /&gt;  - Updated: May 22, 2013&lt;br /&gt;  - Bulletin Severity Rating: Critical&lt;br /&gt;  - Version: 1.1&lt;br /&gt;&lt;br /&gt;* &lt;b&gt;MS13-037 - Critical&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;  - &amp;raquo;&lt;a href="http://technet.microsoft.com/security/bulletin/ms13-037"&gt;technet.microsoft.com/security/b&amp;middot;&amp;middot;&amp;middot;ms13-037&lt;/a&gt;&lt;br /&gt;  - Reason for Revision: V1.1 (May 22, 2013): Corrected the&lt;br /&gt;    Common Vulnerabilities and Exposures number for&lt;br /&gt;    CVE-2013-3140. This is an informational change only.&lt;br /&gt;  - Originally posted: May 14, 3013&lt;br /&gt;  - Updated: May 22, 2013&lt;br /&gt;  - Bulletin Severity Rating: Critical&lt;br /&gt;  - Version: 1.1&lt;br /&gt;&lt;br /&gt;*&lt;b&gt; MS13-MAY&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;  - &amp;raquo;&lt;a href="http://technet.microsoft.com/security/bulletin/ms13-MAY"&gt;technet.microsoft.com/security/b&amp;middot;&amp;middot;&amp;middot;ms13-MAY&lt;/a&gt;&lt;br /&gt;  - Reason for Revision: V1.1 (May 22, 2013): For MS13-037,&lt;br /&gt;    corrected the Common Vulnerabilities and Exposures number&lt;br /&gt;    for CVE-2013-3140. This is an informational change only.&lt;br /&gt;  - Originally posted: May 14, 3013&lt;br /&gt;  - Updated: May 22, 2013&lt;br /&gt;  - Version: 1.1&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831214" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/donpatterson/archive/tags/Advisories+_2F00_+Bulletins/default.aspx">Advisories / Bulletins</category></item><item><title>My session on TFS at the ‘Building Applications for the Future’</title><link>http://msmvps.com/blogs/richardfennell/archive/2013/05/22/my-session-on-tfs-at-the-building-applications-for-the-future.aspx</link><pubDate>Wed, 22 May 2013 21:21:07 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831176</guid><dc:creator>But it works on my PC!</dc:creator><slash:comments>0</slash:comments><description>Thanks to everyone who attended my session on ‘TFS for Developers’ at the Grey Matter’s ‘Building Applications for the Future’ event today. As you will have noticed my session was basically slide free, so not much to share there. As I said at the end of my session to find out more have a look at Brian Keller’s TFS 2012 VM – ready to run demo VM with plenty of hands on labs Team Foundation Service – the free hosted version of TFS – go on give it a try. Brian Harry’s Blog – all announcements on TFS...(&lt;a href="http://msmvps.com/blogs/richardfennell/archive/2013/05/22/my-session-on-tfs-at-the-building-applications-for-the-future.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831176" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/richardfennell/archive/tags/VSTS/default.aspx">VSTS</category></item><item><title>My session on TFS at the ‘Building Applications for the Future’</title><link>http://msmvps.com/blogs/rfennell/archive/2013/05/22/my-session-on-tfs-at-the-building-applications-for-the-future.aspx</link><pubDate>Wed, 22 May 2013 21:21:07 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831174</guid><dc:creator>But it works on my PC!</dc:creator><slash:comments>0</slash:comments><description>Thanks to everyone who attended my session on ‘TFS for Developers’ at the Grey Matter’s ‘Building Applications for the Future’ event today. As you will have noticed my session was basically slide free, so not much to share there. As I said at the end of my session to find out more have a look at Brian Keller’s TFS 2012 VM – ready to run demo VM with plenty of hands on labs Team Foundation Service – the free hosted version of TFS – go on give it a try. Brian Harry’s Blog – all announcements on TFS...(&lt;a href="http://msmvps.com/blogs/rfennell/archive/2013/05/22/my-session-on-tfs-at-the-building-applications-for-the-future.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831174" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/rfennell/archive/tags/VSTS/default.aspx">VSTS</category></item><item><title>Book project #2 - Pro Team Foundation Service, done!</title><link>http://msmvps.com/blogs/molausson/archive/2013/05/22/book-project-2-pro-team-foundation-service-done.aspx</link><pubDate>Wed, 22 May 2013 21:08:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831168</guid><dc:creator>Mathias Olausson</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I’m happy to share the &lt;a href="http://www.amazon.com/Team-Foundation-Service-Mathias-Olausson/dp/1430259957"&gt;release&lt;/a&gt; of the second book I’ve been involved in. This time the subject is the &lt;a href="http://tfs.visualstudio.com/"&gt;Team Foundation Service&lt;/a&gt; and how it can be used to setup a complete development infrastructure in just a couple of minutes. Oh, well, at least that’s what it takes to create an account… To fully take advantage of all its capabilities obviously will take much longer but hopefully the practices and experience we share in this book will help you get going quickly.&lt;/p&gt;  &lt;p&gt;I’ve had the opportunity to work with a great team to author the book, with co-authors &lt;a href="http://geekswithblogs.net/jakob/"&gt;Jakob Ehn&lt;/a&gt;, &lt;a href="http://mskold.blogspot.se/"&gt;Mattias Sköld&lt;/a&gt; and Joachim Rossberg. We’ve got great input and feedback from people in the product group, thanks Jamie, Will, Ravi, Anu, Vijay and Ed! And not to mention our most thorough reviewer &lt;a href="http://geekswithblogs.net/terje/"&gt;Terje Sandstrøm&lt;/a&gt;. And thanks to &lt;a href="http://blogs.msdn.com/b/bharry/"&gt;Brian Harry&lt;/a&gt; for writing the foreword!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/Team-Foundation-Service-Mathias-Olausson/dp/1430259957"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/molausson.metablogapi/2678.image_5F00_4897AB3E.png" width="165" height="179" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can read more about the book at Amazon: &lt;a title="http://www.amazon.com/Team-Foundation-Service-Mathias-Olausson/dp/1430259957" href="http://www.amazon.com/Team-Foundation-Service-Mathias-Olausson/dp/1430259957"&gt;http://www.amazon.com/Team-Foundation-Service-Mathias-Olausson/dp/1430259957&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Hope you find the book useful, I definitely learnt a lot from writing it!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831168" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/molausson/archive/tags/TFS/default.aspx">TFS</category><category domain="http://msmvps.com/blogs/molausson/archive/tags/ALM/default.aspx">ALM</category><category domain="http://msmvps.com/blogs/molausson/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category><category domain="http://msmvps.com/blogs/molausson/archive/tags/Team+Foundation+Service/default.aspx">Team Foundation Service</category></item><item><title>Video on Nuget for C++ on Channel 9</title><link>http://msmvps.com/blogs/rfennell/archive/2013/05/22/video-on-nuget-for-c-on-channel-9.aspx</link><pubDate>Wed, 22 May 2013 21:04:03 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831175</guid><dc:creator>But it works on my PC!</dc:creator><slash:comments>0</slash:comments><description>I have been out to a number of sites recently where there are C++ developers. We often get talking about package management and general best practices for shared libraries. The common refrain is ‘I wish we had something like Nuget for C++’. Well it was released in Nuget 2.5 and there is a video on Channel9 all about it....(&lt;a href="http://msmvps.com/blogs/rfennell/archive/2013/05/22/video-on-nuget-for-c-on-channel-9.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831175" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/rfennell/archive/tags/Nuget/default.aspx">Nuget</category></item><item><title>Video on Nuget for C++ on Channel 9</title><link>http://msmvps.com/blogs/richardfennell/archive/2013/05/22/video-on-nuget-for-c-on-channel-9.aspx</link><pubDate>Wed, 22 May 2013 21:04:03 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831177</guid><dc:creator>But it works on my PC!</dc:creator><slash:comments>0</slash:comments><description>I have been out to a number of sites recently where there are C++ developers. We often get talking about package management and general best practices for shared libraries. The common refrain is ‘I wish we had something like Nuget for C++’. Well it was released in Nuget 2.5 and there is a video on Channel9 all about it....(&lt;a href="http://msmvps.com/blogs/richardfennell/archive/2013/05/22/video-on-nuget-for-c-on-channel-9.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831177" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/richardfennell/archive/tags/Nuget/default.aspx">Nuget</category></item><item><title>Windows Server 2012 y Virtualización "La división acorazada".</title><link>http://msmvps.com/blogs/peplluis/archive/2013/05/22/windows-server-2012-y-virtualizaci-243-n-quot-la-divisi-243-n-acorazada-quot.aspx</link><pubDate>Wed, 22 May 2013 19:44:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831157</guid><dc:creator>peplluis</dc:creator><slash:comments>0</slash:comments><description>&lt;p class="MsoNormal" style="margin:0cm 0cm 10pt;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;&lt;span style="font-size:small;"&gt;Cada vez disponemos de menos ocasiones para reunirnos de forma presencial, y cada vez menos con unos ponentes de la talla de &lt;/span&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:#333333;font-size:10pt;"&gt;David Cervig&amp;oacute;n, Ra&amp;uuml;l Moltala y Javier S&amp;aacute;nchez.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0cm 0cm 10pt;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;&lt;span style="font-size:small;"&gt;Se trata de una oportunidad &amp;uacute;nica de ponerte al &amp;ldquo;dia&amp;rdquo; en una &amp;ldquo;ma&amp;ntilde;ana&amp;rdquo;, asi que res&amp;eacute;rvate el pr&amp;oacute;ximo 6 de Junio en tu agenda, entre las 9 i 15h, adem&amp;aacute;s nos dar&amp;aacute;n la bienvenida nada menos que Ana del Frago, Alcaldesa de barbera del Valles y Carles Grau, Director Gral. Microsoft Catalu&amp;ntilde;a.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="center" class="MsoNormal" style="text-align:center;margin:0cm 0cm 10pt;"&gt;&lt;b&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:#363636;font-size:15pt;"&gt;&lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032552873&amp;amp;Culture=es-ES&amp;amp;community=0"&gt;&lt;span style="color:#0000ff;"&gt;Reg&amp;iacute;strate Aqu&amp;iacute;!&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0cm 0cm 10pt;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;&lt;span style="font-size:small;"&gt;As&amp;iacute; que ya sabes, adem&amp;aacute;s de una buena feria de abril en el : &lt;/span&gt;&lt;/span&gt;&lt;span style="line-height:115%;font-family:&amp;#39;Segoe UI&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:#363636;font-size:10pt;"&gt;Auditorio Nodus &lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;de Barbera del Valles tambi&amp;eacute;n tenemos charlas directamente de la &amp;ldquo;Divisi&amp;oacute;n Acorazada&amp;rdquo; &lt;/span&gt;&lt;span style="font-family:Wingdings;mso-ascii-font-family:Verdana;mso-hansi-font-family:Verdana;mso-char-type:symbol;mso-symbol-font-family:Wingdings;"&gt;&lt;span style="mso-char-type:symbol;mso-symbol-font-family:Wingdings;"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin:0cm 0cm 10pt;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;&lt;span style="font-size:small;"&gt;Espero veros!&lt;br /&gt;PepLluis,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831157" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peplluis/archive/tags/General/default.aspx">General</category></item><item><title>Windows Server 2012: La clé produit n’a pas fonctionné…</title><link>http://msmvps.com/blogs/vista/archive/2013/05/22/windows-server-2012-la-cl-233-produit-n-a-pas-fonctionn-233.aspx</link><pubDate>Wed, 22 May 2013 18:50:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831150</guid><dc:creator>Patrice BONNEFOY</dc:creator><slash:comments>0</slash:comments><description>Bonjour à tous, Je viens de créer une nouvelle machine virtuelle Hyper-V dans laquelle je compte monter Windows Server 2012 Datacenter version française. Je saisi la clé produit et là, message d’erreur m’indiquant que la clé produit n’a pas fonctionné . Vérifiez sa validité et recommencez… Vérification, nouvelle saisie; rien n’y fait. Pourtant cette clé est bien valide. Que se passe t-il ? En fait, tout vient des paramètres de la VM pour laquelle j’ai dépensé sans compter . J’ai paramétré 4 processeurs...(&lt;a href="http://msmvps.com/blogs/vista/archive/2013/05/22/windows-server-2012-la-cl-233-produit-n-a-pas-fonctionn-233.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831150" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/vista/archive/tags/Administration/default.aspx">Administration</category><category domain="http://msmvps.com/blogs/vista/archive/tags/Installation/default.aspx">Installation</category><category domain="http://msmvps.com/blogs/vista/archive/tags/Windows+Server+2012/default.aspx">Windows Server 2012</category><category domain="http://msmvps.com/blogs/vista/archive/tags/Hyper-V/default.aspx">Hyper-V</category></item><item><title>Spybot Search &amp; Destroy Weekly Update - May 22, 2013</title><link>http://msmvps.com/blogs/donpatterson/archive/2013/05/22/spybot-search-amp-destroy-weekly-update-may-22-2013.aspx</link><pubDate>Wed, 22 May 2013 12:50:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831122</guid><dc:creator>Don</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;b&gt;2013-05-22&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Malware&lt;/b&gt;&lt;br /&gt;+ SimplyTech.HomeTab&lt;br /&gt;&lt;b&gt;PUPS&lt;/b&gt;&lt;br /&gt;+ Bandoo.Toolbar&lt;br /&gt;&lt;b&gt;Trojans&lt;/b&gt;&lt;br /&gt;+ Banload + FakePorn.Winlock&lt;br /&gt;&lt;b&gt;Total: 2586623&lt;/b&gt; fingerprints in 802866 rules for 7001 products.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.safer-networking.org/about/updates/"&gt;http://www.safer-networking.org/about/updates/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831122" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/donpatterson/archive/tags/Updates/default.aspx">Updates</category></item><item><title>Распараллеленное соединение вложенных циклов (Nested Loops)</title><link>http://msmvps.com/blogs/gladchenko/archive/2013/05/22/1831116.aspx</link><pubDate>Wed, 22 May 2013 11:42:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831116</guid><dc:creator>gladchenko</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;По материалам статьи из блога &lt;a href="http://blogs.msdn.com/b/craigfr/"&gt;Craig Freedman&lt;/a&gt;: &lt;a href="http://blogs.msdn.com/b/craigfr/archive/2006/11/08/parallel-nested-loops-join.aspx"&gt;Parallel Nested Loops Join&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Перевод &lt;a href="http://msmvps.com/blogs/irinanaumova/default.aspx"&gt;Ирины Наумовой&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Техническая редакция &lt;a href="http://msmvps.com/blogs/gladchenko/default.aspx"&gt;Александра Гладченко&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;SQL Server распараллеливает &lt;a href="http://www.sql.ru/articles/mssql/2007/051101nestedloopsjoin.shtml"&gt;соединение вложенных циклов (Nested Loops Join)&lt;/a&gt;, распределяя в случайном порядке строки внешней таблицы по потокам вложенных циклов. В данном случае, речь идёт о строках, которые поступают первыми, и мы их видим вверху, на графическом плане запроса. Например, если на входе соединения вложенных циклов имеется два потока, каждый поток получит приблизительно половину строк. Потоки проходятся по строкам внутренней таблицы соединения (то есть, по строкам, поданным во вторую очередь, мы их видим ниже в плане запроса), точно по такому же алгоритму, как это было бы реализовано в сценарии с последовательной обработкой строк. Таким образом, для каждой обрабатываемой потоком строки внешней таблицы, поток обеспечивает соединение своей внутренней таблицы, используя эту строку в качестве источника коррелированных параметров. Это позволяет потокам работать независимо друг от друга. При этом для внутренней таблицы соединения вложенных циклов SQL Server не добавляет операторы параллелизма и работу с ней не распараллеливает.&lt;/p&gt;
&lt;p align="justify"&gt;Читайте полный текст статьи в &lt;a href="http://msmvps.com/blogs/irinanaumova/archive/2013/05/20/1830797.aspx"&gt;блоге Ирины Наумовой&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831116" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/gladchenko/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://msmvps.com/blogs/gladchenko/archive/tags/Freedman/default.aspx">Freedman</category></item><item><title>Removal instructions for Vaccine-365</title><link>http://msmvps.com/blogs/donpatterson/archive/2013/05/22/removal-instructions-for-vaccine-365.aspx</link><pubDate>Wed, 22 May 2013 08:46:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831106</guid><dc:creator>Don</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;strong class="bbc"&gt;&lt;span style="font-family:Arial Black;"&gt;&lt;span style="font-size:14px;"&gt;What is Vaccine-365?&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
The Malwarebytes research team has determined that &lt;strong class="bbc"&gt;Vaccine-365&lt;/strong&gt;
 is a fake anti-malware application. These so-called &amp;quot;rogues&amp;quot; use 
intentional false positives to convince users that their systems have 
been compromised. Then they try to sell you their software, claiming it 
will remove these threats. In extreme cases the false threats are 
actually the very trojans that advertise or even directly install the 
rogue. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://forums.malwarebytes.org/index.php?showtopic=126666"&gt;http://forums.malwarebytes.org/index.php?showtopic=126666&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831106" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/donpatterson/archive/tags/Malware+Removal+Guide/default.aspx">Malware Removal Guide</category></item><item><title>What a Windows RT device does</title><link>http://msmvps.com/blogs/bradley/archive/2013/05/21/what-a-windows-rt-device-does.aspx</link><pubDate>Wed, 22 May 2013 06:51:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831096</guid><dc:creator>bradley</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;Makes a great rdgateway device&lt;/p&gt;
&lt;p&gt;Makes a great RWA device (normal non metro IE supports ActiveX)&lt;/p&gt;
&lt;p&gt;I must say that the Dell AT&amp;amp;T AllAccess app which touts that you can set it up via the device leaves a LOT to be desired.&amp;nbsp; I had to call AT&amp;amp;T to set up the cellular I could not do it straight from the device even though the paperwork said I should.&lt;/p&gt;
&lt;p&gt;The other fail is that you can&amp;#39;t set up firm email without FIRST setting up a Microsoft account.&amp;nbsp;&amp;nbsp; Only then do you get the option to add another account, and I can&amp;#39;t figure out how to not have an Outlook (cloud) account.&amp;nbsp; Hello Microsoft I realize that you think RT is a consumer device but I know a lot of consumers that don&amp;#39;t want an Outlook account.&lt;/p&gt;
&lt;p&gt;Last fail is that you have to update the apps installed on the store for each user&amp;#39;s profile you set up.&lt;/p&gt;
&lt;p&gt;Bottom line works well for what it does, but Enterprises are going to hate some of the design decisions on this.&lt;/p&gt;
&lt;p&gt;Control of patching, control of deployment, just not here....&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831096" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/bradley/archive/tags/News/default.aspx">News</category></item><item><title>Scripting Games - Filter early again</title><link>http://msmvps.com/blogs/richardsiddaway/archive/2013/05/21/scripting-games-filter-early-again.aspx</link><pubDate>Tue, 21 May 2013 21:48:17 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831031</guid><dc:creator>RichardSiddaway</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Grading the scripts in Event 4 and the one thing that jumps out is the amount of unnecessary data being carried through the scripts&lt;/p&gt;  &lt;p&gt;You were asked for 7 properties off 20 random users&lt;/p&gt;  &lt;p&gt;Get-ADUser has a –properties parameter. USE it to restrict the properties you return. You don’t NEED all the other properties&lt;/p&gt;  &lt;p&gt;Next select you 20 users as soon as possible&lt;/p&gt;  &lt;p&gt;get-aduser | get-random&lt;/p&gt;  &lt;p&gt;will do that.&amp;#160; You can then format just the few properties you need on the 20 objects you have left&lt;/p&gt;  &lt;p&gt;FILTER EARLY&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831031" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/richardsiddaway/archive/tags/Powershell/default.aspx">Powershell</category><category domain="http://msmvps.com/blogs/richardsiddaway/archive/tags/PowerShell+and+Active+Directory/default.aspx">PowerShell and Active Directory</category><category domain="http://msmvps.com/blogs/richardsiddaway/archive/tags/Scripting+Games/default.aspx">Scripting Games</category></item><item><title>Spamhaus Ransomware Removal Guide - Updated May 21, 2013 (Uninstall Instructions)</title><link>http://msmvps.com/blogs/donpatterson/archive/2013/05/21/spamhaus-ransomware-removal-guide-updated-may-21-2013-uninstall-instructions.aspx</link><pubDate>Tue, 21 May 2013 19:14:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831008</guid><dc:creator>Don</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The &lt;b&gt;Spamhaus Ransomware &lt;/b&gt;is computer infection that 
displays a a screenlocker so you can not access your desktop and 
applications and encrypts your files. When infected with this malware, 
you  will be presented with a screen when you login to Windows that 
pretends to be from the &lt;a href="http://www.spamhaus.org/" rel="nofollow"&gt;Spamhaus Project&lt;/a&gt;.
 This screen states that they have detected your computer participating 
in illegal activities and have blocked access to it until you pay a 
fine. This infection will also scan your computer for files that end 
with the .ddrw ,.pptm ,.dotm ,.xltx ,.text ,.docm ,.djvu ,.potx ,.jpeg 
,.pptx ,.sldm ,.xlsm ,.sldx ,.xlsb ,.ppam ,.xlsx ,.ppsm ,.ppsx ,.docx 
,.odp ,.eml ,.ods ,.dot ,.php ,.xla ,.pas ,.gif ,.mpg ,.ppt ,.bkf ,.sda 
,.mdf ,.ico ,.dwg ,.mbx ,.sfx ,.mdb ,.zip ,.xlt extensions and then 
encrypt them. When the ransomware encrypts a file it will rename it as a
 HTML file and then embed the encrypted file inside of it. If you then 
attempt to launch any of these encrypted files, you will be taken to a 
web page, which is currently at http://xblblock.com, that prompts you to
 pay the ransom in the form of a MoneyPak voucher&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bleepingcomputer.com/virus-removal/remove-spamhaus-ransomware"&gt;http://www.bleepingcomputer.com/virus-removal/remove-spamhaus-ransomware&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831008" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/donpatterson/archive/tags/Malware+Removal+Guide/default.aspx">Malware Removal Guide</category></item><item><title>MVPS HOSTS File Update May-21-2013</title><link>http://msmvps.com/blogs/hostsnews/archive/2013/05/21/1831007.aspx</link><pubDate>Tue, 21 May 2013 19:12:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1831007</guid><dc:creator>winhelp2002</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;img src="http://winhelp2002.mvps.org/noplace.gif" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The MVPS HOSTS file was recently updated&lt;/strong&gt; [May-21-2013]&lt;br /&gt;&lt;a href="http://winhelp2002.mvps.org/hosts.htm"&gt;http://winhelp2002.mvps.org/hosts.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt;: hosts.zip (137 kb)&lt;br /&gt;&lt;a href="http://winhelp2002.mvps.org/hosts.zip"&gt;http://winhelp2002.mvps.org/hosts.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How To: Download and Extract the HOSTS file&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://winhelp2002.mvps.org/hosts2.htm"&gt;http://winhelp2002.mvps.org/hosts2.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HOSTS File - Frequently Asked Questions&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://winhelp2002.mvps.org/hostsfaq.htm"&gt;http://winhelp2002.mvps.org/hostsfaq.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note: the &amp;quot;text&amp;quot; version makes a great resource for determining possible unwanted connections ... &lt;br /&gt;&lt;a href="http://winhelp2002.mvps.org/hosts.txt"&gt;http://winhelp2002.mvps.org/hosts.txt&lt;/a&gt; (559 kb)&lt;/p&gt;
&lt;p&gt;Get notified when the MVPS HOSTS file is updated&lt;br /&gt;&lt;a href="http://winhelp2002.mvps.org/updates.htm"&gt;http://winhelp2002.mvps.org/updates.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;If you find the MVPS HOSTS file useful&amp;nbsp;... please consider a &lt;a target="_blank" href="http://winhelp2002.mvps.org/hosts.htm#donation" title="Make a donation"&gt;donation&lt;/a&gt; ... &lt;a target="_blank" href="http://winhelp2002.mvps.org/hosts.htm#donation" title="Make a donation"&gt;&lt;img src="http://winhelp2002.mvps.org/btn_donateCC_LG.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1831007" width="1" height="1"&gt;</description></item><item><title>Windows Server 2012 / Windows 8: Lien modifier la clé produit non disponible</title><link>http://msmvps.com/blogs/vista/archive/2013/05/21/windows-server-2012-windows-8-lien-modifier-la-cl-233-produit-non-disponible.aspx</link><pubDate>Tue, 21 May 2013 18:22:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830997</guid><dc:creator>Patrice BONNEFOY</dc:creator><slash:comments>0</slash:comments><description>Bonsoir à tous, Le Problème Lorsque vous essayez de modifier la clé de produit dans Windows 8 ou dans Windows Server 2012, vous ne trouvez pas un lien « Modifier la clé de produit » dans l&amp;#39;élément système dans le panneau de configuration. Par exemple, vous souhaitez convertir une clé de produit de programme d&amp;#39;installation par défaut à une clé d&amp;#39;Activation Multiple (MAK) sur un ordinateur qui exécute Windows 8. Toutefois, vous ne pouvez pas rechercher un élément dans l&amp;#39;interface utilisateur...(&lt;a href="http://msmvps.com/blogs/vista/archive/2013/05/21/windows-server-2012-windows-8-lien-modifier-la-cl-233-produit-non-disponible.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830997" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/vista/archive/tags/Administration/default.aspx">Administration</category><category domain="http://msmvps.com/blogs/vista/archive/tags/D_26002300_233_3B00_ploiement/default.aspx">D&amp;#233;ploiement</category><category domain="http://msmvps.com/blogs/vista/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://msmvps.com/blogs/vista/archive/tags/Windows+Server+2012/default.aspx">Windows Server 2012</category></item><item><title>XBOX One : Spécifications…</title><link>http://msmvps.com/blogs/vista/archive/2013/05/21/xbox-one-sp-233-cifications.aspx</link><pubDate>Tue, 21 May 2013 18:12:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830995</guid><dc:creator>Patrice BONNEFOY</dc:creator><slash:comments>0</slash:comments><description>&amp;#160; http://www.xbox.com/fr-FR/hub/reveal Bonne soirée. Patrice....(&lt;a href="http://msmvps.com/blogs/vista/archive/2013/05/21/xbox-one-sp-233-cifications.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830995" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/vista/archive/tags/Actualit_26002300_233_3B00_s/default.aspx">Actualit&amp;#233;s</category><category domain="http://msmvps.com/blogs/vista/archive/tags/News+Microsoft/default.aspx">News Microsoft</category></item><item><title>What came first? The baby or the app</title><link>http://msmvps.com/blogs/jgaylord/archive/2013/05/21/what-came-first-the-baby-or-the-app.aspx</link><pubDate>Tue, 21 May 2013 11:00:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830940</guid><dc:creator>A blog by Jason Gaylord</dc:creator><slash:comments>0</slash:comments><description>So today is the big day where my wife is being induced with our fourth child. Given the past, today’s experience should last between 6-10 hours. Knowing I’ll be hearing monitors in the background, I figured I should do some work. Since I haven’t spent Read More......(&lt;a href="http://msmvps.com/blogs/jgaylord/archive/2013/05/21/what-came-first-the-baby-or-the-app.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830940" width="1" height="1"&gt;</description></item><item><title>Exchange 2013 Server Role Requirements Calculator v5.1</title><link>http://msmvps.com/blogs/ehlo/archive/2013/05/21/1830918.aspx</link><pubDate>Tue, 21 May 2013 07:03:51 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830918</guid><dc:creator>Rui Silva</dc:creator><slash:comments>0</slash:comments><description>The long awaited Exchange 2013 Server Role Requirements Calculator v5.1 has finally been released. Like its predecessor, the Exchange 2010 Mailbox Server Role Requirements Calculator, it was announced by Ross Smith IV at the Microsoft Exchange Team Blog . There are several new features introduced by this version. Like you probably noticed from the name, the tool is no longer a mailbox exclusive calculator, it now includes client access servers and transport sizing (as the transport role is now part...(&lt;a href="http://msmvps.com/blogs/ehlo/archive/2013/05/21/1830918.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830918" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/ehlo/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/ehlo/archive/tags/Downloads/default.aspx">Downloads</category></item><item><title>Book Review: Async in C# 5.0</title><link>http://msmvps.com/blogs/jon_skeet/archive/2013/05/21/book-review-async-in-c-5-0.aspx</link><pubDate>Mon, 20 May 2013 23:14:02 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830869</guid><dc:creator>skeet</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Resources:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.amazon.com/Async-C-5-0-Alex-Davies/dp/1449337163"&gt;Amazon&lt;/a&gt;, &lt;a href="http://www.barnesandnoble.com/w/async-in-c-5-0-alex-davies/1112412817?ean=9781449337162"&gt;Barnes and Noble&lt;/a&gt;, &lt;a href="https://play.google.com/store/books/details/Alex_Davies_Async_in_C_5_0?id=xT45qhFrVnUC&amp;amp;feature=search_result#?t=W251bGwsMSwyLDEsImJvb2steFQ0NXFoRnJWblVDIl0."&gt;Play Books&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://shop.oreilly.com/product/0636920026532.do"&gt;The book&amp;#39;s web site&lt;/a&gt; (O&amp;#39;Reilly) – downloads, errata etc &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A while ago I was attending one of the &lt;a href="http://www.developerdeveloperdeveloper.com/home/"&gt;Developer, Developer, Developer&lt;/a&gt; conference in Reading, and I heard Alex Davies give a talk about actors and async. He mentioned that he was in the process of writing a short book for O&amp;#39;Reilly about async in C# 5, and I offered to review it for him. Many months later (sorry Alex!) I&amp;#39;m finally getting round to it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Disclaimer: &lt;/strong&gt;The review copy was given to me for free, and equally the book is arguably a competitor of the upcoming 3rd edition of C# in Depth from the view of readers who already own the 2nd edition... so you could say I&amp;#39;m biased in both directions. Hopefully they cancel out.&lt;/p&gt;  &lt;p&gt;This is a book purely on async. It&amp;#39;s not a general C# book, and it doesn&amp;#39;t even cover the tiny non-async features in C# 5. It&amp;#39;s &lt;em&gt;all&lt;/em&gt; about asynchrony. As you&amp;#39;d expect, it&amp;#39;s therefore pretty short (92 pages) and can comfortably be consumed in a single session. Alex&amp;#39;s writing style is informal and easy to read. Of course the &lt;em&gt;topic&lt;/em&gt; of the book is anything but simple, so even though you may read the whole book in one go first time, that doesn&amp;#39;t mean you&amp;#39;re likely to fully internalize it straight away. The book is divided into 15 short chapters, so you can revisit specific areas as and when you need to.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Aside&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;I&amp;#39;ve been writing and speaking about async for about two and a half years now. I&amp;#39;ve tried various ways of explaining it, and I&amp;#39;m pretty sure it&amp;#39;s one of those awkward concepts which really just needs to click eventually. I&amp;#39;ve had some mails from people for whom my explanation was the one to do the trick... and other mails from folks who only &amp;quot;got it&amp;quot; after seeing another perspective. I&amp;#39;d encourage anyone learning about async to read a variety of books, articles, blog posts and so on. I don&amp;#39;t even think it&amp;#39;s a matter of finding the single &amp;quot;right&amp;quot; explanation for you – it&amp;#39;s a matter of letting them all percolate.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The book covers all the topics you&amp;#39;d expect it to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Why asynchrony is important &lt;/li&gt;    &lt;li&gt;Drawbacks of library-only approaches &lt;/li&gt;    &lt;li&gt;How async/await behaves in general &lt;/li&gt;    &lt;li&gt;Threading and synchronization contexts &lt;/li&gt;    &lt;li&gt;Exceptions &lt;/li&gt;    &lt;li&gt;Different code contexts (ASP.NET, WinRT, regular UI apps) &lt;/li&gt;    &lt;li&gt;How async code is compiled &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Additionally there are brief sections on unit testing, parallelism and actors. Personally I&amp;#39;d have preferred the actors part to be omitted, with more discussion on the testing side – particularly in terms of how to write deterministic asynchronous tests. However, I know that Alex is a big fan of actors, so I can forgive a little self-indulgence on that front.&lt;/p&gt;  &lt;p&gt;There&amp;#39;s one area where I&amp;#39;m not sure I agree with the advice in the book: exceptions. Alex repeatedly gives the advice that you shouldn&amp;#39;t let exceptions go unobserved. I used to go along with that almost without thinking – but now I&amp;#39;m not so sure. There are definitely cases where that definitely &lt;em&gt;is&lt;/em&gt; the case, but I&amp;#39;m not as comfortable with the global advice as I used to be. I&amp;#39;ll try to put my thoughts in order on this front and blog about this separately at a later date.&lt;/p&gt;  &lt;p&gt;That aside, this is a good, pragmatic book. To be honest, I suspect no book on async is going to go into quite as many details as &lt;a href="http://blogs.msdn.com/b/pfxteam/"&gt;the PFX team blog&lt;/a&gt;, and that&amp;#39;s probably a good thing. But &amp;quot;Async in C# 5.0&amp;quot; is a very good starting point for anyone wanting to get to grips with async, and I in no way begrudge any potential C# in Depth 3rd edition sales I may lose by saying so ;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830869" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/jon_skeet/archive/tags/Books/default.aspx">Books</category><category domain="http://msmvps.com/blogs/jon_skeet/archive/tags/Book+reviews/default.aspx">Book reviews</category><category domain="http://msmvps.com/blogs/jon_skeet/archive/tags/C_2300_+5/default.aspx">C# 5</category><category domain="http://msmvps.com/blogs/jon_skeet/archive/tags/async/default.aspx">async</category></item><item><title>Scripting Games - Win32_LogicalDisk or Win32_Volume</title><link>http://msmvps.com/blogs/richardsiddaway/archive/2013/05/20/scripting-games-win32-logicaldisk-or-win32-volume.aspx</link><pubDate>Mon, 20 May 2013 21:49:25 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830850</guid><dc:creator>RichardSiddaway</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I have heard some discussions recently regarding whether Win32_LogicalDisk or Win32_Volume should be used in the answer to event 3 in the Scripting Games.&lt;/p&gt;  &lt;p&gt;The problem requires you pull the drive letter, drive size and freespace for &lt;strong&gt;local&lt;/strong&gt; disks on the server. Notice the emphasis – that will be important.&lt;/p&gt;  &lt;p&gt;Looking at Win32_Volume&lt;/p&gt;  &lt;p&gt;PS&amp;gt; Get-CimClass -ClassName Win32_Volume | select -ExpandProperty CimClassproperties&amp;#160; | select Name&lt;/p&gt;  &lt;p&gt;Name    &lt;br /&gt;----     &lt;br /&gt;Caption     &lt;br /&gt;Description     &lt;br /&gt;InstallDate     &lt;br /&gt;Name     &lt;br /&gt;Status     &lt;br /&gt;Availability     &lt;br /&gt;ConfigManagerErrorCode     &lt;br /&gt;ConfigManagerUserConfig     &lt;br /&gt;CreationClassName     &lt;br /&gt;DeviceID     &lt;br /&gt;ErrorCleared     &lt;br /&gt;ErrorDescription     &lt;br /&gt;LastErrorCode     &lt;br /&gt;PNPDeviceID     &lt;br /&gt;PowerManagementCapabilities     &lt;br /&gt;PowerManagementSupported     &lt;br /&gt;StatusInfo     &lt;br /&gt;SystemCreationClassName     &lt;br /&gt;SystemName     &lt;br /&gt;Access     &lt;br /&gt;BlockSize     &lt;br /&gt;ErrorMethodology     &lt;br /&gt;NumberOfBlocks     &lt;br /&gt;Purpose     &lt;br /&gt;Automount     &lt;br /&gt;BootVolume     &lt;br /&gt;&lt;strong&gt;Capacity      &lt;br /&gt;&lt;/strong&gt;Compressed     &lt;br /&gt;DirtyBitSet     &lt;br /&gt;&lt;strong&gt;DriveLetter      &lt;br /&gt;&lt;/strong&gt;DriveType     &lt;br /&gt;FileSystem     &lt;br /&gt;&lt;strong&gt;FreeSpace      &lt;br /&gt;&lt;/strong&gt;IndexingEnabled     &lt;br /&gt;Label     &lt;br /&gt;MaximumFileNameLength     &lt;br /&gt;PageFilePresent     &lt;br /&gt;QuotasEnabled     &lt;br /&gt;QuotasIncomplete     &lt;br /&gt;QuotasRebuilding     &lt;br /&gt;SerialNumber     &lt;br /&gt;SupportsDiskQuotas     &lt;br /&gt;SupportsFileBasedCompression     &lt;br /&gt;SystemVolume&lt;/p&gt;  &lt;p&gt;You see 3 properties that might be of use&lt;/p&gt;  &lt;p&gt;Get-CimInstance -ClassName Win32_Volume | select DriveLetter, Capacity, FreeSpace&lt;/p&gt;  &lt;p&gt;is a start but I get two drives with no capacity &amp;amp; freespace – must by my DVD drives&lt;/p&gt;  &lt;p&gt;I can filter those out using drive type.&amp;#160; DriveType =3 gives me local disks&lt;/p&gt;  &lt;p&gt;So the WMI call I need is &lt;/p&gt;  &lt;p&gt;Get-CimInstance -ClassName Win32_Volume -Filter &amp;quot;DriveType=3&amp;quot;&amp;#160; | select DriveLetter, Capacity, FreeSpace&lt;/p&gt;  &lt;p&gt;Get-WmiObject -Class Win32_Volume -Filter &amp;quot;DriveType=3&amp;quot;&amp;#160; | select DriveLetter, Capacity, FreeSpace&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now lets look at Win32_LogicalDisk&lt;/p&gt;  &lt;p&gt;PS&amp;gt; Get-CimClass -ClassName Win32_Logicaldisk | select -ExpandProperty CimClassproperties&amp;#160; | select Name&lt;/p&gt;  &lt;p&gt;Name    &lt;br /&gt;----     &lt;br /&gt;Caption     &lt;br /&gt;Description     &lt;br /&gt;InstallDate     &lt;br /&gt;Name     &lt;br /&gt;Status     &lt;br /&gt;Availability     &lt;br /&gt;ConfigManagerErrorCode     &lt;br /&gt;ConfigManagerUserConfig     &lt;br /&gt;CreationClassName     &lt;br /&gt;DeviceID     &lt;br /&gt;ErrorCleared     &lt;br /&gt;ErrorDescription     &lt;br /&gt;LastErrorCode     &lt;br /&gt;PNPDeviceID     &lt;br /&gt;PowerManagementCapabilities     &lt;br /&gt;PowerManagementSupported     &lt;br /&gt;StatusInfo     &lt;br /&gt;SystemCreationClassName     &lt;br /&gt;SystemName     &lt;br /&gt;Access     &lt;br /&gt;BlockSize     &lt;br /&gt;ErrorMethodology     &lt;br /&gt;NumberOfBlocks     &lt;br /&gt;Purpose     &lt;br /&gt;&lt;strong&gt;FreeSpace      &lt;br /&gt;Size       &lt;br /&gt;&lt;/strong&gt;Compressed     &lt;br /&gt;&lt;strong&gt;DriveType      &lt;br /&gt;&lt;/strong&gt;FileSystem     &lt;br /&gt;MaximumComponentLength     &lt;br /&gt;MediaType     &lt;br /&gt;ProviderName     &lt;br /&gt;QuotasDisabled     &lt;br /&gt;QuotasIncomplete     &lt;br /&gt;QuotasRebuilding     &lt;br /&gt;SupportsDiskQuotas     &lt;br /&gt;SupportsFileBasedCompression     &lt;br /&gt;VolumeDirty     &lt;br /&gt;VolumeName     &lt;br /&gt;VolumeSerialNumber&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I can’t find a DriveLetter but I know that DeviceId supplies that information – if in doubt check by displaying all properties of one instance or do this&lt;/p&gt;  &lt;p&gt;PS&amp;gt; Get-CimInstance -ClassName Win32_Logicaldisk | ft -a&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;DeviceID DriveType ProviderName VolumeName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Size&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FreeSpace      &lt;br /&gt;-------- --------- ------------ ----------&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ----&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ---------       &lt;br /&gt;C:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 249951154176 146292559872       &lt;br /&gt;D:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System Reserved 104853504&amp;#160;&amp;#160;&amp;#160; 69279744       &lt;br /&gt;E:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2       &lt;br /&gt;F:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Drivetype matches with Win32_Volume so we get&lt;/p&gt;  &lt;p&gt;Get-CimInstance -ClassName Win32_Logicaldisk | Select Deviceid, Size, FreeSpace    &lt;br /&gt;Get-WmiObject -Class Win32_Logicaldisk | Select Deviceid, Size, FreeSpace&lt;/p&gt;  &lt;p&gt;You’ll have noticed that D: has a volume name of System Reserved. This means its a system disk that you shouldn’t be touching. Technically the event asked for information on local disks so it should be included. I know that some purists will argue against this so to remove the system volume you can &lt;/p&gt;  &lt;p&gt;PS&amp;gt;&amp;#160; Get-CimInstance -ClassName Win32_Volume -Filter &amp;quot;DriveType=3 AND SystemVolume = $false&amp;quot;&amp;#160; | select DriveLetter, Capacity, FreeSpace&lt;/p&gt;  &lt;p&gt;or&lt;/p&gt;  &lt;p&gt;PS&amp;gt; Get-CimInstance -ClassName Win32_Logicaldisk -Filter &amp;quot;DriveType = 3 AND VolumeName &amp;lt;&amp;gt; &amp;#39;System Reserved&amp;#39;&amp;quot; | select DeviceId, Size, FreeSpace&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So either will give you the results you need.&amp;#160; You just need to dig into the classes a bit.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830850" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/richardsiddaway/archive/tags/Powershell/default.aspx">Powershell</category><category domain="http://msmvps.com/blogs/richardsiddaway/archive/tags/PowerShell+and+WMI/default.aspx">PowerShell and WMI</category><category domain="http://msmvps.com/blogs/richardsiddaway/archive/tags/Scripting+Games/default.aspx">Scripting Games</category></item><item><title>Webinar on PreEmptive Analytics tools on the 28th of May</title><link>http://msmvps.com/blogs/rfennell/archive/2013/05/20/webinar-on-preemptive-analytics-tools-on-the-28th-of-may.aspx</link><pubDate>Mon, 20 May 2013 15:47:17 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830824</guid><dc:creator>But it works on my PC!</dc:creator><slash:comments>0</slash:comments><description>A key requirement for any DevOps strategy is the reporting on how your solution is behaving in the wild. PreEmptive Analytics™ for Team Foundation Server (TFS) can provide a great insight in this area, and there is a good chance you are already licensed for it as part of MSDN. So why not have a look on the UK MSDN site for more details the free Microsoft hosted event. MSDN Webinar Improve Software Quality, User Experience and Developer Productivity with Real Time Analytics Tuesday, May 28 2013: 4...(&lt;a href="http://msmvps.com/blogs/rfennell/archive/2013/05/20/webinar-on-preemptive-analytics-tools-on-the-28th-of-may.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830824" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/rfennell/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://msmvps.com/blogs/rfennell/archive/tags/Events/default.aspx">Events</category></item><item><title>Webinar on PreEmptive Analytics tools on the 28th of May</title><link>http://msmvps.com/blogs/richardfennell/archive/2013/05/20/webinar-on-preemptive-analytics-tools-on-the-28th-of-may.aspx</link><pubDate>Mon, 20 May 2013 15:47:17 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830826</guid><dc:creator>But it works on my PC!</dc:creator><slash:comments>0</slash:comments><description>A key requirement for any DevOps strategy is the reporting on how your solution is behaving in the wild. PreEmptive Analytics™ for Team Foundation Server (TFS) can provide a great insight in this area, and there is a good chance you are already licensed for it as part of MSDN. So why not have a look on the UK MSDN site for more details the free Microsoft hosted event. MSDN Webinar Improve Software Quality, User Experience and Developer Productivity with Real Time Analytics Tuesday, May 28 2013: 4...(&lt;a href="http://msmvps.com/blogs/richardfennell/archive/2013/05/20/webinar-on-preemptive-analytics-tools-on-the-28th-of-may.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830826" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/richardfennell/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://msmvps.com/blogs/richardfennell/archive/tags/Events/default.aspx">Events</category></item><item><title>Unit testing code depending on the ASP.NET WebApi HttpClient</title><link>http://msmvps.com/blogs/theproblemsolver/archive/2013/05/20/unit-testing-code-depending-on-the-asp-net-webapi-httpclient.aspx</link><pubDate>Mon, 20 May 2013 15:37:21 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830810</guid><dc:creator>Maurice</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;In a &lt;a href="http://msmvps.com/blogs/theproblemsolver/archive/2013/05/12/unit-testing-a-asp-net-webapi-controller.aspx" target="_blank"&gt;previous post&lt;/a&gt; I showed how to unit test an ASP.NET WebAPI Controller. But with a REST service there is both a client and a service component. Assuming for a moment the client part is also written in C# we should test that as well.&lt;/p&gt;  &lt;p&gt;In this case the client application contains the following class to load books from the REST WebAPI controller:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;     &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; BooksClient&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; HttpClient _httpClient;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum5" style="color:#606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; BooksClient(HttpClient httpClient)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum6" style="color:#606060;"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum7" style="color:#606060;"&gt;   7:&lt;/span&gt;         _httpClient = httpClient;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum8" style="color:#606060;"&gt;   8:&lt;/span&gt;         BaseUrl = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Uri(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost:63895/api/books/&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum9" style="color:#606060;"&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum10" style="color:#606060;"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum11" style="color:#606060;"&gt;  11:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Uri BaseUrl { get; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum12" style="color:#606060;"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum13" style="color:#606060;"&gt;  13:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Book&amp;gt; GetBooks()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum14" style="color:#606060;"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum15" style="color:#606060;"&gt;  15:&lt;/span&gt;         var response = _httpClient.GetAsync(BaseUrl).Result;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum16" style="color:#606060;"&gt;  16:&lt;/span&gt;         response.EnsureSuccessStatusCode();&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum17" style="color:#606060;"&gt;  17:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; response.Content.ReadAsAsync&amp;lt;Book[]&amp;gt;().Result;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum18" style="color:#606060;"&gt;  18:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum19" style="color:#606060;"&gt;  19:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum20" style="color:#606060;"&gt;  20:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Book GetBook(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; id)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum21" style="color:#606060;"&gt;  21:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum22" style="color:#606060;"&gt;  22:&lt;/span&gt;         var requestUri = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Uri(BaseUrl, id.ToString(CultureInfo.InvariantCulture));&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum23" style="color:#606060;"&gt;  23:&lt;/span&gt;         var response = _httpClient.GetAsync(requestUri).Result;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum24" style="color:#606060;"&gt;  24:&lt;/span&gt;         response.EnsureSuccessStatusCode();&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum25" style="color:#606060;"&gt;  25:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; response.Content.ReadAsAsync&amp;lt;Book&amp;gt;().Result;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum26" style="color:#606060;"&gt;  26:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum27" style="color:#606060;"&gt;  27:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum28" style="color:#606060;"&gt;  28:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Tuple&amp;lt;Book, Uri&amp;gt; PostBook(Book book)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum29" style="color:#606060;"&gt;  29:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum30" style="color:#606060;"&gt;  30:&lt;/span&gt;         var response = _httpClient.PostAsJsonAsync(BaseUrl.ToString(), book).Result;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum31" style="color:#606060;"&gt;  31:&lt;/span&gt;         response.EnsureSuccessStatusCode();&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum32" style="color:#606060;"&gt;  32:&lt;/span&gt;         var newBook = response.Content.ReadAsAsync&amp;lt;Book&amp;gt;().Result;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum33" style="color:#606060;"&gt;  33:&lt;/span&gt;         var location = response.Headers.Location;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum34" style="color:#606060;"&gt;  34:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Tuple&amp;lt;Book, Uri&amp;gt;(newBook, location);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum35" style="color:#606060;"&gt;  35:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum36" style="color:#606060;"&gt;  36:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This class uses the &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.http.httpclient.aspx" target="_blank"&gt;HttpClient&lt;/a&gt; to request the data from the service and extracts the books from the body before returning them.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Testing the BooksClient class&lt;/h3&gt;

&lt;p&gt;If we want to test this class we need to pass in an HttpClient object. This might not sound like a big deal but as this class doesn’t implement an interface we can’t use most of the standard mocking frameworks like &lt;a href="https://code.google.com/p/moq/" target="_blank"&gt;Moq&lt;/a&gt; to replace the HttpClient with a test fake.&lt;/p&gt;

&lt;p&gt;It turns out that this isn’t a big issue though as you can replace the internal pipeline of the HttpClient instead. This is done by passing in an &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.http.httpmessagehandler.aspx" target="_blank"&gt;HttpMessageHandler&lt;/a&gt;. This HttpMessageHandler is used as the pipeline to send requests and we can completely replace this with our own implementation. The easiest way is by creating a dummy &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.http.delegatinghandler.aspx" target="_blank"&gt;DelegatingHandler&lt;/a&gt; and overriding the SendAsync() function to just return a fake response instead of actually doing an HTTP request.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;The TestingDelegatingHandler&amp;lt;T&amp;gt; class&lt;/h3&gt;

&lt;p&gt;Creating a dummy DelegatingHandler&amp;#160; isn’t hard but using the &lt;a href="https://gist.github.com/mauricedb/5612901" target="_blank"&gt;TestingDelegatingHandler&amp;lt;T&amp;gt;&lt;/a&gt; makes this really easy. The complete code is below and is pretty simple:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; TestingDelegatingHandler&amp;lt;T&amp;gt; : DelegatingHandler&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; Func&amp;lt;HttpRequestMessage, HttpResponseMessage&amp;gt; _httpResponseMessageFunc;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum5" style="color:#606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; TestingDelegatingHandler(T &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum6" style="color:#606060;"&gt;   6:&lt;/span&gt;         : &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;(HttpStatusCode.OK, &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum7" style="color:#606060;"&gt;   7:&lt;/span&gt;     { }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum8" style="color:#606060;"&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum9" style="color:#606060;"&gt;   9:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; TestingDelegatingHandler(HttpStatusCode statusCode)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum10" style="color:#606060;"&gt;  10:&lt;/span&gt;         : &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;(statusCode, &lt;span style="color:#0000ff;"&gt;default&lt;/span&gt;(T))&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum11" style="color:#606060;"&gt;  11:&lt;/span&gt;     { }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum12" style="color:#606060;"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum13" style="color:#606060;"&gt;  13:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; TestingDelegatingHandler(HttpStatusCode statusCode, T &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum14" style="color:#606060;"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum15" style="color:#606060;"&gt;  15:&lt;/span&gt;         _httpResponseMessageFunc = request =&amp;gt; request.CreateResponse(statusCode, &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum16" style="color:#606060;"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum17" style="color:#606060;"&gt;  17:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum18" style="color:#606060;"&gt;  18:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; TestingDelegatingHandler(&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum19" style="color:#606060;"&gt;  19:&lt;/span&gt;         Func&amp;lt;HttpRequestMessage, HttpResponseMessage&amp;gt; httpResponseMessageFunc)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum20" style="color:#606060;"&gt;  20:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum21" style="color:#606060;"&gt;  21:&lt;/span&gt;         _httpResponseMessageFunc = httpResponseMessageFunc;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum22" style="color:#606060;"&gt;  22:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum23" style="color:#606060;"&gt;  23:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum24" style="color:#606060;"&gt;  24:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; Task&amp;lt;HttpResponseMessage&amp;gt; SendAsync(&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum25" style="color:#606060;"&gt;  25:&lt;/span&gt;         HttpRequestMessage request, CancellationToken cancellationToken)&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum26" style="color:#606060;"&gt;  26:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum27" style="color:#606060;"&gt;  27:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; Task.Factory.StartNew(() =&amp;gt; _httpResponseMessageFunc(request));&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum28" style="color:#606060;"&gt;  28:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum29" style="color:#606060;"&gt;  29:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The most important function is the &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.http.delegatinghandler.sendasync.aspx" target="_blank"&gt;SendAsync()&lt;/a&gt; which returns a new Task. Did I mention that the WebAPI is completely async enabled? Well it is so we just have to return a new &lt;a href="http://msdn.microsoft.com/en-us/library/dd321424.aspx" target="_blank"&gt;Task&lt;/a&gt; that returns the &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage.aspx" target="_blank"&gt;HttpResponseMessage&lt;/a&gt; instead of the HttpResponseMessage directly.&lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Testing the GetBooks() function&lt;/h3&gt;

&lt;p&gt;The GetBooks() function gets all books from the REST service. A test is pretty simple. The only thing to be aware of is that in order to use the TestingDelegatingHandler we also need to create an &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.http.httpserver(v=vs.108).aspx" target="_blank"&gt;HttpServer&lt;/a&gt; object and pass in an &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.http.httpconfiguration(v=vs.108).aspx" target="_blank"&gt;HttpConfiguration&lt;/a&gt; object. Normally an empty HttpConfiguration will be enough.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; [TestMethod]&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; WhenGettingAllBooksTheyShouldBeReturned()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Arrange&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum5" style="color:#606060;"&gt;   5:&lt;/span&gt;     var books = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;[]&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum6" style="color:#606060;"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum7" style="color:#606060;"&gt;   7:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Book{Id = 1, Author = &lt;span style="color:#006080;"&gt;&amp;quot;Me&amp;quot;&lt;/span&gt;, Title = &lt;span style="color:#006080;"&gt;&amp;quot;Book 1&amp;quot;&lt;/span&gt;},&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum8" style="color:#606060;"&gt;   8:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Book{Id = 2, Author = &lt;span style="color:#006080;"&gt;&amp;quot;You&amp;quot;&lt;/span&gt;, Title = &lt;span style="color:#006080;"&gt;&amp;quot;Book 2&amp;quot;&lt;/span&gt;}&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum9" style="color:#606060;"&gt;   9:&lt;/span&gt;     };&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum10" style="color:#606060;"&gt;  10:&lt;/span&gt;     var testingHandler = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; TestingDelegatingHandler&amp;lt;Book[]&amp;gt;(books);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum11" style="color:#606060;"&gt;  11:&lt;/span&gt;     var server = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpServer(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpConfiguration(), testingHandler);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum12" style="color:#606060;"&gt;  12:&lt;/span&gt;     var client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BooksClient(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(server));&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum13" style="color:#606060;"&gt;  13:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum14" style="color:#606060;"&gt;  14:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Act&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum15" style="color:#606060;"&gt;  15:&lt;/span&gt;     var booksReturned = client.GetBooks();&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum16" style="color:#606060;"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum17" style="color:#606060;"&gt;  17:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Assert&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum18" style="color:#606060;"&gt;  18:&lt;/span&gt;     Assert.AreEqual(2, booksReturned.Count());&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum19" style="color:#606060;"&gt;  19:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;br /&gt;Simple enough right?&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Testing the GetBook(int id) function&lt;/h3&gt;

&lt;p&gt;Testing this method is not much harder but we need to test both a positive and a negative result. The positive is just as simple as above:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; [TestMethod]&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; WhenGettingAValidBookItShouldBeReturned()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Arrange&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum5" style="color:#606060;"&gt;   5:&lt;/span&gt;     var book = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Book { Id = 2, Author = &lt;span style="color:#006080;"&gt;&amp;quot;You&amp;quot;&lt;/span&gt;, Title = &lt;span style="color:#006080;"&gt;&amp;quot;Book 2&amp;quot;&lt;/span&gt; };&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum6" style="color:#606060;"&gt;   6:&lt;/span&gt;     var testingHandler = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; TestingDelegatingHandler&amp;lt;Book&amp;gt;(book);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum7" style="color:#606060;"&gt;   7:&lt;/span&gt;     var server = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpServer(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpConfiguration(), testingHandler);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum8" style="color:#606060;"&gt;   8:&lt;/span&gt;     var client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BooksClient(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(server));&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum9" style="color:#606060;"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum10" style="color:#606060;"&gt;  10:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Act&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum11" style="color:#606060;"&gt;  11:&lt;/span&gt;     var bookReturned = client.GetBook(2);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum12" style="color:#606060;"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum13" style="color:#606060;"&gt;  13:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Assert&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum14" style="color:#606060;"&gt;  14:&lt;/span&gt;     Assert.IsNotNull(bookReturned);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum15" style="color:#606060;"&gt;  15:&lt;/span&gt;     Assert.AreEqual(&lt;span style="color:#006080;"&gt;&amp;quot;Book 2&amp;quot;&lt;/span&gt;, bookReturned.Title);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum16" style="color:#606060;"&gt;  16:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The negative case isn’t much harder, all we need to do is make sure our dummy service returns an HTTP 404 Not Found status. With the overloads for the TestingDelegatingHandler&amp;lt;T&amp;gt; this is easy enough. See below:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; [TestMethod]&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt; [ExpectedException(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(HttpRequestException))]&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; WhenGettingAnInvalidBookItShouldThrow()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum5" style="color:#606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Arrange&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum6" style="color:#606060;"&gt;   6:&lt;/span&gt;     var testingHandler = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; TestingDelegatingHandler&amp;lt;Book&amp;gt;(HttpStatusCode.NotFound);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum7" style="color:#606060;"&gt;   7:&lt;/span&gt;     var server = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpServer(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpConfiguration(), testingHandler);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum8" style="color:#606060;"&gt;   8:&lt;/span&gt;     var client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BooksClient(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(server));&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum9" style="color:#606060;"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum10" style="color:#606060;"&gt;  10:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Act&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum11" style="color:#606060;"&gt;  11:&lt;/span&gt;     client.GetBook(-1);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum12" style="color:#606060;"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum13" style="color:#606060;"&gt;  13:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Assert&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum14" style="color:#606060;"&gt;  14:&lt;/span&gt;     Assert.Fail();&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum15" style="color:#606060;"&gt;  15:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Nice and simple right?&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Testing am HTTP POST action&lt;/h3&gt;

&lt;p&gt;Testing an HTTP POST action to add a new book is slightly more complex. Not a whole lot but the REST convention is to return both an HTTP 201 Created status as well as the location of the new resource in an HTTP header. For this purpose the TestingDelegatingHandler&amp;lt;T&amp;gt; has an overload where you can just pass in a lambda to create the response. This gives us full flexibility and with that the test is simple enough.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;
    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; [TestMethod]&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; WhenPostingABookItShouldBeAdded()&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Arrange&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum5" style="color:#606060;"&gt;   5:&lt;/span&gt;     var book = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Book { Id = 2, Author = &lt;span style="color:#006080;"&gt;&amp;quot;You&amp;quot;&lt;/span&gt;, Title = &lt;span style="color:#006080;"&gt;&amp;quot;Book 2&amp;quot;&lt;/span&gt; };&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum6" style="color:#606060;"&gt;   6:&lt;/span&gt;     var testingHandler = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; TestingDelegatingHandler&amp;lt;Book&amp;gt;(request =&amp;gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum7" style="color:#606060;"&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum8" style="color:#606060;"&gt;   8:&lt;/span&gt;         var response = request.CreateResponse(HttpStatusCode.Created, book);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum9" style="color:#606060;"&gt;   9:&lt;/span&gt;         response.Headers.Location =&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum10" style="color:#606060;"&gt;  10:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Uri(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;http://domain.com/api/books/{0}&amp;quot;&lt;/span&gt;, book.Id));&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum11" style="color:#606060;"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; response;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum12" style="color:#606060;"&gt;  12:&lt;/span&gt;     });&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum13" style="color:#606060;"&gt;  13:&lt;/span&gt;     var server = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpServer(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpConfiguration(), testingHandler);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum14" style="color:#606060;"&gt;  14:&lt;/span&gt;     var client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BooksClient(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(server));&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum15" style="color:#606060;"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum16" style="color:#606060;"&gt;  16:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Act&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum17" style="color:#606060;"&gt;  17:&lt;/span&gt;     var result = client.PostBook(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Book());&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum18" style="color:#606060;"&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum19" style="color:#606060;"&gt;  19:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Assert&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum20" style="color:#606060;"&gt;  20:&lt;/span&gt;     var bookReturned = result.Item1;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum21" style="color:#606060;"&gt;  21:&lt;/span&gt;     Assert.IsNotNull(bookReturned);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum22" style="color:#606060;"&gt;  22:&lt;/span&gt;     Assert.AreEqual(&lt;span style="color:#006080;"&gt;&amp;quot;Book 2&amp;quot;&lt;/span&gt;, bookReturned.Title);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum23" style="color:#606060;"&gt;  23:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum24" style="color:#606060;"&gt;  24:&lt;/span&gt;     var location = result.Item2;&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:white;"&gt;&lt;span id="lnum25" style="color:#606060;"&gt;  25:&lt;/span&gt;     Assert.AreEqual(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Uri(&lt;span style="color:#006080;"&gt;&amp;quot;http://domain.com/api/books/2&amp;quot;&lt;/span&gt;), location);&lt;/pre&gt;


    &lt;pre style="border-top-style:none;overflow:visible;font-size:8pt;border-left-style:none;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-bottom-style:none;color:black;padding-bottom:0px;direction:ltr;text-align:left;padding-top:0px;border-right-style:none;padding-left:0px;margin:0em;line-height:12pt;padding-right:0px;width:100%;background-color:#f4f4f4;"&gt;&lt;span id="lnum26" style="color:#606060;"&gt;  26:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Of course we still need tests for updating existing resources as well as deleting them but with these examples those should be easy enough :-)&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Enjoy! 
  &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830810" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/theproblemsolver/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/theproblemsolver/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/theproblemsolver/archive/tags/WebAPI/default.aspx">WebAPI</category><category domain="http://msmvps.com/blogs/theproblemsolver/archive/tags/UnitTesting/default.aspx">UnitTesting</category></item><item><title>Распараллеленное соединение вложенных циклов (Nested Loops)</title><link>http://msmvps.com/blogs/irinanaumova/archive/2013/05/20/1830797.aspx</link><pubDate>Mon, 20 May 2013 12:23:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1830797</guid><dc:creator>Ирина Наумова</dc:creator><slash:comments>1</slash:comments><description>&lt;div align="justify"&gt;
&lt;p align="justify"&gt;По материалам статьи из блога &lt;a href="http://blogs.msdn.com/b/craigfr/"&gt;Craig Freedman&lt;/a&gt;: &lt;a href="http://blogs.msdn.com/b/craigfr/archive/2006/11/08/parallel-nested-loops-join.aspx"&gt;Parallel Nested Loops Join&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Перевод &lt;a href="http://msmvps.com/blogs/irinanaumova/default.aspx"&gt;Ирины Наумовой&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Техническая редакция &lt;a href="http://msmvps.com/blogs/gladchenko/default.aspx"&gt;Александра Гладченко&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;SQL Server распараллеливает &lt;a href="http://www.sql.ru/articles/mssql/2007/051101nestedloopsjoin.shtml"&gt;соединение вложенных циклов (Nested Loops Join)&lt;/a&gt;, распределяя в случайном порядке строки внешней таблицы по потокам вложенных циклов. В данном случае, речь идёт о строках, которые поступают первыми, и мы их видим вверху, на графическом плане запроса. Например, если на входе соединения вложенных циклов имеется два потока, каждый поток получит приблизительно половину строк. Потоки проходятся по строкам внутренней таблицы соединения (то есть, по строкам, поданным во вторую очередь, мы их видим ниже в плане запроса), точно по такому же алгоритму, как это было бы реализовано в сценарии с последовательной обработкой строк. Таким образом, для каждой обрабатываемой потоком строки внешней таблицы, поток обеспечивает соединение своей внутренней таблицы, используя эту строку в качестве источника коррелированных параметров. Это позволяет потокам работать независимо друг от друга. При этом для внутренней таблицы соединения вложенных циклов SQL Server не добавляет операторы параллелизма и работу с ней не распараллеливает.&lt;/p&gt;
&lt;p&gt;
&lt;h2&gt;Простой пример&lt;/h2&gt;
&lt;/p&gt;
&lt;p align="justify"&gt;Давайте рассмотрим простой пример. Чтобы вынудить оптимизатор выбрать параллельный план, создадим таблицу с большим числом строк. Если Вы решите проверить эти примеры у себя, учтите, что заполнение таблицы тестовыми данными может занять несколько минут.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;create&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;span style="color:blue;"&gt;table&lt;/span&gt; T1 &lt;span style="color:gray;"&gt;(&lt;/span&gt;a &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; b &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; x &lt;span style="color:blue;"&gt;char&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;200&lt;span style="color:gray;"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;set&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;span style="color:blue;"&gt;nocount&lt;/span&gt; &lt;span style="color:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:12pt;font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;declare&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; @i &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;set&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; @i &lt;span style="color:gray;"&gt;=&lt;/span&gt; 0&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;while&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; @i &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt; 1000000&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;begin&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;insert&lt;/span&gt; T1 &lt;span style="color:blue;"&gt;values&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;@i&lt;span style="color:gray;"&gt;,&lt;/span&gt; @i&lt;span style="color:gray;"&gt;,&lt;/span&gt; @i&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:12pt;font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;set&lt;/span&gt; @i &lt;span style="color:gray;"&gt;=&lt;/span&gt; @i &lt;span style="color:gray;"&gt;+&lt;/span&gt; 1&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;select&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;span style="color:gray;"&gt;*&lt;/span&gt; &lt;span style="color:blue;"&gt;into&lt;/span&gt; T2 &lt;span style="color:blue;"&gt;from&lt;/span&gt; T1&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;select&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;span style="color:gray;"&gt;*&lt;/span&gt; &lt;span style="color:blue;"&gt;into&lt;/span&gt; T3 &lt;span style="color:blue;"&gt;from&lt;/span&gt; T1&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;create&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;span style="color:blue;"&gt;unique&lt;/span&gt; &lt;span style="color:blue;"&gt;clustered&lt;/span&gt; &lt;span style="color:blue;"&gt;index&lt;/span&gt; T2a &lt;span style="color:blue;"&gt;on&lt;/span&gt; T2&lt;span style="color:gray;"&gt;(&lt;/span&gt;a&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:12pt;font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;create&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;span style="color:blue;"&gt;unique&lt;/span&gt; &lt;span style="color:blue;"&gt;clustered&lt;/span&gt; &lt;span style="color:blue;"&gt;index&lt;/span&gt; T3a &lt;span style="color:blue;"&gt;on&lt;/span&gt; T3&lt;span style="color:gray;"&gt;(&lt;/span&gt;a&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:12pt;font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:12pt;font-family:&amp;#39;Times New Roman&amp;#39;,&amp;#39;serif&amp;#39;;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;" lang="EN"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;select&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; &lt;span style="color:gray;"&gt;*&lt;/span&gt; &lt;span style="color:blue;"&gt;from&lt;/span&gt; T1 &lt;span style="color:gray;"&gt;join&lt;/span&gt; T2 &lt;span style="color:blue;"&gt;on&lt;/span&gt; T1&lt;span style="color:gray;"&gt;.&lt;/span&gt;b &lt;span style="color:gray;"&gt;=&lt;/span&gt; T2&lt;span style="color:gray;"&gt;.&lt;/span&gt;a &lt;span style="color:blue;"&gt;where&lt;/span&gt; T1&lt;span style="color:gray;"&gt;.&lt;/span&gt;a &lt;span style="color:gray;"&gt;&amp;lt;&lt;/span&gt; 100&lt;/span&gt;&lt;span style="font-size:12.0pt;" lang="EN"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="0" cellpadding="0" style="mso-cellspacing:1.5pt;mso-yfti-tbllook:1184;" class="MsoNormalTable"&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;"&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;" lang="EN-US"&gt;Rows&lt;/span&gt;&lt;span style="font-size:10.5pt;" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;" lang="EN-US"&gt;Executes&lt;/span&gt;&lt;span style="font-size:10.5pt;font-family:&amp;#39;Segoe UI&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:#333333;mso-ansi-language:EN-US;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:1;"&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;" lang="EN-US"&gt;100&lt;/span&gt;&lt;span style="font-size:10.5pt;" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;" lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-size:10.5pt;" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;" lang="EN-US"&gt;|--Parallelism(Gather Streams)&lt;/span&gt;&lt;span style="font-size:10.5pt;" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:2;"&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;"&gt;100&lt;/span&gt;&lt;span style="font-size:10.5pt;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;"&gt;2 &lt;/span&gt;&lt;span style="font-size:10.5pt;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;" lang="EN-US"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;|--Nested Loops(Inner Join, OUTER REFERENCES:([T1].[b], [Expr1007]) OPTIMIZED)&lt;/span&gt;&lt;span style="font-size:10.5pt;font-family:&amp;#39;Segoe UI&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:#333333;mso-ansi-language:EN-US;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:3;"&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;"&gt;100&lt;/span&gt;&lt;span style="font-size:10.5pt;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;"&gt;2&lt;/span&gt;&lt;span style="font-size:10.5pt;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;" lang="EN-US"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;|--Table Scan(OBJECT:([T1]), WHERE:([T1].[a]&amp;lt;(100)))&lt;/span&gt;&lt;span style="font-size:10.5pt;font-family:&amp;#39;Segoe UI&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:#333333;mso-ansi-language:EN-US;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow:4;mso-yfti-lastrow:yes;"&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;"&gt;100&lt;/span&gt;&lt;span style="font-size:10.5pt;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;"&gt;100&lt;/span&gt;&lt;span style="font-size:10.5pt;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style="padding:.75pt .75pt .75pt .75pt;"&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:7.5pt;" lang="EN-US"&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;|--Clustered Index Seek(OBJECT:([T2].[T2a]), SEEK:([T2].[a]=[T1].[b]) ORDERED FORWARD)&lt;/span&gt;&lt;span style="font-size:10.5pt;" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p align="justify"&gt;Сразу заметим, что в плане виден только один оператор &lt;a href="http://msmvps.com/blogs/irinanaumova/archive/2010/07/14/1773917.aspx"&gt;Exchange&lt;/a&gt; (оператор, указывающий на параллелизм, и обозначенный в этом плане, как Parallelism(Gather Streams)). Так как оператор параллелизма находится в корне плана запроса, все операторы в этом плане (соединение вложенных циклов, просмотр таблицы и поиск по кластерному индексу) будут выполняться в нескольких параллельных потоках.&lt;/p&gt;
&lt;p align="justify"&gt;Индекс на T1 не был создан сознательно. Отсутствие индекса приводит к тому, что для выборки строк будет выполнен просмотр всей таблицы и потом к выборке будет применён предикат с оценкой &amp;laquo;T1.a &amp;lt; 100&amp;raquo;. Поскольку в T1 миллион строк, просмотр таблицы будет дорогостоящей операцией, и поэтому оптимизатор предпочтёт использование распараллеленного просмотра T1.&lt;/p&gt;
&lt;p align="justify"&gt;Заметьте, что просмотр таблицы T1 не располагается первым под оператором параллелизма. В плане запроса мы его видим на внешней стороне оператора соединения вложенных циклов, который как раз и расположен ниже оператора параллелизма. Однако, поскольку просмотр выполняется для внешней стороны соединения и потому что само соединение расположилось в плане запроса ниже места начала параллелизма (то есть, места сбора или перераспределения), для таблицы T1 будет применён распараллеленный просмотр.&lt;/p&gt;
&lt;p align="justify"&gt;Если вспомнить предыдущую статью,&lt;a href="http://msmvps.com/blogs/irinanaumova/archive/2010/12/17/1784536.aspx"&gt;распараллеленный просмотр&lt;/a&gt; распределяет страницы между потоками динамически. Таким образом, строки при просмотре таблицы T1 также будут распределены между несколькими потоками. Впрочем, неизвестно, какие строки, в какие потоки будут распределены.&lt;/p&gt;
&lt;p align="justify"&gt;Так как этот запрос выполнялся со степенью параллелизма &amp;ndash; DOP равным 2, на текстовом плане исполнения запроса мы видим, что в колонке &amp;laquo;Executes&amp;raquo; для просмотра таблицы и соединения (которые попали в один и тот же поток) стоит значение 2. Кроме того, просмотр с соединением возвращают в общей сложности 100 строк, хотя мы не можем сделать из этого плана вывод, сколько строк возвратил каждый из двух потоков (эту информацию можно получить, используя статистику в виде XML, о будет сказано ниже).&lt;/p&gt;
&lt;p align="justify"&gt;Далее, соединение обращается к внутренней таблице (в этом случае используется поиск по индексу T2), поиск выполняется для каждой из 100 строк, полученных из внешней таблицы. Тут мы имеем дело с маленькой хитростью в понимании представленного выше сценария. Мы видим, что у каждого из двух потоков свой экземпляр поиска по индексу. Также, в плане показано, что поиск по индексу расположен ниже оператора соединения, да и само соединение мы видим ниже оператора параллелизма, но тут не используется распараллеленный просмотр. Вместо просмотра оптимизатор указывает использовать два экземпляра поиска по индексу внутренней таблицы соединения. Эти экземпляры поиска выполняются независимо друг от друга, используя два разных набора строк внешней таблицы и разные коррелированные параметры. Как и в последовательном плане, мы видим 100 исполнений просмотров индекса: по одному для каждой строки внешней таблицы соединения. Независимо от комплектации соединения вложенных циклов со стороны внутренней таблицы, в плане исполнения запроса мы всегда будем видеть выбор последовательного сценария, точно такого же, как это было показано выше в нашем простом примере.&lt;/p&gt;
&lt;p&gt;
&lt;h2&gt;Усложнённый пример&lt;/h2&gt;
&lt;/p&gt;
&lt;p align="justify"&gt;В показанном выше примере SQL Server распараллеливает просмотр для того, чтобы равномерно распределить строки между потоками. В некоторых случаях, это сделать невозможно, и тогда SQL Server может добавить оператор цикличного (RoundRobin) параллелизма, который лучше подходит для распределения строк в некоторых сценариях. RoundRobin направляет каждый следующий пакет строк очередному, изменяющемуся по предопределённой и фиксированной последовательности, потоку. Вот пример, демонстрирующий подобную ситуацию:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;select&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:gray;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;*&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;from&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:gray;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;(&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;select&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;top&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; 100 &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:gray;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;*&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;from&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; T1 &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;order&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;by&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; a&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:gray;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;)&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; T1top&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;join&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; T2 &lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;on&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; T1top&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;.&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;b &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:gray;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; T2&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:gray;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;.&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;a&lt;/span&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;|--Parallelism(Gather Streams)&lt;br /&gt;|--Nested Loops(Inner Join, OUTER REFERENCES:([T1].[b], [Expr1007]) WITH UNORDERED PREFETCH)&lt;br /&gt;|--&lt;b&gt;Parallelism(Distribute Streams, RoundRobin Partitioning)&lt;br /&gt;&lt;/b&gt;| &amp;nbsp;|--Top(TOP EXPRESSION:((100)))&lt;br /&gt;| &amp;nbsp;|--Parallelism(Gather Streams, ORDER BY:([T1].[a] ASC))&lt;br /&gt;| &amp;nbsp;|--Sort(TOP 100, ORDER BY:([T1].[a] ASC))&lt;br /&gt;| &amp;nbsp;|--Table Scan(OBJECT:([T1]))&lt;br /&gt;|--Clustered Index Seek(OBJECT:([T2].[T2a]), SEEK:([T2].[a]=[T1].[b]) ORDERED FORWARD)&lt;/p&gt;
&lt;p align="justify"&gt;Основное отличие этого плана от плана из предыдущего примера в том, что последний использует &amp;laquo;TOP 100&amp;raquo;. Выборка первой сотни может получить правильную оценку, только если поток имеет последовательный плана исполнения (тут нет возможности распилить данные для нескольких потоков, поскольку всё может вылиться в очень большое или наоборот, слишком малое число строк разных потоков). Таким образом, у нас добавляется обработка (например, распределяющая данные по потокам), обеспечивающая распараллеливание после TOP. В таких случаях невозможно задействовать распараллеленный просмотр для выборки строк потоков соединения. Вместо этого распараллеливание для этого соединения выполняется посредством &amp;laquo;RoundRobin Partitioning&amp;raquo; - круговой &amp;laquo;дозировки&amp;raquo;, которая и поставляет строки для потоков соединения.&lt;/p&gt;
&lt;p&gt;
&lt;h2&gt;Возможные проблемы&lt;/h2&gt;
&lt;/p&gt;
&lt;p align="justify"&gt;У распараллеленного просмотра есть одно главное преимущество перед круговой &amp;laquo;дозировкой&amp;raquo;, он автоматически и динамически балансирует рабочую нагрузку между потоками, в то время как круговая &amp;laquo;дозировка&amp;raquo; на такое не способна. Как уже было показано в предыдущей статье, если у запроса один поток исполняется медленнее других, распараллеленный просмотр может оказаться удачным решение для повышения производительности сценария.&lt;/p&gt;
&lt;p align="justify"&gt;Если в обслуживании запроса задействовано много потоков и выбрано небольшое количество страниц и/или строк, распараллеленный просмотр и круговая &amp;laquo;дозировка&amp;raquo; могут оказаться бессильны заставить все потоки соединения работать с высокой производительностью. Некоторые потоки могут не получить для себя строк и будут просто простаивать. Эта проблема наиболее заметна в распараллеленном просмотре, когда каждый поток одномоментно выдает несколько страниц, но делает это не так часто, как распараллеливание, которое одномоментно распределяет по одному пакету (что эквивалентно одной странице).&lt;/p&gt;
&lt;p align="justify"&gt;Мы можем наблюдать эту проблему в простом примере выше, анализируя данные XML статистики:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:maroon;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;RelOp&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;NodeId&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;1&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;PhysicalOp&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;Nested Loops&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;LogicalOp&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;Inner Join&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; ...&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:maroon;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;RunTimeInformation&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:maroon;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;RunTimeCountersPerThread&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;Thread&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;2&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;ActualRows&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;0&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; ... /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:maroon;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;RunTimeCountersPerThread&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;Thread&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;1&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;ActualRows&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;100&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; ... /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:maroon;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;RunTimeCountersPerThread&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;Thread&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;0&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:red;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;ActualRows&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;0&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:#333333;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;quot;&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt; ... /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:maroon;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;RunTimeInformation&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;...&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:blue;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;color:maroon;mso-ansi-language:EN;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:RU;mso-no-proof:yes;" lang="EN"&gt;RelOp&lt;/span&gt;&lt;span style="font-size:10.0pt;" lang="EN"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Все возвращаемые соединением строки обрабатывались потоком 1. Почему? У просмотра таблицы есть остаточный предикат &amp;ldquo;T1.a &amp;lt;100&amp;rdquo;. Этот предикат возвращает истину для первых 100 строк в таблице и ложь для остальных строк. Все (три) страницы, содержащие первые 100 строк, направлены в первый поток. Тут не возникает большой проблемы, так как внутренняя сторона соединения обходится довольно дёшево и вносит небольшой процент в суммарную стоимость запроса (по сравнению с просмотром таблицы, который составляет наибольший процент). Однако эта проблема могла бы стать более существенной, если бы внутренняя сторона запроса обходилась заметно дороже. Проблема особенно заметна с секционированными таблицами. О секционированных таблицах мы ещё поговорим в следующих статьях блога, а сейчас иллюстрацию упомянутой тут проблемы можно найти в статье блога SQL Server Development Customer Advisory Team: &lt;a href="http://blogs.msdn.com/b/sqlcat/archive/2005/11/30/498415.aspx"&gt;Partitioned Tables, Parallelism &amp;amp; Performance considerations&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1830797" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/irinanaumova/archive/tags/SQL+Server/default.aspx">SQL Server</category></item></channel></rss>