<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.conchango.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Simon Evans' Blog</title><link>http://blogs.conchango.com/simonevans/default.aspx</link><description>My blog covers the technology areas I focus on here at Conchango, namely Architecture using the .Net Framework, ASP.net 2.0, WCF and Agile development practices.</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Issues using Visual Studio 2008 with XML Spy integration</title><link>http://blogs.conchango.com/simonevans/archive/2008/03/11/issues-using-visual-studio-2008-with-xml-spy-integration.aspx</link><pubDate>Tue, 11 Mar 2008 21:12:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:10132</guid><dc:creator>simon.evans</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/10132.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=10132</wfw:commentRss><description>&lt;P&gt;Today I spent several hours of my life trying to figure out what had broken the design view and CSS features of web pages in my installation of Visual Studio 2008. After a process of elimination, starting with uninstalling the Silverlight 2.0 SDK bits off my machine, I found that the culprit for rendering the excellent design features of Studio useless was the XML Spy 2008 components for Visual Studio. On the plus side, uninstalling the offending XML Spy pieces from Visual Studio fixed the issue without me having to completely reinstall Visual Studio, but nevertheless this was a frustrating few hours that I hope no one else has to endure.&lt;/P&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=10132" width="1" height="1"&gt;</description><category domain="http://blogs.conchango.com/simonevans/archive/tags/ASP.net+2.0/default.aspx">ASP.net 2.0</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category></item><item><title>Consuming Services Using Silverlight 2.0</title><link>http://blogs.conchango.com/simonevans/archive/2008/03/06/consuming-services-using-silverlight-2-0.aspx</link><pubDate>Thu, 06 Mar 2008 20:15:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:10078</guid><dc:creator>simon.evans</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/10078.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=10078</wfw:commentRss><description>&lt;P&gt;I never really got that excited about Silverlight 1.0, mainly because whilst it had a great core graphics engine and did video streaming very well, it's feature set was just not rich enough to make it really useful to applications that demanded deep functionality. &lt;/P&gt;
&lt;P&gt;One of the features that was clearly lacking was connectivity; you could not directly consume services; the main workaround was to use the connectivity features of ASP.net AJAX to consume services from Javascript. Thankfully, this problem has been rectified in Silverlight 2.0. Alongside other new features in Silverlight 2.0, I am now much more interested in what I can do with the technology. &lt;/P&gt;
&lt;P&gt;When calling any service from within Silverlight 2.0, you have to call the service asynchronously (like AJAX). The reason this is important is because of the nature of the browser itself, which ultimately is the host you are running in. &lt;/P&gt;
&lt;P&gt;There are two sets of services you need to consider consuming from Silverlight: services that are self describing (such as SOAP / WSDL and RSS / ATOM) and services that are not (such as REST and POX). Silverlight 2.0 can consume all of these types of services, but it does so in distinctly different ways. &lt;/P&gt;
&lt;P&gt;The easiest services to consume in Silverlight 2.0 are SOAP based services (something sure to infuriate all the RESTafarians out there!). They are consumed in Silverlight using a WCF service proxy configured to the &lt;SPAN style="FONT-FAMILY:Courier New;"&gt;BasicHttpBinding&lt;/SPAN&gt; (BasicProfile 1.1). They are easiest to consume, because it is possible to auto generate a service proxy from the WSDL. Unlike AJAX, XML is also the preferred encoding over JSON, because the Silverlight runtime has good XML performance in managed code unlike Javascript. When returning XML, Silverlight gives you two main approaches to parsing the asynchronous result (returned via an event handler): either using LinqToXML or using the &lt;SPAN style="FONT-FAMILY:Courier New;"&gt;XmlSerializer&lt;/SPAN&gt; to deserialize the result into a predefined type. SOAP faults, however are not supported, because of security restrictions on the browser, which could cause some issues to existing services that use the fault mechanism to return exceptions. &lt;/P&gt;
&lt;P&gt;Other services (such as REST) are a little harder to consume, and the one thing that did surprise me was that there is no support for the auto proxy generation used by ASP.net AJAX against the &lt;SPAN style="FONT-FAMILY:Courier New;"&gt;WebHttpBinding&lt;/SPAN&gt;. You have to construct a Uri string manually and call the service either by using the &lt;SPAN style="FONT-FAMILY:Courier New;"&gt;WebClient&lt;/SPAN&gt; class in the case of HTTP GET resuests (REST), or by using the &lt;SPAN style="FONT-FAMILY:Courier New;"&gt;HttpWebRequest&lt;/SPAN&gt; class for other HTTP verbs. If the service uses JSON encoding, parsing the response can be achieved in one of two ways: either through WCF's &lt;SPAN style="FONT-FAMILY:Courier New;"&gt;DataContractJSONSerializer&lt;/SPAN&gt; (similar in concept to the XmlSerializer), or by using LinqToJSON, which you can find here: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.codeplex.com/Json"&gt;http://www.codeplex.com/Json&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Whilst XML seems to be the first citizen of Silverlight, it is important that JSON encoding is supported easily, as many services you write may need to be consumed from both an AJAX enabled page and a Silverlight control. In these circumstances, you would definitely opt to use JSON, because the performance of XML in Javascript is poor, and the payload size is also bulkier. &lt;/P&gt;
&lt;P&gt;RSS and ATOM feeds are consumed using a mixture of the two methods above; you need to manually construct a Uri and pass it into a &lt;SPAN style="FONT-FAMILY:Courier New;"&gt;WebClient&lt;/SPAN&gt; which calls the feed, but Silverlight does provide you with a &lt;SPAN style="FONT-FAMILY:Courier New;"&gt;SyndicationFeed&lt;/SPAN&gt; class to parse the response. &lt;/P&gt;
&lt;P&gt;One final point to make is around security. As with AJAX, there is a difference between private services that are written and consumed only by your application and public services that are consumed by multiple applications across the internet. &lt;/P&gt;
&lt;P&gt;For privates services, Silverlight uses the ASP.net forms authentication mechanism (based around an authenticated cookie) to secure your services from other clients. This means that there is no additional code (on top of your ASP.net code plus config) to write in order to secure your own services. &lt;/P&gt;
&lt;P&gt;For public services, the same cross domain security issues apply as they do in the AJAX world. Silverlight supports its own ClientAccessPolicy.xml format as well as Flash's CrossDomain.xml file format to resolve this problem. So long as the service you call has one of these two files in its root, Silverlight will be able to call the services cross domain.&lt;/P&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=10078" width="1" height="1"&gt;</description><category domain="http://blogs.conchango.com/simonevans/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/MIX08/default.aspx">MIX08</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/Silverlight+2.0/default.aspx">Silverlight 2.0</category></item><item><title>Consuming JSON enabled WCF 3.5 services using ASP.net AJAX</title><link>http://blogs.conchango.com/simonevans/archive/2008/03/06/consuming-json-enabled-wcf-3-5-services-using-asp-net-ajax.aspx</link><pubDate>Thu, 06 Mar 2008 06:03:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:10057</guid><dc:creator>simon.evans</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/10057.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=10057</wfw:commentRss><description>&lt;P&gt;There are several blog posts out there that cover the subject of how to consume JSON enabled services from Javascript using ASP.net AJAX. Having scouted around the usual suspects, I think the best article is by Fritz Onion here: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.pluralsight.com/blogs/fritz/archive/2008/01/31/50121.aspx"&gt;http://www.pluralsight.com/blogs/fritz/archive/2008/01/31/50121.aspx&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;That said, I haven't found it all plain sailing, so I thought I'd write a blog entry covering the issues I have had to overcome in order to get this functionality working. &lt;/P&gt;
&lt;H2&gt;Service contract namespace issues &lt;/H2&gt;
&lt;P&gt;You will see from the article above that setting the namespace in the service contract attribute affects the Javascript namespace ASP.net's auto generated Javascript proxy uses to call the service. So, for example, when you use the namespace http://schemas.conchango.com/myservice/, you would instantiate a client proxy in Javascript using the following code: &lt;/P&gt;
&lt;P&gt;var proxy = new schemas.conchango.com.myservice.IMyServiceContract; &lt;/P&gt;
&lt;P&gt;where IMyServiceContract is the name of the service contract you are instantiating. Notice that the forward slashed are turned into dot notation by the Javascript proxy generation (and the final forward slash does matter!). &lt;/P&gt;
&lt;P&gt;Now this all makes a lot of sense so far, until I introduced schema versioning into my namespace: &lt;/P&gt;
&lt;P&gt;http://schemas.conchango.com/2008/03/myservice/ &lt;/P&gt;
&lt;P&gt;Versioning a schema in this way is standard practice for self describing SOAP services that expose a WSDL. It is important to ensure that you can version your service contract safely, ensuring that you don't break any consuming clients when you update your service to include new and changed functionality. It is also fundamental to publish-subscribe middleware, such as BizTalk understands who subscribes to the published message. &lt;/P&gt;
&lt;P&gt;Here a hardnosed RESTafarian may well point out that my WCF endpoint exposed using a WebHttpBinding is indeed not a SOAP service, so this is not important. And they are right, so long as I never want to expose my WCF service through an additional SOAP based endpoint (using a binding such as BasicHttpBinding). This is one on the single most important principles of WCF and Service Orientation: to be able to expose a single service, hosted as a single instance through different endpoints so that you can communicate using different transports, encodings and security. In other words, services should be policy driven. &lt;/P&gt;
&lt;P&gt;So I did work around the problem; when I need to version my schema I would use a new namespace such as: &lt;/P&gt;
&lt;P&gt;http://schemas.conchango.com/myservice2/ &lt;/P&gt;
&lt;P&gt;I think this is acceptable, although not standard schema naming practice. At least I can now version my schemas properly and expose my service through SOAP and REST at the same time. &lt;/P&gt;
&lt;H2&gt;Debugging issues with IIS &lt;/H2&gt;
&lt;P&gt;In order to use ASP.net debugging with ASP.net websites and services hosted in IIS, Visual Studio requires Integrated Windows Authentication to be enabled. However, if you are developing a web site for anonymous access, you will need to enable anonymous access in IIS too. The problem here is that WCF only allows one authentication scheme to be used. If you attempt to debug a service in IIS under these conditions, you will see the following error message: &lt;/P&gt;
&lt;P&gt;IIS specified authentication schemes 'IntegratedWindowsAuthentication, Anonymous', but the binding only supports specification of exactly one authentication scheme. Valid authentication schemes are Digest, Negotiate, NTLM, Basic, or Anonymous. Change the IIS settings so that only a single authentication scheme is used. &lt;/P&gt;
&lt;P&gt;The simplest workaround to this problem is to switch from using IIS to Visual Studio's development web server. Otherwise I found that I was limited to running the site in IIS. &lt;/P&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=10057" width="1" height="1"&gt;</description><category domain="http://blogs.conchango.com/simonevans/archive/tags/Atlas/default.aspx">Atlas</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/ASP.net+2.0/default.aspx">ASP.net 2.0</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/SOA/default.aspx">SOA</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/AJAX/default.aspx">AJAX</category></item><item><title>LINQ to SQL: Let the debate begin</title><link>http://blogs.conchango.com/simonevans/archive/2007/11/11/LINQ-to-SQL_3A00_-Let-the-debate-begin.aspx</link><pubDate>Sun, 11 Nov 2007 14:15:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:9027</guid><dc:creator>simon.evans</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/9027.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=9027</wfw:commentRss><description>&lt;p&gt;So I just got back from TechEd Barcelona, and I had a great conference in no small part due to the people I went with: Merrick Chaffer, James Dawson and Paul McMillan. This is a selection of some of Conchango&amp;#39;s finest from the world of .Net development, infrastructure and SQL Server. One of the reasons the conference was so much more enjoyable in the company of my colleagues was that I got as much out of the conversations we had outside of the sessions as I did from what I learnt in the sessions and labs. &lt;/p&gt;&lt;p&gt;Of all the subjects covered at this year&amp;#39;s TechEd, none had more coverage than LINQ, and between us, none had more debate than the impact LINQ has on our worlds. This is a conversation I can see playing out across the Developer / DBA divide the world over, as the majority of solutions developed require some sort of data access to a database. David Chappell made a comment in his REST vs SOAP session (which was probably the best session I went to) that struck a real chord with me; he said &amp;quot;people are only passionate when something is in doubt&amp;quot; Conversations of this nature can tend to take a slightly religious standpoint, so I&amp;#39;ll try to bear in mind David&amp;#39;s comments. &lt;/p&gt;&lt;p&gt;So with LINQ to SQL (and LINQ to Entities) the most hotly debated point was around the auto generation of LINQ&amp;#39;s dynamic SQL vs. using stored procedures. In the old days, one point favoring of using stored procedures was the performance gain from a cached execution plan. But since SQL Server 2005, dynamic SQL is also cached, so this reason for using stored procedures has largely gone away. One benefit dynamic SQL has over stored procedures is that you only select what you need in all cases. In a typical scenario with stored procedures and a DAL populating an object model, stored procedures will tend to be reused even when all of data is not used by the calling DAL method. There ways around this, but it largely involves an ever increasing list of stored procedures (GetObjectByX), make the solution less manageable. &lt;/p&gt;&lt;p&gt;What became clear in our debates on this topic is that really all depends on who you trust more: a developer writing a stored procedure or the LINQ to SQL engine? I began the week at TechEd a skeptic of LINQ to SQL, but the more I looked at what the engine produced, the more I began to trust it. Sure it won&amp;#39;t do a better job than a highly trained SQL expert (like Paul), but is it good enough and better than your average developer? From what I have tried I would say the answer is yes. And the bottom line is, when you need that extra performance out of a finely tuned stored procedure, you can still use them.&lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=9027" width="1" height="1"&gt;</description><category domain="http://blogs.conchango.com/simonevans/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Dealing with Message Ordering in Service Orientated Architectures</title><link>http://blogs.conchango.com/simonevans/archive/2007/10/10/Dealing-with-Message-Ordering-in-Service-Orientated-Architectures.aspx</link><pubDate>Wed, 10 Oct 2007 14:26:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:8765</guid><dc:creator>simon.evans</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/8765.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=8765</wfw:commentRss><description>&lt;p&gt;Message ordering is a key concept in a service orientated architecture. It is a key concept, because one of the core tenets of SOA is that a service must remain autonomous. In remaining autonomous, a service must be able to deal with any unexpected circumstance of messages sent to it, including the possibility of messages being received out of order. &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;There are two core strategies you can apply when designing your service: you can either force your client to send messages in the correct order, or you can enable messages to be processed out of order and implement mechanisms within your service to deal with the consequences of this. There are strengths and weaknesses to both approaches. In general, imposing ordering has a cost to the performance of the solution, because managing ordering requires you to manage the state of order. However, removing ordering requires the service to respond to the consequences of receiving the messages out of order. This has an additional development cost, which normally requires the development of compensating transactions. &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;When discussing the strengths and weaknesses of imposing ordering, the decisions have to be considered for two distinctly different scenarios: homogeneous and heterogeneous ordering. &lt;/p&gt;&lt;h2&gt;Homogeneous message ordering &lt;/h2&gt;&lt;p&gt;Homogeneous message ordering is ordering of messages with the same schema. For example you may have a message to update a customer. In this example, it is important that ordering is considered, because messages being received out of order could result in a customer being updated in an incorrect state (because the final update to the customer has been overwritten by an earlier message which has been received out of order). &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;Imposing ordering of such messages can be achieved in WCF using a binding that supports ordering, such WsHttpBinding (this uses the WS-ReliableMessaging policy). Likewise, BizTalk can support ordering through use of correlation. However in such ordering scenarios, be mindful of the fact that both the client and the endpoint must be order aware. So for example, if BizTalk (as the client) correlates messages being sent to a web service that is not order aware, no guarantee can be made on the order the messages are processed by the endpoint. &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;Enabling a service to receive homogeneous messages out of order means that the endpoint must be able to cope with messages that have expired; the service must cope with the fact that the inbound message has already been superseded by a newer message. An expired message is known as a &amp;quot;zombie&amp;quot; message. The simplest way to ensure that the endpoint is able to evaluate the message as older than the previous message is to include a published date (date time) on the outbound message. If the endpoint persists this published date as stateful data, the service can then evaluate the previous published date for the message and ignore older messages. &lt;/p&gt;&lt;h2&gt;Heterogeneous message ordering &lt;/h2&gt;&lt;p&gt;Heterogeneous message ordering is ordering of messages of different schemas that have a relationship to each other. For example you may have a message for each customer and each customer may have many bank accounts, each of which constitutes a separate message which is related to a parent customer message. &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;Imposing ordering of such messages means that the publishing system needs to maintain some understanding of related messages that have been previously sent. In BizTalk, this is achieved using correlation which requires messages to expose distinguished fields that will be used for correlation. &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;Whilst imposing ordering is achievable its performance cost can be avoided if the endpoint is designed to be order agnostic. When an endpoint is order agnostic, it is able to receive heterogeneous messages in any order and tie the messages together within the endpoint. So for example, the endpoint would accept an account for a customer it has yet to receive the message for. To enable the endpoint to correlate these messages, the customer and account messages would need to contain enough information about the relationship between these two entities. The endpoint then needs to be designed to be able to accept these messages in either order and deal with the consequences of this. &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;By enabling an endpoint to receive messages out of order, the service endpoint must also deal with the consequences of one these messages never arriving at the endpoint. So, for example, if a customer has two accounts and only one them is received by the endpoint, it may be important to deal with this account having gone missing. This scenario would require compensation. &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;Compensation is some form of action that compensates the publishing system when a failure has occurred. Compensation can take many forms from the simple to the sophisticated, depending on the requirements and the business value. Indeed, in some scenarios, it may be deemed reasonable not to provide any form of compensation at all. A simple form of compensation might be to email an administrator to tell them in invoke a manual procedure. A sophisticated form of compensation might be to send a compensating message back to the publishing service which would then rollback the state of customer in that system. &lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=8765" width="1" height="1"&gt;</description><category domain="http://blogs.conchango.com/simonevans/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/BizTalk/default.aspx">BizTalk</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/Windows+Communcation+Foundation/default.aspx">Windows Communcation Foundation</category></item><item><title>A comprehensive guide to using MsmqIntegrationBinding with MSMQ 3.0 in WCF</title><link>http://blogs.conchango.com/simonevans/archive/2007/09/17/A-comprehensive-guide-to-using-MsmqIntegrationBinding-with-MSMQ-3.0-in-WCF.aspx</link><pubDate>Mon, 17 Sep 2007 12:52:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:8492</guid><dc:creator>simon.evans</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/8492.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=8492</wfw:commentRss><description>&lt;h2&gt;Overview of WCF architecture &lt;/h2&gt;&lt;p&gt;Figure 1 illustrates the generic architecture WCF employs for all services. &lt;/p&gt;&lt;p&gt;&lt;img alt="Figure 1 - General WCF Architecture" height="299" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8493/425x299.aspx" style="width:425px;height:299px;" title="Figure 1 - General WCF Architecture" width="425" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:11pt;line-height:115%;font-family:'Calibri','sans-serif';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;color:#4f81bd;"&gt;&lt;strong&gt;Figure 1 - General WCF Architecture &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The outer service represents the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;AppDomain&lt;/span&gt; of the service. A WCF service consists of contracts (data, fault and service contracts), a service instance (implementation) which is the implementation of a service contract, and configuration which contains the service endpoint information used at runtime to create the channel stack and the service instance. &lt;/p&gt;&lt;p&gt;A WCF service endpoint consists of two core elements: the service contract and a binding. A binding describes how the service will communicate with clients at runtime. WCF provides several default bindings out of the box, covering many common communication scenarios such as &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;BasicHttpBinding&lt;/span&gt; and &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;MsmqIntegrationBinding&lt;/span&gt;. In addition to creating bindings from scratch, you can also extend and customize the default bindings to work as you wish. &lt;/p&gt;&lt;h3&gt;Service Instancing and opening communication &lt;/h3&gt;&lt;p&gt;Figure 1 illustrates what happens when a WCF service is run. Ultimately, the aim of the service is to map messages from clients to operations within the service instance. The service instance requires a runtime host and the host must be opened for communication to occur. The &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;ServiceHost&amp;lt;T&amp;gt;&lt;/span&gt; class represents this host in code. When the host&amp;#39;s constructor is run, it uses the service endpoint configuration combined with the contracts defined in assemblies (retrieved using reflection) to create a &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;ServiceDescription&lt;/span&gt;. Thus, the Service host description contains the complete description of the service, including what contracts to use, what service implementation to use for the service contract and how the service will communicate with the outside world (binding). &lt;/p&gt;&lt;p&gt;When the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;ServiceHost&amp;lt;T&amp;gt;.Open()&lt;/span&gt; method is run the Service Description is used to create a Channel Stack and a Service Instance. The Channel Stack is the runtime equivalent of the Binding information. The stack contains all the protocols required in order for the communication. As a minimum for any binding, this must contain at least a Transport and an Encoding. Additional protocols (such as Sessions and Transactions) can then be applied on top. For more information on the channel stack architecture, look at the following MSDN article: &lt;a href="http://msdn2.microsoft.com/en-us/library/ms729840.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms729840.aspx&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Once the service host is open, the service is ready to receive incoming requests from a client. The inbound message gets received through the channel stack and the Dispatcher is then responsible for assigning the message to the corresponding Service Instance operation, deserializing the message using the appropriate deserializer and executing the operation on the service instance. For more information on serialization , look at the following blog entry: &lt;a href="http://blogs.conchango.com/simonevans/archive/2007/05/14/WCF-serialization-with-MSMQ.aspx"&gt;http://blogs.conchango.com/simonevans/archive/2007/05/14/WCF-serialization-with-MSMQ.aspx&lt;/a&gt;. &lt;/p&gt;&lt;h3&gt;Behaviors in WCF &lt;/h3&gt;&lt;p&gt;Behaviors are a way of changing the default way in which either a service instance, or operation will execute when run. Behaviors either inherit from interface &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;IServiceBehavior&lt;/span&gt; or &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;IOperationBehavior&lt;/span&gt;. They are attached to the service description when the host is constructed, using a mixture of configuration, and/ or any additional code you choose to add. Whether you add a behavior in code or in configuration depends on whether you want the behavior to be configurable, or if you need to behavior to be permanently applied. &lt;/p&gt;&lt;h3&gt;Examining runtime metadata using InstanceContext and OperationContext &lt;/h3&gt;&lt;p&gt;Whilst the service instance is running, the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;InstanceContext&lt;/span&gt; class provides you with the ability to examine metadata about the instance at runtime, such as information about the channel stack and the host. The lifetime of the InstanceContext is aligned to the life time of the service instance. Likewise, the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;OperationContext&lt;/span&gt; provides you with runtime access to service operation metadata for the lifetime of the call to the service operation. OperationContext provides you with access to information such as message headers and properties for inbound and outbound messages, and the Dispatcher. &lt;/p&gt;&lt;h3&gt;Handling Concurrency &lt;/h3&gt;&lt;p&gt;&lt;span style="color:#4f81bd;font-family:Courier New;"&gt;InstanceContextMode&lt;/span&gt; and &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;ConcurrencyMode&lt;/span&gt; are service behavior attributes applied to the Service Description when the host is constructed. Together, these two attributes are used to configure how a service will control the lifetime of service instances and how many messages a dispatcher will hand over to an instance. &lt;/p&gt;&lt;p&gt;The InstanceContextMode controls the lifetime of a service instance. By default, this is set to &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;PerSession&lt;/span&gt;. This means the service instance will last for the lifetime of the corresponding Session (which equals PerCall if no session is available). &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;PerCall&lt;/span&gt; instancing means the instance will be destroyed after the service operation completes. The final option here is &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;Single&lt;/span&gt;, which means that the instance context will only be destroyed when the host is closed. &lt;/p&gt;&lt;p&gt;The &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;ConcurrencyMode&lt;/span&gt; handles how many messages the dispatcher will hand over to the service instance. The default is &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;Single&lt;/span&gt;, which means the service instance runs single threaded, but this can be changed to run multi threaded by using the setting &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;Multi&lt;/span&gt;. &lt;/p&gt;&lt;p&gt;Additional to InstanceContextMode and ConcurrencyMode, the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;ServiceThrottlingBehavior&lt;/span&gt; controls how many concurrent service instances will be run by the host at one time (the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;MaxConcurrentInstances&lt;/span&gt; property), and how many concurrent calls can be made to a single instance (the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;MaxConcurrentCalls&lt;/span&gt; property). It is worth noting with this final property that the channel stack will automatically ready the next inbound message even when concurrent calls are set to 1. &lt;/p&gt;&lt;p&gt;All of these behaviors together control how concurrency and threading will be handled within a WCF service. Figures 2 to 4 below show how these variables can affect threading and concurrency in WCF.&lt;/p&gt;&lt;p&gt;&lt;img alt="Figure 2" height="228" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8494/425x228.aspx" style="width:425px;height:228px;" title="Figure 2" width="425" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;color:#4f81bd;"&gt;&lt;strong&gt;Figure 2 &amp;ndash; PerCall instancing, Single Threaded with 2 concurrent instances &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Figure 2 shows a service that allows two concurrent service instances to run, each of which is destroyed when the call to the operation is complete (PerCall). Each service instance is configured to only allow one thread to run at a time. This means that of the three inbound messages (shown on the left), the dispatcher will handle two currently using two service instances in the process. The third message will be made ready by the channel stack for handling by the dispatcher. &lt;/p&gt;&lt;p&gt;&lt;img alt="Figure 3" height="228" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8495/425x228.aspx" style="width:425px;height:228px;" title="Figure 3" width="425" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;color:#4f81bd;"&gt;&lt;strong&gt;Figure 3 &amp;ndash; PerCall instancing, Single Threaded with 1 concurrent instance &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Figure 3 shows what happens when the concurrent instances property is set to 1. The result is only one service instance is created and runs single threaded. A second message is made ready for the dispatcher in the channel stack and is not processed until the service instance is destroyed at the end of the first operation call. &lt;/p&gt;&lt;p&gt;&lt;img alt="Figure 4" height="234" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8497/425x234.aspx" style="width:425px;height:234px;" title="Figure 4" width="425" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;color:#4f81bd;"&gt;&lt;strong&gt;Figure 4 - Single Instance, Multi threaded with 2 concurrent calls &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Figure 4 shows how using multi threaded concurrency with a single instance would affect how the service behaves with two concurrent calls allowed. The top two inbound messages from the channel stack would make a call to an operation on a single service instance concurrently. This service instance would not be destroyed at the end of the call to the operation. The third message would be waiting in the channel stack, and as soon as the service instance made a thread free for use, the dispatcher will call the operation for the third message against the same service instance. &lt;/p&gt;&lt;h3&gt;Service Exceptions &lt;/h3&gt;&lt;p&gt;When a service instance throws an unhandled exception, the InstanceContext is said to be in a Faulted state, and the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;Faulted&lt;/span&gt; event will be raised. This event can be handled in the service host. Once the host is in a faulted state, no further service instances will be created until the channel stack is taken out of a faulted state. This can be achieved by closing and reopening the host (services hosted in IIS automatically handled restarting the host). &lt;/p&gt;&lt;h2&gt;Using MSMQ with WCF &lt;/h2&gt;&lt;h3&gt;Why use MSMQ for communication? &lt;/h3&gt;&lt;p&gt;MSMQ provides core features which can be employed to solve various architectural problems. It is a store and forward mechanism for messages, and provides core features such as durability, exactly once delivery and transactional support. MSMQ should be employed in situations where you need a buffer in communication between two endpoints, such as cases where a service intermediary is required to deal with service (un)availability and reliability. &lt;/p&gt;&lt;p&gt;Before looking at using MSMQ with WCF, it is important to understand some core concepts of MSMQ, particularly when it is employed in a distributed architecture, where endpoints are running on different servers. These concepts are largely abstracted away from you writing service code, but their impact is important to understand. &lt;/p&gt;&lt;p&gt;Firstly, the term store and forward refers to how MSMQ will send a message across machine boundaries. When a message is sent from one machine to another, MSMQ will send the message to an outbound local queue and then forward it onto the remote queue on the other machine. If the remote machine is offline, the message will remain on the local queue for a period of time until the remote queue becomes available, or the attempt to process the message times out. The store and forward mechanism deals with the requirement that the remote machine may be offline when the message is sent. If the timeout for processing the message from outbound local queue expires, the message will be removed from the local queue and can be optionally moved to a dead letter queue. This queue is the&amp;nbsp;final resting place for a message ensuring that&amp;nbsp;the message has not been lost. &lt;/p&gt;&lt;p&gt;The second concept to understand is durability. During the store and forward mechanism a message can optionally be persisted to disk. The reason for doing this would be to recover from machine failures and reboots on either the outbound queue or the remote queue. &lt;/p&gt;&lt;p&gt;The next concept is exactly once delivery. This ensures that an individual message is assured to be sent exactly once. This assurance should be used when it is important not to receive duplicates of the same message. &lt;/p&gt;&lt;p&gt;Finally, MSMQ can optionally support transactions either homogeneously using a local MSMQ transaction manager, or heterogeneously using DTC. When transactions are required, MSMQ requires that the message uses exact once delivery with durability in order to achieve the requirements of an ACIDic transaction. &lt;/p&gt;&lt;p&gt;It is worth also understanding the transport that MSMQ uses for sending and receiving messages. Messages are sent using TCP/IP and received using RPC. As RPC is a heavy weight protocol, it is seen as best practice to send to a remote machine queue, but receive from a local queue. Indeed remote receives on a transactional queue are not supported in MSMQ 3.0, because of the performance implications of doing so. &lt;/p&gt;&lt;h3&gt;MsmqIntegrationBinding in Detail &lt;/h3&gt;&lt;p&gt;&lt;span style="color:#4f81bd;font-family:Courier New;"&gt;MsmqIntegrationBinding&lt;/span&gt; is an out of the box binding for communication with MSMQ alongside &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;NetMsmqBinding&lt;/span&gt;. The reason that WCF provides two bindings to communicate with MSMQ is that NetMsmqBinding will only work in pure WCF only architectures, where all clients and services are WCF based. It does however provide a much richer channel stack, including support for Sessions, which in turn gives you greater transactional control. &lt;/p&gt;&lt;p&gt;If you are working in a heterogeneous architecture where WCF is interoperating with other MSMQ based clients and services, MsmqIntegrationBinding is the only option available to you. MsmqIntegrationBinding is limited in the communication policies it can use, and it also requires service contracts specifically designed for use with the binding. Figure 5 below shows the WCF architecture from the point of view of MsmqIntegrationBinding. &lt;/p&gt;&lt;p&gt;&lt;img alt="Figure 5" height="291" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8498/425x291.aspx" style="width:425px;height:291px;" title="Figure 5" width="425" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:9pt;color:#4f81bd;"&gt;&lt;strong&gt;Figure 5 - WCF architecture using MsmqIntegrationBinding &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;MsmqIntegrationBinding requires contracts that are designed only for its use. Unless additional behaviors are applied to the dispatcher, the service contract can contain only one service operation. For more information on extending the service contract in this way, look at the following link: &lt;a href="http://msdn2.microsoft.com/en-us/library/ms752265.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms752265.aspx&lt;/a&gt;. Service operations for MsmqIntegrationBinding can contain only one argument typed as &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;MsmqMessage&amp;lt;T&amp;gt;&lt;/span&gt;, where T is the data contract used in the MSMQ message body. &lt;/p&gt;&lt;p&gt;MsmqIntegrationBinding is also limited in terms of what policies can be applied in the channel stack. The Transport used is TCPIP for sending messages and RPC for receiving messages, and it is only at the transport level can security be applied (there is no message level security available). &lt;/p&gt;&lt;p&gt;Beyond Transport and Encoding policies, the only optional addition to the channel stack is transactional support. For MsmqIntegrationBinding, transactions have to use auto completing transactions. This is achieved by applying an operation behavior to the service implementation with attributes &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;TransactionScopeRequired&lt;/span&gt; and &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;TransactionAutoComplete&lt;/span&gt; set to true. This means that the transaction (with MSMQ) will automatically be committed if the service operation completes without an unhandled exception. This is limited transactional support because it means your transactions cannot flow beyond the service operation you are running into other service operations or behaviors. The reason MsmqIntegrationBinding does not support explicit transaction control is because explicit transactions in WCF require Sessions to be enabled, which are not supported by this binding. &lt;/p&gt;&lt;p&gt;MSMQ comes in various different versions. MsmqIntegrationBinding supports both version 3.0 and 4.0. Version 3.0 is provided with Windows XP and Windows Server 2003. MSMQ v4.0 is provided with Windows Vista and Windows Server 2008; it provides richer functionality for custom dead letter queues and poison messaging (see later). &lt;/p&gt;&lt;p&gt;The following table lists key properties exposed by the MsmqIntegrationBinding, how these are used and what versions of MSMQ will support this property: &lt;/p&gt;&lt;div&gt;&lt;table style="border-collapse:collapse;"&gt;&lt;tr&gt;&lt;td style="padding-right:7px;padding-left:7px;border:black 0.5pt solid;"&gt;&lt;p&gt;&lt;strong&gt;Property name&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:black 0.5pt solid;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;strong&gt;What does it do?&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:black 0.5pt solid;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;strong&gt;MSMQ version&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;CustomDeadLetterQueue&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Specifies the name of the custom dead letter queue to use.&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;4.0 only&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;DeadLetterQueue&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Specifies whether to use a system, custom or no dead letter queue.&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;All (3.0 does not support custom dead letter queues).&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Durable&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Specifies whether MSMQ will persist the message to disk, making it durable to server shutdown.&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;All&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;ExactlyOnce&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Specifies whether MSMQ will ensure that a message is delivered exactly once.&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;All&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;ReceiveRetryCount&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Specifies the number of times the channel will retry attempting to process the message from the queue (executing the service operation). This is used for poison message handling (see below).&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;All&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;ReceiveErrorHandling&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Specifies how the channel will respond to a message which fails to be processed once all retry cycles are exhausted. This is used for poison message handling (see below).&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;All (3.0 only supports Drop and Fault values).&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;MaxRetryCycles&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Specifies how many retry cycles are used in an MSMQ 4.0 retry queue.&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;4.0 only&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;RetryCycleDelay&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Specifies a delay between retry cycles used by the MSMQ 4.0 retry queue.&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;4.0 only&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;h3&gt;Message processing failure &lt;/h3&gt;&lt;p&gt;When an MSMQ message is processed by the channel stack and handed to the service instance from the dispatcher, the service operation must cope with exceptions. These exceptions can be separated into two distinct groups: expected exceptions and unexpected exceptions. For unexpected exceptions, WCF provides a built in mechanism called Poison Message Handling, which is covered later in this document. &lt;/p&gt;&lt;h4&gt;Expected Exceptions &lt;/h4&gt;&lt;p&gt;A general principle of all message based architectures is to handle the message as quickly as possible to a final destination (normally your endpoint). This is important to remember when dealing with expected exceptions. These are exceptions raised within the service operation that are expected to happen under certain known conditions. Expected exceptions are best dealt with explicitly in code, with a definitive outcome for handling the exception. For example, a message may contain data which is invalid for the service implementation&amp;#39;s business rules. In this example, the message would never be allowed into the endpoint, so the message needs to be routed to another destination, such as another queue. &lt;/p&gt;&lt;p&gt;The best way to handle expected exceptions is to catch the typed exception in a try catch block, as place the action for the exception in the catch block. With MsmqIntegrationBinding it is important to remember that transactional messages can only be processed using automatic transactions, which means that your handling code needs to participate in the outer transaction if you want the message to be moved off of the queue. The metadata about the MSMQ message can be retrieved using the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;OperationContext.IncomingMessageProperties&lt;/span&gt; collection, which for MsmqIntegrationBinding are typed as &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;MsmqIntegrationMessageProperty&lt;/span&gt;. The following code is an example of such a handler for an expected exception used within a service operation that executes in an automatic transaction: &lt;/p&gt;&lt;div&gt;&lt;table style="background:#f2f2f2;border-collapse:collapse;"&gt;&lt;tr&gt;&lt;td style="padding-right:7px;padding-left:7px;"&gt;&lt;p&gt;&lt;span style="font-size:8pt;color:blue;font-family:Courier New;"&gt;try &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;{ &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;&lt;span style="color:green;"&gt;// do service operation logic here: &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;} &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;catch&lt;/span&gt; (MyValidationException) &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;{ &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;&lt;span style="color:teal;"&gt;MsmqIntegrationMessageProperty&lt;/span&gt; integrationMessageProperty = operationContext.IncomingMessageProperties[&lt;span style="color:teal;"&gt;MsmqIntegrationMessageProperty&lt;/span&gt;.Name] &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:teal;"&gt;MsmqIntegrationMessageProperty&lt;/span&gt;; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; label = integrationMessageProperty.Label; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (integrationMessageProperty.Body != &lt;span style="color:blue;"&gt;null&lt;/span&gt;) &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;{ &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:teal;"&gt;TransactionScope&lt;/span&gt; scope = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;TransactionScope&lt;/span&gt;(&lt;span style="color:teal;"&gt;TransactionScopeOption&lt;/span&gt;.Required)) &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;{ &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:teal;"&gt;MessageQueue&lt;/span&gt; badQueue = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:teal;"&gt;MessageQueue&lt;/span&gt;(badQueuePath)) &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;{ &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;badQueue.Send(integrationMessageProperty.Body, label, &lt;span style="color:teal;"&gt;MessageQueueTransactionType&lt;/span&gt;.Automatic); &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;scope.Complete(); &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;} &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;} &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;} &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8pt;font-family:Courier New;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;h4&gt;Poison Message handling for Unexpected Exceptions in MSMQ 3.0 &lt;/h4&gt;&lt;p&gt;MsmqIntegrationBinding includes a built in mechanism for dealing with unexpected exceptions called Poison Message Handling. MSDN includes a lot of useful information about poison messaging at &lt;a href="http://msdn2.microsoft.com/en-us/library/ms789028.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms789028.aspx&lt;/a&gt;. More specifically, there is also information about using Poison Messaging with MSMQ 3.0 at &lt;a href="http://msdn2.microsoft.com/en-us/library/ms751472.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms751472.aspx&lt;/a&gt;. There are however quite a few missing details from these articles. &lt;/p&gt;&lt;p&gt;MsmqIntegrationBinding exposes properties called &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;ReceiveErrorHandling&lt;/span&gt; and &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;ReceiveRetryCount&lt;/span&gt; which deal with the number of times the channel stack will attempt to process the message from the queue and what happens when this retry number is exceeded. In MSMQ 3.0, the only options for dealing with poison messages is either to Drop the message (remove it from the queue and ignore) or Fault, which will cause the service instance to be put in a Faulted state. When Fault is chosen for error handling, WCF will throw an &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;MsmqPoisonMessageException&lt;/span&gt;, which can be handled by writing a custom error handler which implements &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;IErrorHandler&lt;/span&gt;. This error handler can be attached to the service description (either in code or configuration) by attaching the error handler to a behavior. The above MSDN articles provide code samples for this scenario. &lt;/p&gt;&lt;p&gt;Any error handler that is attached to the service description is executed when any exception occurs within the channel stack. The &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;HandleError&lt;/span&gt; method is called, passing in the exception that was thrown. If the error is handled by the error handler, the method returns true back to the channel stack and no other error handler is called. The standard scenario for a handler for poison message exceptions is to move the message off of the main queue to allow other messages to be processed, and reopen the service host so that communication can continue. &lt;/p&gt;&lt;p&gt;It is important to understand the context in which the MsmqPoisonMessageException is thrown. When this exception is thrown, receive retries have been exhausted and the InstanceContext is faulted. This means that communication is stopped in the channel stack and the host is no longer open for communication. The message transaction will therefore rollback and return to the message to the queue. The poison message handler is then able to receive this message from the queue to move it onto another queue so that normal message processing can resume once communication is reopened. &lt;/p&gt;&lt;p&gt;Using a poison message handler needs to be understood from the point of view of concurrency. As the original transaction is rolled back a new transaction is created to move the message from the queue, there is a possibility that other concurrent instance will attempt to process the message off of the queue before the host has been completely closed and the poison handler is run. Therefore, the poison message mechanism cannot guarantee how many times the service operation will be executed before the handler is run. The handler is running under transactional race conditions where other processing service instances might not yet have fully rolled back their transactions. Therefore the handler needs to attempt to receive the message off the queue several times to ensure the message is moved off the queue. &lt;/p&gt;&lt;p&gt;In MSMQ 3.0, the ReceiveRetryCount for each message processed concurrently is maintained in memory in the channel stack and can only be maintained for a maximum of 256 concurrent messages. The current count is available from the &lt;span style="color:#4f81bd;font-family:Courier New;"&gt;MsmqIntegrationMessageProperty.AbortCount&lt;/span&gt; property of the inbound message in the InstanceContext. Because this maintained in memory, an MsmqPoisonMessageException will cause all concurrent instances to be destroyed as the host is closed, and there &lt;strong&gt;all &lt;/strong&gt;retry counts are reset. This means that with concurrent instances, it is feasible that messages may be processed more times than their retry count, because the count is reset during processing. This problem is resolved in MSMQ 4.0, where MSMQ stores the retry count on disk outside of the channel stack. &lt;/p&gt;&lt;h2&gt;Related articles &lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.conchango.com/simonevans/archive/2007/05/14/WCF-serialization-with-MSMQ.aspx"&gt;http://blogs.conchango.com/simonevans/archive/2007/05/14/WCF-serialization-with-MSMQ.aspx&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.conchango.com/simonevans/archive/2007/04/22/WCF-Contract-Design-Guidelines.aspx"&gt;http://blogs.conchango.com/simonevans/archive/2007/04/22/WCF-Contract-Design-Guidelines.aspx&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=8492" width="1" height="1"&gt;</description><category domain="http://blogs.conchango.com/simonevans/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/BizTalk/default.aspx">BizTalk</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/Windows+Communcation+Foundation/default.aspx">Windows Communcation Foundation</category></item><item><title>WCF serialization with MSMQ</title><link>http://blogs.conchango.com/simonevans/archive/2007/05/14/WCF-serialization-with-MSMQ.aspx</link><pubDate>Mon, 14 May 2007 16:03:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:6975</guid><dc:creator>simon.evans</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/6975.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=6975</wfw:commentRss><description>&lt;p&gt;By default, Windows Communication Foundation (WCF) uses the DataContractSerializer to serialize and deserialize XML in a service, but this serialization mechanism can be replaced to use the XmlSerializer. The following article on MSDN covers this in more detail: &lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms733901.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms733901.aspx&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Whilst using the Data Contract attributes is much easier, and many more types are supported for serialization, there are various scenarios where switching to the XmlSerializer can be beneficial, such as: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Migrating services from ASMX services &lt;/li&gt;&lt;li&gt;Tighter control over XML serialization &lt;/li&gt;&lt;li&gt;Using WCF with MsmqIntegrationBinding &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The latter of these three examples is core reason why I have spent a lot of time investigating the use of serializers within WCF. Msmq integration binding relies upon the old Msmq API&amp;#39;s used by the System.Messaging namespace in order to ensure interoperability with other legacy Msmq endpoints, such as BizTalk Server 2006 (pre R2). &lt;/p&gt;&lt;p&gt;The scenario I have been working with is that I want to use MsmqIntegrationBinding with BizTalk Server 2006 in the short term, and move to BizTalk Server 2006 R2 and NetMsmqBinding in the future. Thus in the future I want to move towards using the DataContractSerializer, but in the short term, I need to support the old XmlSerializer, because MsmqIntegrationBinding uses this serialization method internally. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Getting MsmqIntegrationBinding to work with complex data contracts&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;I have seen dozens of samples on the internet for using MsmqIntegrationBinding in WCF, and in short the basic mechanics are as follows: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create a service contract with a one way service operation that takes a single argument MsmqMessage&amp;lt;T&amp;gt;, where T is a data contract. &lt;/li&gt;&lt;li&gt;Ensure the T of MsmqMessage&amp;lt;T&amp;gt; is specified using the ServiceKnownType attribute. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The problem is, all the examples I have seen use a single simple data contract to demonstrate this binding. When a more complex data contract is used, things get more difficult. For example if I have two data contracts A and B, and A exposes B as a data member, the above instructions alone do not work; the message is never received by the service implementation. The reason this would not work is because data contract B is not known to the serializer and thus A could not be serialized. &lt;/p&gt;&lt;p&gt;After much hunting, I found the solution was to implement serialization using the old XmlSerializer, using XmlRoot and XmlArray attributes to decorate each data contract. By using the XmlSerializerFormatAttribute, you don&amp;#39;t need to use the data contract attributes at all, as WCF will use the old serializer instead throughout the service contract. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Comparing the DataContractSerializer with the XmlSerializer&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;In order to ensure a smooth transition from MsmqIntegrationBinding to NetMsmqIntegration binding I have opted to support both serializers in my data contracts, with a view to retiring the XmlSerializer as some point in the future. The problem is, the serializers handle things in different ways. The table below lists the differences: &lt;/p&gt;&lt;div&gt;&lt;table style="border-collapse:collapse;"&gt;&lt;tr&gt;&lt;td style="padding-right:7px;padding-left:7px;border:black 0.5pt solid;"&gt;&lt;p&gt;&lt;strong&gt;DataContractSerializer&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:black 0.5pt solid;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;strong&gt;XmlSerializer&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:black 0.5pt solid;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;&lt;strong&gt;Resolution to serialization differences&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;If ordering is not specified, the data members are serialized in alphabetical order&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;The properties are serialized in the order they appear in the class&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Ensure the order argument is specified in the data member attribute in the order that the properties appear in the class.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:black 0.5pt solid;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;If the data contract contains an array of objects from a different XML namespace, the serialization will automatically set the namespace of the array to be that of the objects within the array.&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;The namespace of the array will be that of the outer data contract.&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:black 0.5pt solid;padding-right:7px;border-top:medium none;padding-left:7px;border-left:medium none;border-bottom:black 0.5pt solid;"&gt;&lt;p&gt;Ensure the XmlArray attribute is used against the array property to ensure that the array is serialized the same in both serializers.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;Additionally, you must ensure the XSD namespace for each DataContractAttribute and XmlRootAttribute match. &lt;/p&gt;&lt;p&gt;You can compare how the two serialization models match by running svcutil.exe and xsd.exe against the data contract assembly and look at the output XSD schemas.&lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=6975" width="1" height="1"&gt;</description><category domain="http://blogs.conchango.com/simonevans/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/BizTalk/default.aspx">BizTalk</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/Windows+Communcation+Foundation/default.aspx">Windows Communcation Foundation</category></item><item><title>WCF Contract Design Guidelines</title><link>http://blogs.conchango.com/simonevans/archive/2007/04/22/WCF-Contract-Design-Guidelines.aspx</link><pubDate>Sun, 22 Apr 2007 21:10:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:6690</guid><dc:creator>simon.evans</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/6690.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=6690</wfw:commentRss><description>&lt;p&gt;Here at Conchango we have community days every six weeks where we get together to discuss common work interests. As a .Net Architect, one of the core communities I participate in is the .Net community. At our last community day, I presented on Windows Communication Foundation, a technology I have been working with in anger now for over a year. &lt;/p&gt;&lt;p&gt;Whilst the PowerPoint slideshow doesn&amp;#39;t really cover any detail on what I presented or demonstrated, I thought I&amp;#39;d attach it to this blog anyway, as this blog covers the contract design guidelines I ran through with the community. &lt;/p&gt;&lt;h1&gt;Overview &lt;/h1&gt;&lt;p&gt;The following design guidelines can mostly be based around one single important fact about implementing a service orientated architecture (SOA); changing the design of a contract is in an expensive exercise. If changes in contract designs can be limited to a minimum, the cost of ownership of your SOA will reduce, because calling clients have to change less often. &lt;/p&gt;&lt;h1&gt;Do all you can to design service contracts to be binding agnostic &lt;/h1&gt;&lt;p&gt;This sounds like a simple point to make, but it&amp;#39;s an easy one to forget, and difficult to achieve. The bottom line is that to get the most out WCF from an architect&amp;#39;s perspective, you really want to try to ensure that non-functional requirements related to your communication needs do not become hard coded into your contract designs; if you can use configuration to drive transport, policy and encoding decisions, the cost of changing these features later becomes much cheaper than changing code. &lt;/p&gt;&lt;p&gt;This can be hard and at times impossible to achieve. For example, if you decide that you need to use MSMQ integration binding, your service contract will need to use the MsmqMessage&amp;lt;T&amp;gt; class as the only argument allowed in your service operation, and thus your service contract is effectively hard wired to this binding type. &lt;/p&gt;&lt;p&gt;However, with other examples, you can design your contracts in an agnostic way. For example, you may choose to use the Session features of WCF, and could use the IsInitiating and IsTerminating properties of the OperationContractAttrbute in your design to enforce the opening and closing of sessions. Whilst this feature is useful, it will tie you into not being able to use BasicHttpBinding, and thus if you decide later that this binding best suits your communication needs, you will need to change the design of your service contracts accordingly. &lt;/p&gt;&lt;h1&gt;Design request data contracts to act as an envelope to service requests &lt;/h1&gt;&lt;p&gt;As mentioned above, MsmqIntegration binding requires dedicated service contracts using the MsmqMessage&amp;lt;T&amp;gt; class. If you design a service contract for a web service, but later decide to change this into a service that receives a message from a message queue, you will need to use MsmqMessage&amp;lt;T&amp;gt;, where T is the type of a single data contract. &lt;/p&gt;&lt;p&gt;Consider the following service operation: &lt;/p&gt;&lt;p&gt;int MultiplyNumbers(int firstNumber, int secondNumber); &lt;/p&gt;&lt;p&gt;If you choose to implement this using MsmqIntegration binding, you will need to create an envelope data contract, with properties for the first and second numbers. To avoid having to redesign data contracts later, always wrap multiple arguments into a single request data contract, such as: &lt;/p&gt;&lt;p&gt;int MultiplyNumbers(MultiplicationRequestData request); &lt;/p&gt;&lt;h1&gt;Fault contracts require two way communication &lt;/h1&gt;&lt;p&gt;Obvious when you think about it, but if you expect service faults to be reported to the calling client, the service operation must use two way communication. &lt;/p&gt;&lt;h1&gt;Avoid contract namespace conflicts with the application layer &lt;/h1&gt;&lt;p&gt;Be careful how you name you data contracts, because you will normally be wrapping an application with its own API, and this can lead to namespace conflicts which require you to use a fully qualified namespace on every call to the type, which mean messy code. On my project, we have adopted a standard of using EntityNameData as the naming convention for data contracts. &lt;/p&gt;&lt;h1&gt;Always assign dates to your schema namespaces &lt;/h1&gt;&lt;p&gt;This is important for schema versioning in your contracts, and particularly important in you are planning you use your services with a messaging hub, such as BizTalk Server where subscription is driven off of unique schema namespaces. &lt;/p&gt;&lt;h1&gt;Only use types that translate to XSD types in your data contracts &lt;/h1&gt;&lt;p&gt;Data contracts should only use types that have a direct comparison in XSD, because you WSDL will otherwise contain XSD import statements to Microsoft generated schemas to represent .Net types. This means using arrays instead of collections, and sticking to enumerations, integers, strings and datatimes. &lt;/p&gt;&lt;h1&gt;Do not take an Object Orientated approach &lt;/h1&gt;&lt;p&gt;Remember when you are designing a data contract that it is a schema, not an object model. This means that whilst the entities in your application are likely to use inheritance, this approach does not make sense for the generated schema you are creating. Always review your generated schema using svc util to ensure that the contracts create a clean WSDL with clean XSD schemas. &lt;/p&gt;&lt;h1&gt;Implement ordering in your data contracts &lt;/h1&gt;&lt;p&gt;Ordering is an optional parameter of the DataContractAttribute that controls the order of elements as they appear on the XSD schema that is produced as a result of designing a data contract. If you do not specify order, the schema will be generated in alphabetical order. The affect of this is that newly added elements do not necessarily appear at the end of the schema, which can make altering related artifacts (such as BizTalk maps) more problematic. &lt;/p&gt;&lt;h1&gt;Data contracts should define type, not business rules &lt;/h1&gt;&lt;p&gt;It is not an in built part of WCF of define validation rules within schema (the data contract), but I am commonly asked how to extend WCF data contracts to validate properties. The reason that WCF does not support XSD restrictions through data contracts out of the box is that implementing business rules through schema design is an expensive way to implement business rules, because if a rule changes, the schema must be changed, and thus calling clients must be made aware of the change. A better way to implement business rules is within the service implementation itself. The data contract should only define the types allowed to be used by the service. This way, changes in business rules do not affect contract designs and services become cheaper to maintain going forward.&lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=6690" width="1" height="1"&gt;</description><enclosure url="http://blogs.conchango.com/simonevans/attachment/6690.ashx" length="296835" type="application/x-zip-compressed" /><category domain="http://blogs.conchango.com/simonevans/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/BizTalk/default.aspx">BizTalk</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/Windows+Communcation+Foundation/default.aspx">Windows Communcation Foundation</category></item><item><title>Architecting web sites using Microsoft ASP.net AJAX</title><link>http://blogs.conchango.com/simonevans/archive/2007/03/09/Architecting-web-sites-using-Microsoft-ASP.net-AJAX.aspx</link><pubDate>Fri, 09 Mar 2007 13:55:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:6257</guid><dc:creator>simon.evans</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/6257.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=6257</wfw:commentRss><description>&lt;p&gt;Last Tuesday I conducted a presentation at the Microsoft Architect Insight Conference entitled &amp;quot;Architecting web sites using Microsoft ASP.net AJAX&amp;quot;. You can download the presentation below. &lt;/p&gt;&lt;p&gt;The aim of the presentation was to get attendees thinking about how they choose to architect aspects of their website with ASP.net AJAX. The presentation was conducted with demonstrations on client and server side data binding patterns, and client and server side authentication patterns. I will be making the code for this available shortly. &lt;/p&gt;&lt;p&gt;It was good&amp;nbsp;to see&amp;nbsp;that the web, user&amp;nbsp;experience and AJAX were well represented at this year&amp;#39;s event; all too often these subjects are not considered in terms of architectural considerations, which can easily lead to applications that perform or scale poorly.&lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=6257" width="1" height="1"&gt;</description><enclosure url="http://blogs.conchango.com/simonevans/attachment/6257.ashx" length="323337" type="application/x-zip-compressed" /><category domain="http://blogs.conchango.com/simonevans/archive/tags/Atlas/default.aspx">Atlas</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/ASP.net+2.0/default.aspx">ASP.net 2.0</category></item><item><title>Microsoft Architect Insight Conference 2007</title><link>http://blogs.conchango.com/simonevans/archive/2007/03/04/Microsoft-Architect-Insight-Conference-2007.aspx</link><pubDate>Sun, 04 Mar 2007 23:44:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:6196</guid><dc:creator>simon.evans</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/6196.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=6196</wfw:commentRss><description>&lt;p&gt;So, my blog has been pretty quiet of late. This is mainly due to work (and DIY!) commitments, but it is also due to the fact that I have busy preparing for my ASP.net AJAX tutorial for this years conference, which begins tomorrow (5&lt;sup&gt;th&lt;/sup&gt; March). &lt;/p&gt;&lt;p&gt;My session, entitled &amp;quot;Architecting web applications using Microsoft ASP.net AJAX&amp;quot; will cover some core architectural considerations in approaching the design and development of AJAX web sites. I will be basing my presentation on an application which I have developed to demonstrate these techniques. &lt;/p&gt;&lt;p&gt;Hopefully, I&amp;#39;ll see you there, but if you are not attending, in the next week or so, expect the following content to appear on my blog: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;The slide deck from the AIC presentation &lt;/li&gt;&lt;li&gt;A series of blog entries which diarize the development of the application I will be demonstrating &lt;/li&gt;&lt;li&gt;A free download of the application, including source code &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I am also going to be doing an ARCast tomorrow with Ron Jacobs, for broadcast at a later date on &lt;a href="http://www.skyscrapr.net"&gt;www.skyscrapr.net&lt;/a&gt;, covering some topics around ASP.net AJAX, amongst other things. &lt;/p&gt;&lt;p&gt;Plus, at some point soon, I will be posting several articles on WCF, which is currently my daily food of thought.&lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=6196" width="1" height="1"&gt;</description><category domain="http://blogs.conchango.com/simonevans/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/Atlas/default.aspx">Atlas</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/ASP.net+2.0/default.aspx">ASP.net 2.0</category></item><item><title>The importance of Windows Communication Foundation (WCF)</title><link>http://blogs.conchango.com/simonevans/archive/2006/09/05/How-to-configure-security-in-Windows-Communication-Foundation-_2800_WCF_2900_.aspx</link><pubDate>Tue, 05 Sep 2006 19:18:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:4479</guid><dc:creator>simon.evans</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/4479.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=4479</wfw:commentRss><description>&lt;p&gt;When I first gained knowledge that Microsoft were developing &amp;quot;Indigo&amp;quot; well over two years ago, I must confess, I missed the point. I first saw demos of WCF at a conference around that time, and my initial reaction was &amp;quot;show me something I can&amp;#39;t do already&amp;quot;. And yet three months into developing with WCF and I can&amp;#39;t stop praising the product. It is one of those rare beasts in technology that just feels so very right to use; and that is in itself a first in communication API&amp;#39;s. I don&amp;#39;t think anyone was truely happy with either ASMX web services, remoting or WSE.&lt;/p&gt;&lt;p&gt;But saying WCF is great because it feels right is underselling its importance. The real key to why WCF is so important is because the core programming model is neutral to the non functional requirements you have for communcation. This means that you can focus on designing your data and service contracts without having to make prior decisions on which transport, messaging or security protocols and policies you need to adopt.&lt;/p&gt;&lt;p&gt;A key part of successful software development is defined in the &lt;a href="http://en.wikipedia.org/wiki/Lean_software_development" target="_blank"&gt;Lean Software Development&lt;/a&gt; book, which is to &amp;quot;decide at the last responsible moment&amp;quot;. This concept states that making a decision too early is risky because you know too few facts to draw sensible conclusions, whereas making a decision too late could mean that you could delay whole parts of the project by doing so.&lt;/p&gt;&lt;p&gt;Using WCF supports making decisions at the last responsible moment, and this is a revolution for communications APIs. For example, selecting how you want to implement communication security becomes a matter of configuration; do you want to secure the communication by using a secure transport (such as HTTPS), or do you want to send the message over TCPIP and encrypt the message and use kerberos authentication? Now, this is just a matter of configuration.&lt;/p&gt;&lt;p&gt;Being able to just configure your service to your communication needs also enables another important scenario. It enables the development of &lt;a href="http://en.wikipedia.org/wiki/Domain_Specific_Language" target="_blank"&gt;Domain Specific Language&lt;/a&gt; tools (DSL) for your communication requirements. A DSL tool for WCF will enable you to use a rich tool to design and configure your service. This is the equivilent to being able to use the Windows Forms designer to design your forms; the increase in productivity is immense. There are already&amp;nbsp;some software factory assets available for WCF. Firstly, you can use the Visual Studio 2005 Class Designer to design you data and service contracts. Secondly, the &lt;a href="http://windowssdk.msdn.microsoft.com/en-us/library/ms732009.aspx" target="_blank"&gt;Service Configuration Editor&lt;/a&gt; enables you to manage your service configurations through a user interface. Finally, you can also get a great productivity boost from using the &lt;a href="http://www.gotdotnet.com/codegallery/codegallery.aspx?id=6fde9247-53a8-4879-853d-500cd2d97a83" target="_blank"&gt;WCF Service Factory&lt;/a&gt;, which is currently a community preview release.&lt;/p&gt;&lt;p&gt;The final benefit of WCF is not just in your initial communication design decisions, or in productivity. WCF also delivers major benefits when changes occur in your communication needs. I say when changes occur, because as software developers, we have to accept (even if it is painful) that change happens. So, think about what that would mean if you had a web service that you then needed to turn into something you would use over the LAN using TCP and binary? You would end up rewriting your code to use .Net remoting, which would be a costly excercise that you probably wouldn&amp;#39;t undertake, even if TCP and binary messages were the most suitable methods of communication.&lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=4479" width="1" height="1"&gt;</description><category domain="http://blogs.conchango.com/simonevans/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.conchango.com/simonevans/archive/tags/Windows+Communcation+Foundation/default.aspx">Windows Communcation Foundation</category></item><item><title>A brief guide to Microsoft technologies for business users</title><link>http://blogs.conchango.com/simonevans/archive/2006/09/04/A-brief-guide-to-Microsoft-technologies-for-business-users.aspx</link><pubDate>Mon, 04 Sep 2006 22:27:00 GMT</pubDate><guid isPermaLink="false">e847c0e7-38d9-45c0-b593-56747303e088:4462</guid><dc:creator>simon.evans</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.conchango.com/simonevans/comments/4462.aspx</comments><wfw:commentRss>http://blogs.conchango.com/simonevans/commentrss.aspx?PostID=4462</wfw:commentRss><description>&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Introduction&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Last June, my collegue &lt;a href="http://blogs.conchango.com/howardvanrooijen/archive/2006/06/23/ContinuousEducation.aspx"&gt;Howard van Rooijen&lt;/a&gt; blogged on the need for continuous education&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;in the .Net development world.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;This blog points out one very true fact in the Microsoft development space right now; technologies are diverging and becoming more and more specialized to meet specific needs. As Howard points out, this means as developers we are required to learn an increasing number of technologies to deliver a best of breed end to end solution.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Now this can only be a good thing for business. I am a strong believer that any machine that is focused a single function well is a good thing if you are interesting in delivering the best results. However, this also means that the challenge for individuals in the business community is at least as high as those in the technology community. Whilst developers must understand the terms of the business they are developing in, it is equally important that business users understand the ramifications of technologies that developers are keen in implement.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;So this blog tries to explain (in short) how Microsoft&amp;#39;s increasingly rich set of technologies relates to common problems that people need to solve in the business world.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;It&amp;#39;s all in the presentation (AKA the user interface)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;So I&amp;#39;ll start with the item that is easiest to relate to for most users: the user interface. Why is it easiest to relate to/? Because it&amp;rsquo;s the part of your PC that you interact with; the part you see.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;table cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse:collapse;border:medium none;"&gt;&lt;tr&gt;&lt;td style="padding-right:5.4pt;padding-left:5.4pt;padding-bottom:0cm;width:88.55pt;padding-top:0cm;background-color:transparent;border:windowtext 1pt solid;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Technology&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;What does it do?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Why is it important?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Latest Version&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Associated technologies&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;ASP.net&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Enables you to present information maintained by a business on a web page viewable by a browser. (See SQL Server to see how information in maintained).&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;It enables you to expose your business on the internet or intranet. This means that the users only need a browser installed on their computer to view your information, and they are not tied into an operating system to view the business information.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;ASP.net 2.0 (part of .Net Framework 2.0)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;HTML, CSS Javascript&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Atlas&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;An extension of ASP.net, it enables you to present information without having to refresh the entire web page. This reduces page &amp;quot;flicker&amp;quot; and improves the user experience.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Core to the marketing term &amp;quot;Web 2.0&amp;quot;, it enables you to provide rich user experiences across browsers (and operating systems) to reach the widest possible audience in the most interactive manner.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Atlas July CTP (production release not yet delivered)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;AJAX&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;, ASP.net&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Windows Forms&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Enables you to present information maintained by business in a native Windows application.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;It used to be the case that a core reason was user experience, but this is being squeezed between Atlas and WPF. However, using Windows Forms still provides you with a decent user experience that can work offline, and it has lower hardware requirements than WPF.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Windows Forms 2.0 (part of .Net Framework 2.0)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Windows Presentation Foundation (WPF)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Provides the richest possible user experience on the Windows platform only, incorporating the use of 3D graphics and other advanced effects&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Best of breed user experience for Windows applications.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;WPF July CTP (production release not yet delivered)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;XAML&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server Reporting Services&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Provides a mechanism for generating reports from information managed by a business.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Enables you to quick design and generate reports which can be viewed by business decision makers.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server 2005&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;My business is my information (AKA the database)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;table cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse:collapse;border:medium none;"&gt;&lt;tr&gt;&lt;td style="padding-right:5.4pt;padding-left:5.4pt;padding-bottom:0cm;width:88.55pt;padding-top:0cm;background-color:transparent;border:windowtext 1pt solid;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Technology&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;What does it do?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Why is it important?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Latest Version&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Associated technologies&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server (Core Product)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Enables you to maintain large business critical stores of information, where new and updated information is managed.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;It provides the backbone store to a businesses critical information, providing safeguards on the information in terms of security, recovery, maintenance and reliability, whilst being able to scale to large business volumes.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server 2005&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL, OLTP&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server Analysis Services&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Enables you to store information in a fashion most suitable for analysis (where the information does not change).&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;In large enterprises it manages key information for business decision makers.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server 2005&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;OLAP&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server Integration Services&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Enables you to import large quantities of information into a database.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;It provides a mechanism to move large bulks of information into or out of a database.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server 2005&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;ETL&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server Express&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Enables you the maintain small lightweight stores of information, where new and updated information is managed.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;It provides a free light weight store to maintain information in small amounts, such as information maintained in an offline client (see smart client).&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL Server 2005 Express&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;SQL, OLTP&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;It takes two to tango (AKA communication)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Before I list these technologies, there are a few techie terms that have to be explained:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;table cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse:collapse;border:medium none;"&gt;&lt;tr&gt;&lt;td style="padding-right:5.4pt;padding-left:5.4pt;padding-bottom:0cm;width:221.4pt;padding-top:0cm;background-color:transparent;border:windowtext 1pt solid;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Term&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:221.4pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Meaning&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:221.4pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Message&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:221.4pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Any message that is transmitted from one point to another.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:221.4pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Transport&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:221.4pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;How a message is transported from one place to another.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:221.4pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Endpoint&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:221.4pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;What the message&amp;#39;s destination is.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;table cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse:collapse;border:medium none;"&gt;&lt;tr&gt;&lt;td style="padding-right:5.4pt;padding-left:5.4pt;padding-bottom:0cm;width:88.55pt;padding-top:0cm;background-color:transparent;border:windowtext 1pt solid;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Technology&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;What does it do?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Why is it important?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Latest Version&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Associated technologies&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Windows Communication Foundation (WCF)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Enables two or more systems to communicate with each other in any known standard of message format, over any known transport to any endpoint.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Because it means that the business requirements over issues like security and reliability in communications do not alter the design of the communications system. WCF removes the need to understand any of the technologies below (although the principles remain just as important!)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;WCF July CTP (production release not yet delivered)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:#ebe9ed;width:88.6pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:transparent;"&gt;&lt;p style="margin:0cm 0cm 0pt;"&gt;&lt;span style="font-size:10pt;font-family:Verdana;"&gt;Web Services, WS-*, MSMQ, Remoting, TCPIP, HTTP&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:#ebe9ed;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:88.55pt;padding-top:0cm;border-bottom:windowtext 1pt solid;background-color:tr