<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Stephen Kaufman's WebLog</title><link>http://blogs.msdn.com/b/skaufman/</link><description>Look who's BizTalk'in - Notes on all things integration</description><dc:language>en-US</dc:language><generator>Telligent Community 5.6.583.20496 (Build: 5.6.583.20496)</generator><item><title>Can you move a Virtual Machine from VirtualPC to Hyper-V?</title><link>http://blogs.msdn.com/b/skaufman/archive/2012/01/18/can-you-move-a-virtual-machine-from-virtualpc-to-hyper-v.aspx</link><pubDate>Thu, 19 Jan 2012 00:31:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10258271</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=10258271</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2012/01/18/can-you-move-a-virtual-machine-from-virtualpc-to-hyper-v.aspx#comments</comments><description>&lt;p&gt;I was recently asked if I could help move a virtual machine that had been setup and running in VirtualPC and move it to run under Hyper-V.&amp;#160; &lt;/p&gt;  &lt;p&gt;The answer is yes it can be done.&amp;#160; Movement from Hyper-V to VirtualPC is not as easy (and many times not possible) but there are a number of blog posts on this topic already so I won’t cover that here.&amp;#160; One of the reasons that it is easier to move from VirtualPC to Hyper-V is that VirtualPC is only 32 bit.&amp;#160; &lt;/p&gt;  &lt;p&gt;There are a number of steps that must be occur for a successful move. &lt;/p&gt;  &lt;p&gt;First, start by uninstalling the integration components while the virtual machine is running in VirtualPC.&amp;#160; You can do this through the Add/Remove programs feature in Windows in the Virtual Machine.&amp;#160; The Hyper-V drivers and additions will not install over the VirtualPC additions and that is why you must remove them first.&lt;/p&gt;  &lt;p&gt;Next, move the vhd file to a location where it can be accessed by your Hyper-V instance.&amp;#160; Walk through the wizard to create a new virtual machine but when prompted to create a new drive or select and existing drive, pick select an existing drive and point it to your .vhd file.&lt;/p&gt;  &lt;p&gt;Finally, once you have the virtual machine configured in your Hyper-V instance then start the machine.&amp;#160; Go through the Settings Menu and install the Hyper-V additions.&amp;#160; Once you do this, the Hyper-V additions installs a new HAL as well as new drivers for network, video and sound devices.&amp;#160; The process of installing the new HAL is one of the reasons that a Hyper-V image is no longer portable back to VirtualPC.&lt;/p&gt;  &lt;p&gt;However, at this point, you might think that everything is done and you are ready to use the virtual machine.&amp;#160; Most of the time this is correct, however, there are situations that require additional steps.&amp;#160; You will know that you have additional steps if your integration components aren’t working – you can tell really quickly if your mouse doesn’t move outside of the virtual machine.&lt;/p&gt;  &lt;p&gt;You are more likely to have this occur if your virtual machine is running versions of Windows prior to Vista or if you are running Windows Server 2008 as these do not have the ability to dynamically detect the HAL at boot time.&lt;/p&gt;  &lt;p&gt;So, to fix this run MSConfig.exe – by clicking the Start menu, selecting Run and typing msconfig.&amp;#160; Once the utility launches, click on the Boot tab and click the Advanced Options Button.&amp;#160; When the BOOT Advanced Options dialog appears, click the Detect HAL checkbox and hit ok.&amp;#160; Restart the virtual machine and you should be good to go!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10258271" width="1" height="1"&gt;</description></item><item><title>Composite Applications</title><link>http://blogs.msdn.com/b/skaufman/archive/2011/03/16/composite-applications.aspx</link><pubDate>Wed, 16 Mar 2011 20:49:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10142306</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=10142306</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2011/03/16/composite-applications.aspx#comments</comments><description>&lt;p&gt;It has been a long time since my last blog post.&amp;#160; It certainly hasn’t been for a lack of content but it is amazing how fast time flies when you are busy.&amp;#160; I have been spending a lot of time lately working on composite applications and will be posting a number of entries around this topic.&lt;/p&gt;  &lt;p&gt;One of the first questions that people ask is what is a composite app?&amp;#160; &lt;/p&gt;  &lt;p&gt;Composite apps can take on many forms and use many differing technologies.&amp;#160; Many times people will talk about composite Apps and will only be referring to the UI tier.&amp;#160; While the concept of a UI composite can be compared to a mashup (a UI that combines publically available web based services to create a meaningful combination of information to a user) a UI composite is built to use business sources – in many scenarios these sources (assets) already exist within the organization from previous application development efforts.&amp;#160; &lt;/p&gt;  &lt;p&gt;A composite app can also refer to just the middle tier as well.&amp;#160; Many companies have spend a lot of time and money over the past many years building out SOA services.&amp;#160; A composite app can consist of orchestration services that draw on the functionality of these different services.&amp;#160; One thing to keep in mind however, is that a composite app is not make a SOA architecture.&amp;#160; Instead they they will build on top of the work that has already been done to create a SOA architecture.&amp;#160; &lt;/p&gt;  &lt;p&gt;The idea of a composite app is to build upon existing software assets to quickly bring data to consumers in new way.&amp;#160; &lt;/p&gt;  &lt;p&gt;Many of the articles and blogs on this subject talk a lot around the UI tier.&amp;#160; While that is a very important part of a composite application, I am going to spend time over the next few posts talking about composites at the middle tier.&lt;/p&gt;  &lt;p&gt;There is a very good all-up article titled &lt;a href="http://msdn.microsoft.com/en-us/library/bb220803.aspx"&gt;What Are Composite Applications&lt;/a&gt; from &lt;a href="http://blogs.msdn.com/b/atanu/"&gt;Atanu Banerjee&lt;/a&gt; where he walks through the full composite application stack.&amp;#160; In this article he outlines three steps that a solution architect must do to design a composite application.&amp;#160; Those things are to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Choose a composition stack.&lt;/strong&gt; Pick one or more containers from each tier, and a set of component types that are deployable into those containers. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Choose components.&lt;/strong&gt; Define the repository of assets that must be built from this set of component types, based on business needs. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Specify the composite application.&lt;/strong&gt; Define the ways in which those assets will be connected, to provide a particular cross-functional process. The platform should enable these connections to be loosely coupled. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Each of these things are required so that the consumer can get the most benefit.&amp;#160; Over and above this, the organization should start to benefit by realizing faster time-to-benefit turnaround as well as faster time-to-deployment.&amp;#160; These two, along with exposing existing LOB data are the three driving factors that are making the idea of composite applications so popular.&lt;/p&gt;  &lt;p&gt;In my next several posts, I will cover some of the technical choices, how to bring bridge between services that live in BizTalk and services that live in AppFabric, and some of the lessons learned. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10142306" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WF/">WF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/AppFabric/">AppFabric</category></item><item><title>Twin Cities Connected Systems User Group Meeting–March 17th, 2011</title><link>http://blogs.msdn.com/b/skaufman/archive/2011/03/16/twin-cities-connected-systems-user-group-meeting-march-17th-2011.aspx</link><pubDate>Wed, 16 Mar 2011 15:39:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10142105</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=10142105</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2011/03/16/twin-cities-connected-systems-user-group-meeting-march-17th-2011.aspx#comments</comments><description>&lt;p&gt;If you are in Minneapolis on Thursday March 17th please join us for the Twin Cities Connected Systems User Group Meeting.&lt;/p&gt;  &lt;p&gt;The meeting takes place at 6:00 p.m. at the Microsoft offices at 8300 Norman Center Drive, Bloomington, MN 55437.&lt;/p&gt;  &lt;p&gt;Andy Morrison will be presenting on a Lap Around BizTalk 2010 and the ESB Toolkit 2.1&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10142105" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BTS+User+Group/">BTS User Group</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>Twin Cities Connected Systems User Group Meeting – September 16th, 2010</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/09/10/twin-cities-connected-systems-user-group-meeting-september-16th-2010.aspx</link><pubDate>Fri, 10 Sep 2010 17:16:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10060383</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=10060383</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/09/10/twin-cities-connected-systems-user-group-meeting-september-16th-2010.aspx#comments</comments><description>&lt;p&gt;If you are in Minneapolis on Thursday September 16th please join us for the Twin Cities Connected Systems User Group Meeting.&lt;/p&gt;  &lt;p&gt;The meeting takes place at 6:00 p.m. at the Microsoft offices at 8300 Norman Center Drive, Bloomington, MN 55437.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/ekraus/"&gt;Eric Kraus&lt;/a&gt; and I will be speaking on: Composite Applications: Connecting and Building Workflow Applications&lt;/p&gt;  &lt;p&gt;Here is the write-up:&lt;/p&gt;  &lt;p&gt;Come learn about Composite Applications and how you can build chunks of functionality in different loosely-coupled technologies that can be used to make up a larger collective solution.&amp;#160; We will discuss how you can use SharePoint, BizTalk, Windows Server AppFabric, .NET and the LOB Adapters to build these chunks of functionality as well as the applications that consume them.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10060383" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WF/">WF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BTS+User+Group/">BTS User Group</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/AppFabric/">AppFabric</category></item><item><title>Storing Application Configuration Information in SSO</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/08/31/storing-application-configuration-information-in-sso.aspx</link><pubDate>Tue, 31 Aug 2010 15:59:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10056338</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=10056338</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/08/31/storing-application-configuration-information-in-sso.aspx#comments</comments><description>&lt;p&gt;For those using BizTalk, we have long had the need to store configuration information in a central location that is shared between each of the distributed BizTalk instances.&amp;#160; BizTalk itself uses SSO for all of its internal configuration information.&amp;#160; Unfortunately, we have not had a tool that allows us to take advantage of this functionality.&amp;#160; Currently, in SSO there are three different utilities to perform SSO based tasks.&amp;#160; These are the SSOConfig, SSOManage and the SSOClient utilities.&amp;#160; All of these tools focus on managing credentials.&lt;/p&gt;  &lt;p&gt;There has been a lack of tooling for the ability to create and manage configuration based applications.&amp;#160; This has now changed with the creation of the SSO Configuration MMC Snap-In.&amp;#160; This tool is an MMC based utility that allows developers to store name/value pairs in the the SSO configuration database.&amp;#160; The tool can be downloaded from the &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=94e07de1-1d33-4245-b430-9216979cd587"&gt;Microsoft downloads site&lt;/a&gt; and includes three parts.&amp;#160; &lt;/p&gt;  &lt;p&gt;These are the MMC management tool, a C# class file that provides the code necessary to access and read the configuration information and lastly, an automated MSBuild task to use for deployment of your configuration information.&lt;/p&gt;  &lt;p&gt;The MMC Snap-In provides an easy to use interface that allows you to add and manage applications, add and manage key value pairs as well as importing and exporting (in an encrypted format) configuration applications so that they can be deployed to different environments.&lt;/p&gt;  &lt;p&gt;The C# client class can be used in your application or helper assembly to read the values stored in SSO.&lt;/p&gt;  &lt;p&gt;And lastly, there is the MSBuild custom task that can be used to automate the deployment of your applications SSO configuration data.&amp;#160; All that you need to do is export the application and use the MSBuild task to automatically import your settings into your new environment.&lt;/p&gt;  &lt;p&gt;After all of this you might be asking “Why would you want to store your configuration data in SSO?”.&amp;#160;&amp;#160;&amp;#160; Well, middle tier server based applications have the need to utilize configuration data that needs to be able to be read at runtime and changed without compiling.&amp;#160; These applications also need the ability to have centrally managed and non repeated configuration information be available to all hosts in the middle tier.&amp;#160; Typically, middle tier applications implement a custom solution and the architects/developers need to create a means to replicate this information to servers when a scale out solutions are implemented.&amp;#160; Instead, this configuration can be stored directly in SSO and since SSO is already accessible to all servers in a scale out solution, we can take advantage of tools that we already use instead of creating custom solutions.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10056338" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>Using The Windows Server AppFabric Cache with ASP.NET</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/08/30/using-the-windows-server-appfabric-cache-with-asp-net.aspx</link><pubDate>Mon, 30 Aug 2010 14:53:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10055815</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=10055815</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/08/30/using-the-windows-server-appfabric-cache-with-asp-net.aspx#comments</comments><description>&lt;p&gt;It appears that I have lost some of my blog posts.&amp;nbsp; I am reposting this blog post which originally appeared back in May.&lt;/p&gt;
&lt;p&gt;Did you know that you can use the AppFabric Cache with ASP.NET?&amp;nbsp; AppFabric Cache provides an ASP.NET session state provider.&amp;nbsp; There are a number of reasons that you would want to consider using the AppFabric Cache instead of other caching technologies, including the built in ASP.NET caching. &lt;/p&gt;
&lt;p&gt;The AppFabric Cache provides a number of benefits to ASP.NET programmers.&amp;nbsp; When web applications need to maintain state, especially across a Web Farm, or needs to maintain objects across restarts AppFabric Cache provides the out of process, distributed highly available functionality you require.&amp;nbsp; In addition, because of the distributed nature of the cache you no longer need to worry about sticky routing (getting the client back to the same machine as their cached objects).&amp;nbsp; You also no longer need to add additional code and incur the overhead of storing state in a database.&amp;nbsp; By keeping activity oriented objects closer to the consuming logic you can eliminate the overhead and increase performance of your application.&lt;/p&gt;
&lt;p&gt;To utilize the AppFabric Cache ASP.NET session state provider open your applications' Web.Config file and enter the following XML fragment.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;sessionState&lt;/span&gt; &lt;span class="attr"&gt;mode&lt;/span&gt;&lt;span class="kwrd"&gt;="Custom"&lt;/span&gt; &lt;span class="attr"&gt;customProvider&lt;/span&gt;&lt;span class="kwrd"&gt;="SessionStoreProvider"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;providers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="SessionStoreProvider"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider,&amp;nbsp; Microsoft.ApplicationServer.Caching.Client, Version=1.0.0.0, Culture=neutral,&amp;nbsp; PublicKeyToken=31bf3856ad364e35"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;providers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;sessionState&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;

&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10055815" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/AppFabric/">AppFabric</category></item><item><title>Tagging Objects in the AppFabric Cache</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/04/22/tagging-objects-in-the-appfabric-cache.aspx</link><pubDate>Fri, 23 Apr 2010 03:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10001250</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=10001250</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/04/22/tagging-objects-in-the-appfabric-cache.aspx#comments</comments><description>&lt;P&gt;In two of my previous entries I outlined functionality and patterns used in the AppFabric Cache.&amp;nbsp; In this entry I wanted to expand and look at another area of functionality that people have come to expect when working with cache technology.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;This expectation is the ability to tag content with more information than just the key.&amp;nbsp; As you start to examine this expectation you will soon find yourself asking if the tagged data can be related to each other and finally if it is possible to remove the related data.&lt;/P&gt;
&lt;P&gt;One of the nice things about the AppFabric Cache is that it is so easy to work with and can be so simple.&amp;nbsp; Then, if needed, like with this topic, you can take advantage of the addition functionality.&amp;nbsp; This is where the real benefits of AppFabric Cache come into play over the other cache alternatives.&lt;/P&gt;
&lt;P&gt;Lets take a deeper look at tagging.&amp;nbsp; Tagging is essentially assigning one or more string values to an object contained in the cache.&amp;nbsp;&amp;nbsp; The object in the cache can then be retrieved by using the tag or multiple tags.&amp;nbsp;&amp;nbsp; When you tag an object, all of the tagged objects will reside within a region.&amp;nbsp; A region is an additional container inside the cache.&amp;nbsp; Because regions are optional, if you want to use them you need to explicitly create them at runtime within your application code.&amp;nbsp; You can setup different regions for different types of related data.&amp;nbsp; When you utilize regions, you have the option to retrieve all objects in that region and therefore by default have setup a solution that now provides you access to all the dependent data.&amp;nbsp; We can take this one step further in that you can also delete all of the data within a region and not have to worry about looping through all entries to find the specific keys and their dependencies.&lt;/P&gt;
&lt;P&gt;As an example we could create a region called 'Beverages' and then we could cache all of the beverages we sell and tag each item by the type of beverage such as Soft Drink, Wine, Beer.&amp;nbsp; We could even go one step further and provide multiple tags so that we could further segment the Wine category into White or Red or Merlot, Zinfandel, Riesling, etc.&amp;nbsp; At this point the application could retrieve all of the catalog items based on the search criteria that were entered.&lt;/P&gt;
&lt;P&gt;Lets look at how we can setup the region and tags.&amp;nbsp; We will also look at the methods that are available to interact with objects using tags and lastly, how we can manage the data in the cache; adding, retrieving and deleting.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Setting Up a Region&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P&gt;The code that follows assumes that you already now how to create a cache (either through code or through the PowerShell cmdlets (as found in my previous post &lt;A href="http://blogs.msdn.com/skaufman/archive/2010/03/31/calling-powershell-from-net.aspx" mce_href="http://blogs.msdn.com/skaufman/archive/2010/03/31/calling-powershell-from-net.aspx"&gt;here&lt;/A&gt;)).&lt;/P&gt;
&lt;P&gt;To create a region we already need to have the cache created.&amp;nbsp; Once that is done, we can pass in the cache name, use the GetCache method and then call the CreateRegion method passing in a region name.&amp;nbsp; We can create as many regions as we need based on the manner in which you wish to segment the data.&amp;nbsp; One thing to keep in mind however is that there can be performance implications when using regions.&amp;nbsp; The code below shows how we can create the region.&lt;/P&gt;&lt;FONT size=2 face=Consolas&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;private&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;void&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; CreateRegion(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; CacheName, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; RegionName)&lt;BR&gt;{&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //This can also be kept in a config file&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; config = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactoryConfiguration&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.Servers = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Environment&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.MachineName, 22233)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dcf = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(config);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;if&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (dcf != &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dataCache = dcf.GetCache(CacheName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataCache.CreateRegion(RegionName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&amp;nbsp;Now that we have a cache with a region created lets look at the methods that are available to interact with tags&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Methods to work with tagging (from MSDN):&lt;/STRONG&gt;&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH&gt;Method &lt;/TH&gt;
&lt;TH&gt;Description &lt;/TH&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache.getobjectsbytag.aspx" mce_href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache.getobjectsbytag.aspx"&gt;GetObjectsByTag&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Provides a simple way to access objects that contain tags (exact match, intersection, or union). The region name is a required parameter.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache.getobjectsbyanytag.aspx" mce_href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache.getobjectsbyanytag.aspx"&gt;GetObjectsByAnyTag&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Returns a list of objects that have tags matching any of the tags provided in the parameter of this method.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache.getobjectsbyalltags.aspx" mce_href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache.getobjectsbyalltags.aspx"&gt;GetObjectsByAllTags&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Returns a list of objects that have tags matching all of the tags provided in the parameter of this method.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache.getobjectsinregion.aspx" mce_href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache.getobjectsinregion.aspx"&gt;GetObjectsInRegion&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Returns a list of all objects in a region. This method is useful when you do not know all the tags used in the region.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ff424965.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ff424965.aspx"&gt;GetCacheItem&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;Returns a &lt;A href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacacheitem.aspx" mce_href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacacheitem.aspx"&gt;DataCacheItem&lt;/A&gt; object. In addition to the cached object and other information associated with the cached object, the &lt;STRONG&gt;DataCacheItem&lt;/STRONG&gt; object also includes the associated tags.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ff424901.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ff424901.aspx"&gt;Add&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;When adding an object to cache, this method supports associating tags with that item in the cache.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ff424971.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ff424971.aspx"&gt;Put&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;When putting an object into cache, this method can be used to replace tags associated with a cached object.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/ff424930.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ff424930.aspx"&gt;Remove&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;This method deletes the cached object and any associated tags.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;&lt;STRONG&gt;Managing the data in the cache&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;There are a number of methods to get objects out of the cache but logically I like to start in terms of adding to the cache first.&amp;nbsp; So, lets take a look at the put method.&amp;nbsp; The put method will update an object that already has a key that is contained in the cache (whereas the Add will return an exception if the key is already present).&amp;nbsp; The put method can also update or add new tags to an existing object in the cache.&amp;nbsp; As we look at the Put method signature below we can see that this version of the method accepts the key and value just as the other overrides of the Put method do but this one also adds on a collection of tags as well as the name of the region that the cached item will reside in.&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; DataCacheItemVersion Put (&lt;BR&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; key,&lt;BR&gt;Object value,&lt;BR&gt;IEnumerable&amp;lt;DataCacheTag&amp;gt; tags,&lt;BR&gt;&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; region&lt;BR&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The code below shows how we can use the Put method and include multiple tags&lt;/P&gt;&lt;FONT size=2 face=Consolas&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;private&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;void&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; InsertCacheObjectWithTag(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; CacheName, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; RegionName)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;//This can also be kept in a config file&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; config = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactoryConfiguration&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.Servers = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Environment&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.MachineName, 22233)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dcf = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(config);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;if&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (dcf != &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheTag&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt; tags = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheTag&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheTag&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Wine"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheTag&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Red"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheTag&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Merlot"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dataCache = dcf.GetCache(CacheName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataCache.Put(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"WineKey"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"WineValue"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;, tags, RegionName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;Now we can look at the methods to retrieve objects.&amp;nbsp; There are four main Get methods.&amp;nbsp; We can get by tag, any tag, all tags and finally any object that exists in the region no matter what tag.&amp;nbsp; The GetObjectsInRegion method is what provides us the ability to implement a scenario in which all cached objects are related and can be treated as a group.&amp;nbsp; The related data can also be removed by called dataCache.RemoveRegion(RegionName) just as we called the CreateRegion method above.&lt;/P&gt;
&lt;P&gt;For people that have been working with Memcached you can delete dependent data through the cas (check and set) operation.&amp;nbsp; The reason that I bring this up is that more people are familiar with Memcached and therefore I am asked if AppFabric Caching has this or that functionality.&amp;nbsp; What I am finding is that it has the same functionality and more.&amp;nbsp; It is just implemented a bit differently.&lt;/P&gt;
&lt;P&gt;Anyways, if we want to retrieve all the objects in the cache that have a Wine tag we can use the GetObjectsByTag as shown below:&lt;/P&gt;&lt;FONT size=2 face=Consolas&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;public&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;IEnumerable&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;KeyValuePair&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;object&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt;&amp;gt; GetLookUpCacheDataByTag(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; TagValue)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; config = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactoryConfiguration&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.Servers = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Environment&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.MachineName, 22233)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dcf = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(config);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; cache = dcf.GetCache(cacheName);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheTag&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dct = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheTag&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(TagValue);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;return&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; cache.GetObjectsByTag(dct, regionName);&amp;nbsp; //regionName could either be passed in or an internal variable&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;and lastly, we can remove items based on a tag.&amp;nbsp; I already mentioned that we can call the RemoveRegion method to remove all the related data that is grouped together in a region.&amp;nbsp; If there is a specific item that you want removed then you can call the Remove method and pass in the key.&amp;nbsp; If you wanted to delete based on a tag value then you would have to call one of the GetXXX methods, obtain the key, and then call the Remove method by passing the returned key value.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10001250" width="1" height="1"&gt;</description></item><item><title>Pre-Populate the AppFabric Cache</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/04/07/pre-populate-the-appfabric-cache.aspx</link><pubDate>Wed, 07 Apr 2010 19:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9991952</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9991952</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/04/07/pre-populate-the-appfabric-cache.aspx#comments</comments><description>&lt;P&gt;When I start talking to people about the caching functionality that is part of Windows Server AppFabric I am usually asked "What is the AppFabric Cache?"&amp;nbsp; The MSDN page at &lt;A href="http://msdn.microsoft.com/en-us/library/ee790954.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ee790954.aspx"&gt;http://msdn.microsoft.com/en-us/library/ee790954.aspx&lt;/A&gt; provides a great overview (below) as well as additional information.&amp;nbsp; The Cache is defined as:&lt;/P&gt;
&lt;P&gt;"Windows Server AppFabric caching features use a cluster of servers that communicate with each other to form a single, unified application cache system. As a distributed cache system, all cache operations are abstracted to single point of reference, referred to as the cache cluster. In other words, your client applications can work with a single logical unit of cache in the cluster regardless of how many computers make up the cache cluster. "&lt;/P&gt;
&lt;P&gt;When you develop against the AppFabric Cache you utilize the cache-aside pattern.&amp;nbsp; This pattern outlines the steps in which the application will first check to see if the data is in the cache.&amp;nbsp; If not, then query a database (or other data source), load the cache, then return the value.&amp;nbsp; The idea is that the cache will be populated over time as instances of the application call for data.&amp;nbsp; The AppFabric Cache comes with a number of options around how long data should remain in the cache and provides you the flexibility to tune the performance to your needs.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;One thing that the cache-aside pattern doesn't provide for is the pre-population of data in the cache.&amp;nbsp; This entry will walk through how we can provide this functionality.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The first thing we need to do is to create the cache.&amp;nbsp; I outline how to create a cache in .NET code in my previous &lt;A href="http://blogs.msdn.com/skaufman/archive/2010/03/31/calling-powershell-from-net.aspx" mce_href="http://blogs.msdn.com/skaufman/archive/2010/03/31/calling-powershell-from-net.aspx"&gt;entry&lt;/A&gt;.&amp;nbsp; You can check that out but I will also include the code in the sample below.&amp;nbsp; As you go about creating the cache you also need to decide if you want eviction to occur and if so how long the data will stay in the cache until it is evicted.&amp;nbsp; For this example I am going to setup the cache so that eviction is turned off (Expirable is set to false).&amp;nbsp; Since I am preloading the cache I want to the data to remain in the cache.&amp;nbsp; If I read your mind, the next question will be how will the code handle when new data is entered into the database.&amp;nbsp; Through the use of the SQL Dependency functionality we can setup an event handler to respond when an event is raised when there is a change at the database layer.&amp;nbsp; Once this event is caught we can empty the cache and reload it.&amp;nbsp; We could also add code to take advantage of the cache-aside pattern and if we don't the data in the cache then query the database and populate the cache on demand.&lt;/P&gt;
&lt;P&gt;As we look at the code example below lets jump directly to the &lt;FONT size=2 face=Consolas&gt;PopulateLookUpCache&lt;/FONT&gt; method.&amp;nbsp; The first part of this method sets up the database connection, the SQL Dependency and loads the data into a dataset.&amp;nbsp; The second part of the method focuses on the loading of the cache.&amp;nbsp; This is the part that we will focus on.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Before we can use the cache we need to create an instance of the DataCacheFactory. This object requires configuration information.&amp;nbsp; This can either be through entries in a config file as shown below:&amp;nbsp;&lt;/P&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;
&lt;P&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;dataCacheClient&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;hosts&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;host&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2 face=Consolas&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;=&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;AppFabricBeta2&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2 face=Consolas&gt;cachePort&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;=&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;22233&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt; /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;hosts&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;localCache&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2 face=Consolas&gt;isEnabled&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;=&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;true&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2 face=Consolas&gt;sync&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;=&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;TTLBased&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2 face=Consolas&gt;objectCount&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;=&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;100000&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2 face=Consolas&gt;ttlValue&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;=&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;300&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt; /&amp;gt;&lt;BR&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;dataCacheClient&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;or through code by creating a DataCacheFactoryConfiguration object and passing it to the DataCacheFactory as shown below:&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; config = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactoryConfiguration&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;config.Servers = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt; &lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Environment&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.MachineName, 22233)&lt;BR&gt;};&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dcf = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(config);&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;We can now call the GetCache method which will return a cache object based on the name of the cache that is passed into the method.&amp;nbsp; The Cache object has a number of &lt;A href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache_members(WS.10).aspx" mce_href="http://msdn.microsoft.com/en-us/library/microsoft.applicationserver.caching.datacache_members(WS.10).aspx"&gt;methods&lt;/A&gt; which allow us to interact with the cache.&amp;nbsp; I use the Put method as the Put will add or replace an object in the cache whereas the Add method only adds an entry.&amp;nbsp; If there is already an object in the cache it will return an exception.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In the code below, I loop through the DataSet and call the Put method to populate the cache.&amp;nbsp; The Put method takes two parameters.&amp;nbsp; The first is the key that will be used and the second is the value.&amp;nbsp; In this case, since I am using the AdventureWorks sample database, the Products table contains the product id and the product which works very nicely for this example.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Once the loop has been executed and the data is now in the cache we can double check that the cache has been populated through the use of a PowerShell cmdlet.&amp;nbsp; Switch to a PowerShell command window and type in (without the quotes) "Get-CacheStatistics -CacheName &amp;lt;your cache name&amp;gt;" and hit enter.&amp;nbsp; This will return a list of attributes related to the cache and will show you how many items are currently in the cache.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;We now have a populated cache and a now can use the &lt;FONT size=2 face=Consolas&gt;GetLookUpCacheData&lt;/FONT&gt; method to read data out of the cache for our application.&amp;nbsp; Take a look at the code below to see how all of this was done as well as how to setup the SQL Dependency code to get events.&amp;nbsp;&amp;nbsp; As always this code is provided as is and there are a number of places that should be refactored - such as the repeating DataCacheFactory objects.&lt;/P&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;
&lt;P&gt;using&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; System;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;using&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; System.Collections.Generic;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;using&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; System.Linq;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;using&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; System.Text;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&lt;BR&gt;using&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; System.Data.SqlClient;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&lt;BR&gt;using&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; System.Data;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&lt;BR&gt;using&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; Microsoft.ApplicationServer.Caching;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&lt;BR&gt;using&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; System.Management.Automation;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;using&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; System.Management.Automation.Runspaces;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&lt;BR&gt;namespace&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; AppFabricCacheWrapper&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;public&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;class&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;CacheHelper&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; : &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;IDisposable&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;private&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;static&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataSet&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; lookUpDataset = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;private&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; connString = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;private&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; cacheName = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"PreLoadSampleCache"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;public&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; CacheHelper()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connString = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Data Source=(local);Initial Catalog=AdventureWorksLT;Integrated Security=SSPI;"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlDependency&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.Start(connString);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateCache(cacheName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PopulateLookUpCache(cacheName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~CacheHelper()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlDependency&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.Stop(connString);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dispose(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;false&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;public&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;void&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; Dispose()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dispose(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;true&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;GC&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.SuppressFinalize(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;this&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;protected&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;virtual&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;void&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; Dispose(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;bool&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; disposing)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; GetLookUpCacheData(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; keyValue) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; config = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactoryConfiguration&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.Servers = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Environment&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.MachineName, 22233)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dcf = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(config);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; cache = dcf.GetCache(cacheName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; data = cache.Get(keyValue) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;as&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;if&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (data == &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;//Determine if you are going to query the database&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;return&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; data;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#808080 size=2 face=Consolas&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2 face=Consolas&gt;&amp;lt;summary&amp;gt;&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2 face=Consolas&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt; Retrieves look up data for the given key and type from database&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2 face=Consolas&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2 face=Consolas&gt;&amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;private&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;void&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; PopulateLookUpCache(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; CacheName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlConnection&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; conn = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlCommand&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; comm = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlCommand&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; commDependency = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlDataAdapter&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; sqlAdapter = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;; &lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //populate DataSet &lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;{ &lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Connect to look up database and retrieve the names of the products. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;conn = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlConnection&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(connString); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open(); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; comm = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlCommand&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; comm.Connection = conn; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; comm.CommandText = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"select ProductID, Name from SalesLT.Product"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; comm.CommandType = &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;CommandType&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.Text; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;if&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (lookUpDataset == &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lookUpDataset = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataSet&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;else &lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lookUpDataset.Clear(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sqlAdapter = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlDataAdapter&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(comm);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sqlAdapter.Fill(lookUpDataset);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;//Command object used for subscribing to notifications &lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commDependency = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlCommand&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commDependency.Connection = conn;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commDependency.CommandText = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"select ProductID, Name from SalesLT.Product"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commDependency.Notification = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlDependency&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dependency = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlDependency&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(commDependency);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dependency.OnChange += &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;OnChangeEventHandler&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(dependency_OnChange);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commDependency.ExecuteNonQuery();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;catch&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Exception&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;throw&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Exception&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(e.Message + e.StackTrace);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;finally&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/PBR &lt;br&gt;sqlAdapter.Dispose();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; comm.Dispose();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commDependency.Dispose();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Dispose();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //populate cache&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;//This can also be kept in a config file&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; config = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactoryConfiguration&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.Servers = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Environment&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.MachineName, 22233)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dcf = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(config);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;if&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (dcf != &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; cache = dcf.GetCache(CacheName);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataRow&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; product &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;in&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; lookUpDataset.Tables[0].Rows)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cache.Put(product[&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"ProductID"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;].ToString(), product[&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Name"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;].ToString());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Exception&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;throw&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Exception&lt;/FONT&gt;&lt;FONT size=2 face=Consolas p e.StackTrace);&lt; + (e.Message&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2 face=Consolas&gt;&amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt; Event which will be fired when there are any database changes done to the dependency query set&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=2 face=Consolas&gt;&amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;private&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;void&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dependency_OnChange(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;object&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; sender, &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlNotificationEventArgs&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (e.Info != &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;SqlNotificationInfo&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.Invalid)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PopulateLookUpCache(cacheName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;void(&lt;/FONT&gt;&lt;FONT size=2 face=Consolas font CreateCache(&lt;&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; CacheName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;//This can also be kept in a config file&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; config = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactoryConfiguration&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.Servers = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Environment&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.MachineName, 22233)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dcf = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(config);&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (dcf != &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; state = &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;InitialSessionState&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.CreateDefault();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state.ImportPSModule(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;[] { &lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"DistributedCacheAdministration"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"DistributedCacheConfiguration"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; });&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state.ThrowOnRunspaceOpenError = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;true&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; rs = &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;RunspaceFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.CreateRunspace(state);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Open();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; pipe = rs.CreatePipeline();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pipe.Commands.Add(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Command&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Use-CacheCluster"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;));&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; cmd = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Command&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"New-Cache"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Parameters.Add(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;CommandParameter&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Name"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;, CacheName));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Parameters.Add(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;CommandParameter&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Expirable"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;false&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pipe.Commands.Add(cmd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; output = pipe.Invoke();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt; &lt;/FONT&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9991952" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WF/">WF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/AppFabric/">AppFabric</category></item><item><title>Interview on Endpoint.TV</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/04/01/interview-on-endpoint-tv.aspx</link><pubDate>Thu, 01 Apr 2010 18:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9989071</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9989071</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/04/01/interview-on-endpoint-tv.aspx#comments</comments><description>&lt;P class=MsoNormal&gt;&lt;A href="http://blogs.msdn.com/dannyg/" mce_href="http://blogs.msdn.com/dannyg/"&gt;Danny Garber&lt;/A&gt; and I were interviewed for Endpoint.TV on Windows Server AppFabric and our upcoming book.&lt;/P&gt;
&lt;P class=MsoNormal mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;The interview has been published and is now available.&amp;nbsp; Check it out at &lt;A href="http://channel9.msdn.com/shows/Endpoint/endpointtv-Pro-Windows-Server-AppFabric/" mce_href="http://channel9.msdn.com/shows/Endpoint/endpointtv-Pro-Windows-Server-AppFabric/"&gt;http://channel9.msdn.com/shows/Endpoint/endpointtv-Pro-Windows-Server-AppFabric/&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9989071" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/AppFabric/">AppFabric</category></item><item><title>Calling PowerShell from .NET</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/03/31/calling-powershell-from-net.aspx</link><pubDate>Wed, 31 Mar 2010 20:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9988344</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9988344</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/03/31/calling-powershell-from-net.aspx#comments</comments><description>&lt;P&gt;I have been working with Windows Server AppFabric caching lately and have found it to be very impressive.&amp;nbsp; The more that I work with it the more that I can see areas that it can be utilized.&amp;nbsp; One of the things that will become quite evident as you start using it is that much of the setup and configuration is done through PowerShell cmdlets.&lt;/P&gt;
&lt;P&gt;I am in the process of putting together an application and I want the application to be able to create and pre-populate the cache.&amp;nbsp; As I looked into creating the cache I knew that it could be created through PowerShell directly but I wanted to call the PowerShell cmdlets from .NET.&amp;nbsp; So, lets look at what is needed to create the cache from PowerShell first and then we will look at the code to call the cmdlets from .NET.&lt;/P&gt;
&lt;P&gt;This assumes that AppFabric has been installed and configured.&lt;/P&gt;
&lt;P&gt;Open a PowerShell command window.&amp;nbsp; The first thing that we are going to do is to import two modules and then we can start issuing commands.&amp;nbsp; First, type "Import-Module DistributedCacheAdministration" (without the quotes) and hit enter.&amp;nbsp; This will import the cache administration cmdlets. Next type "Import-Module DistributedCacheConfiguration" and hit enter.&amp;nbsp; This will import the cache configuration cmdlets.&lt;/P&gt;
&lt;P&gt;The next command will bring the current machines' cluster configuration into the PowerShell session context.&amp;nbsp; So, type in Use-CacheCluster and hit enter.&amp;nbsp; We have now entered all that we need to start interacting with the cache.&amp;nbsp; The first thing that we need to do is to ensure that the cache service is running.&amp;nbsp; Type "Get-CacheHost" and hit enter.&amp;nbsp; Look on the screen and see if the Service Status show UP.&amp;nbsp; If it shows DOWN then issue the following commands to start it.&amp;nbsp; Type "$hostinfo = Get-CacheHost" and hit enter.&amp;nbsp; Then type in "Start-CacheHost $hostinfo.HostName $hostinfo.PortNo". &lt;/P&gt;
&lt;P&gt;At this point we are ready to create the cache using the New-Cache cmdlet.&amp;nbsp; Type "New-Cache &amp;lt;your cache name here&amp;gt;" and hit enter.&amp;nbsp; This will create a cache with your name that is ready to use.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;If you want to see the configuration for your newly created cache type in "Get-CacheConfig &amp;lt;your cache name here&amp;gt;" and hit enter.&amp;nbsp; You will see the following configuration attributes and their settings.&lt;/P&gt;
&lt;P&gt;CacheName : MyCache&lt;BR&gt;TimeToLive : 10 mins&lt;BR&gt;CacheType : Partitioned&lt;BR&gt;Secondaries : 0&lt;BR&gt;IsExpirable : False&lt;BR&gt;EvictionType : LRU&lt;BR&gt;NotificationsEnabled : False&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To do this all with code we need to add three references to our project.&amp;nbsp; Add the System.Management.Automation assembly as well as the Microsoft.ApplicationServer.Caching.Core and Microsoft.ApplicationServer.Caching.Client assemblies.&amp;nbsp; These two assemblies can be found in the Windows\System32\AppFabric directory.&lt;/P&gt;
&lt;P&gt;To set up the environment in .NET to issue PowerShell commands we need to start with the InitialSessionState class.&amp;nbsp; This will create a session with the PowerShell runspace.&amp;nbsp; A PowerShell runspace is the operating environment where you can create pipelines which will run the cmdlets.&lt;/P&gt;
&lt;P&gt;So, just as above we will need to start with importing the DistributedCacheAdministration and DistributedCacheConfiguration modules.&amp;nbsp; This can be seen below in the source code with the state.&lt;A href="http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.initialsessionstate.importpsmodule(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.initialsessionstate.importpsmodule(VS.85).aspx"&gt;ImportPSModule&lt;/A&gt; method.&amp;nbsp; Once we have the session state created we can call the RunspaceFactory to create a new runspace.&amp;nbsp; At this point we can call the Open method can now start creating commands through a pipeline.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In the code below we create two pipelines.&amp;nbsp; The first is our Use-CacheCluster command.&amp;nbsp; This is a command that doesn't take or return any arguments.&amp;nbsp; The next command is the New-Cache command.&amp;nbsp; This takes a set of arguments so we will create this a bit different.&amp;nbsp; First, we will create a Command object and then set parameters on the command object for each of the arguments we want to pass in.&amp;nbsp; In this example I am providing a name as well as telling the caching system that I don't want the cache items to expire.&amp;nbsp; Next, we need to pass the command object to the pipe and lastly, call the Invoke method as shown in the code below:&amp;nbsp; &lt;/P&gt;&lt;FONT size=2 face=Consolas&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;private&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;void&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; CreateCache(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; cacheName)&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //This can also be kept in a config file&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; config = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactoryConfiguration&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.Servers = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;List&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheServerEndpoint&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Environment&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.MachineName, 22233)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; dcf = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;DataCacheFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(config);&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; (dcf != &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;null&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; state = &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;InitialSessionState&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.CreateDefault();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state.ImportPSModule(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;string&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;[] { &lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"DistributedCacheAdministration"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"DistributedCacheConfiguration"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; });&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state.ThrowOnRunspaceOpenError = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;true&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; rs = &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;RunspaceFactory&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;.CreateRunspace(state);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Open();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; pipe = rs.CreatePipeline();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pipe.Commands.Add(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Command&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Use-CacheCluster"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;));&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; cmd = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;Command&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"New-Cache"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Parameters.Add(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;CommandParameter&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Name"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;, cacheName));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Parameters.Add(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;new&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2 face=Consolas&gt;CommandParameter&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2 face=Consolas&gt;"Expirable"&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;false&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt;));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pipe.Commands.Add(cmd);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2 face=Consolas&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/FONT&gt;&lt;FONT size=2 face=Consolas&gt; output = pipe.Invoke();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;We now have a cache created for us from .NET code.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9988344" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/AppFabric/">AppFabric</category></item><item><title>Twin Cities Connected Systems User Group Meeting - March 11th, 2010</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/03/10/twin-cities-connected-systems-user-group-meeting-march-11th-2010.aspx</link><pubDate>Wed, 10 Mar 2010 15:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9976233</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9976233</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/03/10/twin-cities-connected-systems-user-group-meeting-march-11th-2010.aspx#comments</comments><description>&lt;P&gt;If you are in are in Minneapolis on Thursday March 11th please join us for the Twin Cities Connected Systems User Group Meeting.&lt;/P&gt;
&lt;P&gt;The meeting takes place at 6:00 p.m. at the Microsoft offices at 8300 Norman Center Drive, Bloomington, MN 55437.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I will be speaking on How to Create Windows Server AppFabric Applications&lt;/P&gt;
&lt;P&gt;&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;Here is a write-up of what will be covered:&lt;/o:p&gt;&lt;/P&gt;
&lt;P&gt;You have heard about Dublin, now called Windows Server AppFabric, but do you know what it is and what it includes?&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Do you know how to create WCF and WF applications/services that work better with AppFabric?&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Come to the user group meeting and see how to write these applications and take advantage of AppFabric.&amp;nbsp; We will show you how to use Visual Studio 2010 to create WCF and WF services and how to deploy, monitor, and control them with Windows Server AppFabric.&amp;nbsp; In addition, we will also talk about what you need to know to start using AppFabric and what you need to do to optimize your existing applications and services to begin using AppFabric.&lt;SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9976233" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WF/">WF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BTS+User+Group/">BTS User Group</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/AppFabric/">AppFabric</category></item><item><title>Pro Windows Server AppFabric Book</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/01/18/pro-windows-server-appfabric-book.aspx</link><pubDate>Mon, 18 Jan 2010 22:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9950032</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9950032</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/01/18/pro-windows-server-appfabric-book.aspx#comments</comments><description>&lt;P&gt;I have been spending my free time working on my next book.&amp;nbsp; &lt;A href="http://blogs.msdn.com/dannyg/" mce_href="http://blogs.msdn.com/dannyg/"&gt;Danny Garber&lt;/A&gt; and I are co-authoring this &lt;A href="http://www.apress.com/book/view/1430228172" mce_href="http://www.apress.com/book/view/1430228172"&gt;book&lt;/A&gt; from APress.&lt;/P&gt;
&lt;P&gt;&lt;IMG alt="" src="http://blogs.msdn.com/photos/skaufman/images/9948637/original.aspx" width=240 height=240 mce_src="http://blogs.msdn.com/photos/skaufman/images/9948637/original.aspx"&gt;&lt;/P&gt;
&lt;P&gt;The book will be available this spring and should coincide with the release of AppFabric.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9950032" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WF/">WF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/AppFabric/">AppFabric</category></item><item><title>Twin Cities Connected Systems User Group Meeting - January 21st, 2010</title><link>http://blogs.msdn.com/b/skaufman/archive/2010/01/14/twin-cities-connected-systems-user-group-meeting-january-21st-2010.aspx</link><pubDate>Thu, 14 Jan 2010 21:09:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9948642</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9948642</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2010/01/14/twin-cities-connected-systems-user-group-meeting-january-21st-2010.aspx#comments</comments><description>&lt;P&gt;If you are in are in Minneapolis on Thursday January 21st please join us for the Twin Cities Connected Systems User Group Meeting.&lt;/P&gt;
&lt;P&gt;The meeting takes place at the Microsoft offices at 8300 Norman Center Drive, Bloomington, MN 55437.&amp;nbsp; This months meeting time has changed and we will be meeting&amp;nbsp;from 5:00 to 6:30&lt;/P&gt;
&lt;P&gt;Ed Jones from RBA will be presenting on Implementing a Service Bus Architecture with BizTalk 2009 and the BizTalk ESB Toolkit 2.0: A Real World Example&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P&gt;&lt;o:p&gt;Here is a write-up of what will be covered:&lt;/o:p&gt;&lt;/P&gt;
&lt;P&gt;Although BizTalk Server offers much in terms of flexibility and extensibility through the implementation of Service Oriented Architectures, most BizTalk applications are developed in “hub-and-spoke” models that are tightly coupled to specific points of functionality.&amp;nbsp; Entire business processes are often represented as orchestration.&amp;nbsp; As such, when business processes change, orchestrations also need to change, often requiring the reconstruction and redeployment of entire BizTalk solutions.&lt;/P&gt;
&lt;P&gt;One way to alleviate this pain is to avoid the use of a “hub-and-spoke” model altogether in favor of a Service Bus approach.&amp;nbsp; The BizTalk ESB Toolkit helps accomplish this by making the creation of a true Service Bus easier.&amp;nbsp; One feature of the toolkit for example, itineraries, allows us to create capabilities that are independent of each other and independent of specific processes.&amp;nbsp; This "Composition of Capabilities" method is preferred over the point-to-point solutions used in many BizTalk applications enabling more extensible and flexible Business Processes.&lt;/P&gt;
&lt;P&gt;Our client required a system that would accept incoming shipment data in the form of flat-files in multiple formats, process that data through a series of resolutions, and then output the data in both its raw and processed form into an ERP system.&amp;nbsp; Some data will be processed, while other data will be ignored.&amp;nbsp; Over time it is expected that the various processes may change in size, scope, and sequential order.&amp;nbsp; Our solution implements ESB Toolkit Itineraries to accomplish this composition of capabilities.&amp;nbsp; We also use the Exception Management and other more traditional BizTalk functionalities such as Business Rules.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9948642" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BTS+User+Group/">BTS User Group</category></item><item><title>AppFabric and BizTalk</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/11/23/appfabric-and-biztalk.aspx</link><pubDate>Tue, 24 Nov 2009 05:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9927727</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9927727</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/11/23/appfabric-and-biztalk.aspx#comments</comments><description>&lt;P&gt;There have been lots of questions lately about AppFabric (code named Dublin). These questions have centered around why Microsoft needs another middle tier solution and will AppFabric replace BizTalk.&lt;/P&gt;
&lt;P&gt;Lets take a look at these questions as well as two additional questions; What is AppFabric and why does Microsoft need another middle tier solution? First, AppFabric is a distributed application server. To answer the other questions, we need to go in a little more depth. &lt;/P&gt;
&lt;P&gt;Before .NET was released, developers working with the Microsoft technologies used COM+ to host their middle tier objects. Back then, when we needed to scale out our object oriented and object based applications we created middle tier code libraries and ‘hosted’ them in COM+. The COM+ host provided instance management (just-in-time activation), role-based security, automated transaction management as well as better memory and processor management, distributed transactions and a number of other services.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;When .NET was introduced, we moved away from COM components and also moved away from using COM+ as a hosting model. This left a vacuum that so far had gone unfilled. &lt;/P&gt;
&lt;P&gt;In attempts to fill this vacuum, individual developers had to create their own hosts. These hosts typically were Windows Services. However, these services usually didn’t include multi threading, scale out capabilities, tracking, monitoring, etc. – the types of functionality that has been in BizTalk for years. As Microsoft looked at BizTalk, as well as the .NET Framework, it was determined that there are many great features in BizTalk that if a scaled down version was available it would address gaps in the framework. Thus AppFabric was born.&lt;/P&gt;
&lt;P&gt;For .NET developers writing applications using WCF and WF, AppFabric will fill the middle tier hosting vacuum. AppFabric will provide the host and will provide scalability and support for building out your middle tier application components. It also will simplify deployment, configuration, management and scalability of composite applications. The goal of AppFabric is to provide a server infrastructure, on which business logic developed in WF can be executed and exposed via WCF endpoints, without the need to design, develop, and support the infrastructural code.&lt;/P&gt;
&lt;P&gt;The next question I hear is will AppFabric replace BizTalk? The answer is very clearly no. &lt;/P&gt;
&lt;P&gt;AppFabric should be used when your architecture calls for an application level code-first object based approach. This is the same approach that is used by WF and WCF programming models and is the one that can be hosted in AppFabric and the additional functionality that AppFabric provides. AppFabric will provide a number of management and scalability features through IIS and WAS to provide the server infrastructure without the need to write the plumbing as you did before. This is a different approach than that of the XML Schema first approach that is used in BizTalk. &lt;/P&gt;
&lt;P&gt;Use BizTalk when your architecture calls for an enterprise level message based approach. Use BizTalk when you need to isolate disparate systems that need to be connected. In point-to-point integrations, changes made to the provider system can have a profound impact on the consuming application. BizTalk natively provides a hub-based integration model which eases this burden and allows organizations to provide business services that are isolated from the impact of changes made to the systems and processes on which these services are based. This is achieved through the use of separate schemas, and the associated ability to easily develop message transformation logic using BizTalk’s Mapper tool. Use BizTalk if you have business-to-business requirements and need to integrate using technologies such as EDI, SWIFT, RosettaNet, AS2 or HL7.&lt;/P&gt;
&lt;P&gt;The reality is that businesses will utilize both of these technologies in their different application architectures. This is not an either or decision but instead a decision of where and when to use each.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Keep in mind, however, that many of the same terms are used to describe the functionality provided with both BizTalk and AppFabric. These terms are things like Content Based Routing, Correlation, long running transactions, etc. Although the terms are the same the implementation and functionality is different. With all decisions, make sure that you take a couple of minutes to look under the hood and ensure that you understand the differences. &lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9927727" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WF/">WF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/AppFabric/">AppFabric</category></item><item><title>Follow Up from TechEd Europe</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/11/20/follow-up-from-teched-europe.aspx</link><pubDate>Sat, 21 Nov 2009 05:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9926659</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9926659</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/11/20/follow-up-from-teched-europe.aspx#comments</comments><description>&lt;A href="http://blogs.msdn.com/paolos" mce_href="http://blogs.msdn.com/paolos"&gt;Paolo Salvatori&lt;/A&gt; and I delivered a session titled 'Customizing and Extending the BizTalk WCF Adapters' and Paolo has created a number of fantastic blog entries around this subject.&amp;nbsp; His latest &lt;A href="http://blogs.msdn.com/paolos/archive/2009/11/17/customizing-and-extending-the-biztalk-wcf-adapters.aspx" mce_href="http://blogs.msdn.com/paolos/archive/2009/11/17/customizing-and-extending-the-biztalk-wcf-adapters.aspx"&gt;entry&lt;/A&gt; goes through much of the content that was delivered in the session and he has included a number of links at the bottom for more WCF Adapter information and samples.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9926659" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>Speaking at TechEd Europe 2009</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/10/13/speaking-at-teched-europe-2009.aspx</link><pubDate>Tue, 13 Oct 2009 05:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9906441</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9906441</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/10/13/speaking-at-teched-europe-2009.aspx#comments</comments><description>&lt;P&gt;I will be speaking at TechEd Europe 2009 in Berlin Germany November 9th through the 13th.&lt;/P&gt;
&lt;P&gt;I will be presenting two sessions.&amp;nbsp; My first is a 'Deep Dive with Microsoft BizTalk Server 2009 Development Platform' and my second is 'Customizing and Extending the BizTalk WCF Adapters'.&lt;/P&gt;
&lt;P&gt;If you are going to be there stop by and say hello.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9906441" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>The Architecture Journal - Edition 21</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/10/11/the-architecture-journal-edition-21.aspx</link><pubDate>Mon, 12 Oct 2009 04:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9905994</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9905994</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/10/11/the-architecture-journal-edition-21.aspx#comments</comments><description>&lt;P&gt;I co-authored an article titled 'Design Considerations for S+S and Cloud Computing' in this months Architecture Journal.&amp;nbsp; I co-authored this along with 8 other architects at Microsoft.&amp;nbsp; They were &lt;A href="http://blogs.msdn.com/fred_chong/" mce_href="http://blogs.msdn.com/fred_chong/"&gt;Fred Chong&lt;/A&gt;, Alejandro Miguel, &lt;A href="http://blogs.msdn.com/thehoggblog/" mce_href="http://blogs.msdn.com/thehoggblog/"&gt;Jason Hogg&lt;/A&gt;, Ulrich Homann, Brant Zwiefel, &lt;A href="http://blogs.msdn.com/dannyg/" mce_href="http://blogs.msdn.com/dannyg/"&gt;Danny Garber&lt;/A&gt;, Joshy Joseph and Scott Zimmerman.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;IMG alt="" src="http://blogs.msdn.com/photos/skaufman/images/9905991/original.aspx" width=590 height=134 mce_src="http://blogs.msdn.com/photos/skaufman/images/9905991/original.aspx"&gt;&lt;/P&gt;
&lt;P&gt;Here is the summary: The purpose of this article is to share our thoughts about the design patterns for a new generation of applications that are referred to as &lt;I&gt;Software plus Services&lt;/I&gt;, &lt;I&gt;cloud computing&lt;/I&gt;, or &lt;I&gt;hybrid computing&lt;/I&gt;. The article provides a view into S+S architectural considerations and patterns as they affect common architectural domains such as enterprise, software, and infrastructure architecture.&lt;/P&gt;
&lt;P&gt;Check it out at &lt;A href="http://msdn.microsoft.com/en-us/architecture/aa699439.aspx" mce_href="http://msdn.microsoft.com/en-us/architecture/aa699439.aspx"&gt;http://msdn.microsoft.com/en-us/architecture/aa699439.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Also be sure to check out the other great articles in the 21st edition of the &lt;A href="http://msdn.microsoft.com/en-us/architecture/aa699437.aspx" mce_href="http://msdn.microsoft.com/en-us/architecture/aa699437.aspx"&gt;magazine&lt;/A&gt;.&amp;nbsp; This edition is focused on SOA today and tomorrow.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9905994" width="1" height="1"&gt;</description></item><item><title>StreamInsight</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/09/29/streaminsight.aspx</link><pubDate>Wed, 30 Sep 2009 07:04:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9901132</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9901132</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/09/29/streaminsight.aspx#comments</comments><description>&lt;P&gt;You are probably asking what is StreamInsight.&amp;nbsp; Well, it is the platform for performing Complex Event Processing (CEP) from Microsoft.&amp;nbsp; Actually to quote exactly what it is - it is a&amp;nbsp;"&lt;SPAN&gt;platform for the continuous and incremental processing of unending sequences of events (event streams) from multiple sources with near-zero latency".&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;There has been a need to deal with processing at near zero latency for some time.&amp;nbsp; Many times existing products can perform at low latency and that has been acceptable, however, there are a number of situations where low latency wasn't sufficient.&amp;nbsp; That is where Complex Event Processing comes in.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;According to Wikipedia CEP is defined as:&amp;nbsp; primarily an event processing concept that deals with the task of processing multiple events with the goal of identifying the meaningful events within the event cloud. CEP employs techniques such as detection of complex patterns of many events, event correlation and abstraction, event hierarchies, and relationships between events such as causality, membership, and timing, and event-driven processes.&amp;nbsp; CEP is to discover information contained in the events happening across all the layers in an organization and then analyze its impact from the macro level as "complex event" and then take subsequent action plan in real time.&lt;/P&gt;
&lt;P&gt;Some of the scenarios that call for CEP are:&lt;/P&gt;
&lt;P&gt;Manufacturing: Sensors on the plant floor capturing data through device controllers and aggregating data consisting of tens of thousands of events per second with requirements to act on patterns detected to ensure product quality &lt;/P&gt;
&lt;P&gt;Web analytics: Instrument server to capture click-stream data and determine online customer behavior &lt;/P&gt;
&lt;P&gt;Financial services: Listening to data feeds like news or stocks. Use that data to run queries looking for patterns that find opportunities to buy or sell stock&lt;/P&gt;
&lt;P&gt;Some of the features of StreamInsight listed on the download site are: &lt;/P&gt;&lt;SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;Derive meaningful and relevant information from data/events streams through complex patterns. These patterns can be defined using a declarative query paradigm based on well-defined streaming semantics with LINQ as query language. &lt;/LI&gt;
&lt;LI&gt;For the development of applications, adapters, and analytics, the user can rely on well-established and powerful development frameworks and tools such as .NET, LINQ, and Microsoft Visual Studio. &lt;/LI&gt;
&lt;LI&gt;The platform integrates with various data sources and sinks through input and output adapters. The framework to build domain-specific adapters utilizes a .NET API to make adoption of the platform easy. Independence between adapters and queries facilitates seamless integration of real-time and historical analysis. &lt;/LI&gt;
&lt;LI&gt;The platform architecture supports a variety of deployment options, from scenarios with a low-footprint embedded option to high-end server deployments. &lt;/LI&gt;
&lt;LI&gt;A rich set of manageability features such as a management interface, a diagnostic interface and a debugging tool are provided as part of the platform. &lt;/LI&gt;&lt;/UL&gt;&lt;/SPAN&gt;
&lt;P&gt;You can start working with the CTP by downloading it at: &lt;A href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=a3faa562-b6dc-4702-90c6-bf8e08df3b8b" mce_href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=a3faa562-b6dc-4702-90c6-bf8e08df3b8b"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=a3faa562-b6dc-4702-90c6-bf8e08df3b8b&lt;/A&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9901132" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>WCF:  Did you know?</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/08/12/wcf-did-you-know.aspx</link><pubDate>Thu, 13 Aug 2009 01:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9867284</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9867284</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/08/12/wcf-did-you-know.aspx#comments</comments><description>&lt;P&gt;Did you know that when doing contract first development and utilize a Boolean data type with a default value (lets just say the default value was set to true), WCF will not serialize out the default value in the message.&amp;nbsp; WCF will only serialize out the value if it differs from the default.&lt;/P&gt;
&lt;P&gt;This was an interesting scenario in BizTalk when we were trying to test for the Boolean to be true and we saw that it was actually empty.&lt;/P&gt;
&lt;P&gt;Sometimes I wonder with these types of issues if I am the only one in the world that didn't know that.&amp;nbsp; I am going to make the assumption that this will be news to more people then just me.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9867284" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>WSE, DIME; WCF, MTOM; OH My!</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/07/20/wse-dime-wcf-mtom-oh-my.aspx</link><pubDate>Mon, 20 Jul 2009 20:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9841995</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9841995</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/07/20/wse-dime-wcf-mtom-oh-my.aspx#comments</comments><description>I was recently working on a proof of concept where we needed to interface to a repository that returned the documents using DIME attachments.&amp;nbsp; I don't know if you have had the 'opportunity' to work with DIME attachments before but there isn't much that still supports that format.&amp;nbsp; Since the manufacturer of the repository wasn't upgrading their software to take advantage of the new MTOM format we needed to consume the DIME attachments and convert them to MTOM attachments through an exposed WCF end point. 
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;My client was putting this service on their ESB, which was built using BizTalk, and we utilized the WSE 2.0 extensions (yes, you can still &lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=1ba1f631-c3e7-420a-bc1e-ef18bab66122&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?familyid=1ba1f631-c3e7-420a-bc1e-ef18bab66122&amp;amp;displaylang=en"&gt;download&lt;/A&gt; them) for the DIME support.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To do this we downloaded the WSE extensions and created a class that we would call from within our Orchestration.&amp;nbsp; We added a Web Reference to point to the web service of the repository.&amp;nbsp; We then replaced the default inherited class in the proxy with the WSE class, Microsoft.Web.Services2.WebServicesClientProtocol.&amp;nbsp; At this point we were ready to start writing code to consume the attachments.&lt;/P&gt;
&lt;P&gt;In the code below, we loop through the attachments in the ResponseSoapContext and then load them into a stream object.&amp;nbsp; We then used the Convert class to convert the byte array to the properly converted Base64String and placed that as the value of the Attachment node.&amp;nbsp; The schema node's data type in the schema in BizTalk for the attachment is set to Base64Binary.&amp;nbsp; The best part about this whole POC is that by putting our attachment in the Base64Binary data type, all that we need to do is set the encoding on the WCF adapter to MTOM and BizTalk will do all the MTOM work for us.&amp;nbsp; Also in the code below, you will notice that we used Linq to XML.&amp;nbsp; The great part of POC's is that you can play with the new technology and in this case see just how easy it is to put together the XML message.&amp;nbsp; Even though we were playing with Linq, I still needed to pass back an XML Document for the Orchestration to consume.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; System;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; System.Collections.Generic;&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; System.Linq;&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; System.Text;&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; System.Drawing;&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; System.Xml.Linq;&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; Microsoft.Web.Services2.Dime;&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; System.IO;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; System.Xml.Serialization;&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;using&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; System.Xml;&lt;o:p&gt;&lt;BR&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; OrchestrationHelper&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;{&lt;SPAN style="mso-spacerun: yes"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;[&lt;SPAN style="COLOR: #2b91af"&gt;Serializable&lt;/SPAN&gt;]&lt;BR&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;OrchestrationHelperWrapper&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;MyService.&lt;SPAN style="COLOR: #2b91af"&gt;Service&lt;/SPAN&gt; svc = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; MyService.&lt;SPAN style="COLOR: #2b91af"&gt;Service&lt;/SPAN&gt;();&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;XmlDocument&lt;/SPAN&gt; RetrieveAttachment(&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; token, &lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt; name)&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt; xmlTree = &lt;SPAN style="COLOR: blue"&gt;null&lt;/SPAN&gt;;&lt;o:p&gt;&lt;BR&gt;&lt;/o:p&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; iResult = svc.RetrieveFile(token, name);&lt;SPAN style="mso-spacerun: yes"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt; myNode;&lt;o:p&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&lt;/o:p&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (iResult == 0)&amp;nbsp; //0 = successful retrieve&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (svc.ResponseSoapContext.Attachments.Count &amp;gt; 0)&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;XNamespace&lt;/SPAN&gt; ns = &lt;SPAN style="COLOR: #a31515"&gt;"http://POC.DimeReturnSchema"&lt;/SPAN&gt;;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xmlTree = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt;(ns + &lt;SPAN style="COLOR: #a31515"&gt;"ReturnedAttachments"&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt; xmlAttachments = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #a31515"&gt;"Attachments"&lt;/SPAN&gt;);&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xmlTree.Add(xmlAttachments);&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;for&lt;/SPAN&gt; (&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; index = 0; index &amp;lt; svc.ResponseSoapContext.Attachments.Count; index++)&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;Stream&lt;/SPAN&gt; myStream = svc.ResponseSoapContext.Attachments[&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;index&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;].Stream;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; length = (&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;)myStream.Length;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;byte&lt;/SPAN&gt;[] bytes = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;byte&lt;/SPAN&gt;[length];&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;myStream.Read(bytes, 0, length);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;myNode = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;XElement&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #a31515"&gt;"Attachment"&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #2b91af"&gt;Convert&lt;/SPAN&gt;.ToBase64String(bytes));&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xmlAttachments.Add(myNode);&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #2b91af"&gt;XmlDocument&lt;/SPAN&gt; xdoc = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;XmlDocument&lt;/SPAN&gt;();&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;xdoc.LoadXml(xmlTree.ToString());&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; xdoc;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Back in BizTalk, in our Orchestration, we called the OrchestrationHelper through the ConstructMessage shape and assigned the returned Xml Document to the Orchestration Message.&amp;nbsp; We created a WCF endpoint and selected Mtom encoding on the Binding tab of the WCF Transport Properties dialog.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The best part is that BizTalk automatically encoded anything that was set to Base64Binary to the MTOM format and it can all be done through configuration in the WCF adapter settings.&amp;nbsp; All that we needed to do was to consume the DIME attachment and place it in an element with the right data type.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9841995" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>Exposing Custom WCF Headers through WCF Behaviors - Part 3</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/06/24/exposing-custom-wcf-headers-through-wcf-behaviors-part-3.aspx</link><pubDate>Thu, 25 Jun 2009 03:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9802671</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9802671</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/06/24/exposing-custom-wcf-headers-through-wcf-behaviors-part-3.aspx#comments</comments><description>
&lt;STYLE type=text/css&gt;
.style1 {
	font-family: "Courier New", Courier, monospace;
font-size: x-small;
}
.style2 {
	font-family: "Courier New", Courier, monospace;
	font-size: x-small;
}
.style3 {
	font-size: x-small;
}
.style5 {
	font-size: x-small;
}
.style6 {
	text-align: center;
}
&lt;/STYLE&gt;

&lt;P&gt;In &lt;A href="http://blogs.msdn.com/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx" mce_href="http://blogs.msdn.com/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx"&gt;part 1&lt;/A&gt;, I covered how to create a custom behavior to inject headers into the dynamically created WSDL.&amp;nbsp; In &lt;A href="http://blogs.msdn.com/skaufman/archive/2009/06/10/exposing-custom-wcf-headers-through-wcf-behaviors-part-2.aspx" mce_href="http://blogs.msdn.com/skaufman/archive/2009/06/10/exposing-custom-wcf-headers-through-wcf-behaviors-part-2.aspx"&gt;part 2&lt;/A&gt;, I showed how to either promote or write the header data to the BizTalk context.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;What happens if I want different headers for different end points?&amp;nbsp; What if I don't want to create a custom header component for each end point?&amp;nbsp; What if I want to set, through configuration, weather I want to promote or write to the context?&amp;nbsp; What if I want to add a new header item without the need to recompile?&lt;/P&gt;
&lt;P&gt;In this part of the series we will look at the ability to create a behavior that exposes the properties through configuration to let you dynamically, per end point, set the header items.&amp;nbsp; The configuration is not through a configuration file but instead will hook into the end point behavior dialog box that appears in the adapter configuration in BizTalk.&lt;/P&gt;
&lt;P&gt;The finished configuration will look like this:&lt;/P&gt;
&lt;P class=style6&gt;&lt;IMG alt="" src="http://blogs.msdn.com/photos/skaufman/images/9802639/original.aspx" width=942 height=789 mce_src="http://blogs.msdn.com/photos/skaufman/images/9802639/original.aspx"&gt;&lt;/P&gt;
&lt;P&gt;Let's start looking at code.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;First we are going to look at a new class file that will represent the data that we need to set in the configuration section of the dialog box.&amp;nbsp; The CustomHeader class is where much of the configuration dialog magic happens.&amp;nbsp; The way you define the properties will define the way they appear in the configuration dialog box.&amp;nbsp; If you define your property as a boolean or an enum then it will display as a drop down list box.&amp;nbsp; If you define it as a class then you will get the ellipses.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;BR&gt;using System.Text;&lt;BR&gt;&lt;BR&gt;namespace &lt;/SPAN&gt;&lt;SPAN class=style5&gt;Services.WCF.Behavior&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class CustomHeader&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get; set; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Namespace { get; set; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool Required { get; set; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ContextAction Action { get; set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;Where the ContextAction type is the enum listed below:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;BR&gt;using System.Text;&lt;BR&gt;&lt;BR&gt;namespace &lt;/SPAN&gt;&lt;SPAN class=style5&gt;Services.WCF.Behavior&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public enum ContextAction&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; None = 0,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write = 1,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Promote = 2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;The CustomHeader class is accessed and 'bound' to the dialog box through the CustomHeaderEndpointBehavior class.&amp;nbsp; This class is just a renamed and modified version of the SoapHeaderEndpointBehavior class we saw in the previous two articles.&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Text;&lt;BR&gt;using System.ServiceModel.Description;&lt;BR&gt;using System.ServiceModel.Configuration;&lt;BR&gt;using System.Configuration;&lt;BR&gt;using System.ServiceModel;&lt;BR&gt;&lt;BR&gt;namespace &lt;/SPAN&gt;&lt;SPAN class=style5&gt;Services.WCF.Behavior&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class CustomHeaderEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region BehaviorExtensionElement Methods&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override Type BehaviorType&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return typeof(CustomHeaderEndpointBehavior); }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override object CreateBehavior()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new CustomHeaderEndpointBehavior(this.Headers);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Copies the content of the specified configuration element to this configuration element&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void CopyFrom(ServiceModelExtensionElement extFrom)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.CopyFrom(extFrom);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomHeaderEndpointBehavior element = extFrom as CustomHeaderEndpointBehavior;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (element != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Headers = element.Headers;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Both properties are returned as a collection.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override ConfigurationPropertyCollection Properties&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_properties == null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _properties = new ConfigurationPropertyCollection();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;_&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;properties.Add(new ConfigurationProperty("Headers", typeof(List&amp;lt;CustomHeader&amp;gt;), null,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new SerializationConverter(typeof(List&amp;lt;CustomHeader&amp;gt;)), null, ConfigurationPropertyOptions.None));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base["Headers"] = new List&amp;lt;CustomHeader&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _properties;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IEndpointBehavior Members&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindingParameters.Add(this);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //throw new NotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CustomHeaderMessageInspector());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Validate(ServiceEndpoint endpoint)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //throw new NotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Class properties&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;[&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;ConfigurationProperty("Headers")]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;CustomHeader&amp;gt; Headers&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (List&amp;lt;CustomHeader&amp;gt;)base["Headers"];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base["Headers"] = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Class Fields&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ConfigurationPropertyCollection _properties;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Constructors&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public CustomHeaderEndpointBehavior(List&amp;lt;CustomHeader&amp;gt; headers)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Headers = headers;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public CustomHeaderEndpointBehavior() : base()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;First you will notice that there is a number of new methods.&amp;nbsp; The first is the CopyFrom method.&amp;nbsp; This method is needed to copy the contents of the configuration data entered in the dialog box so that we can gain access to it within our class.&amp;nbsp; We then override ConfigurationPropertyCollection since the header properties are returned as a collection.&amp;nbsp; We will add the properties to our internal collection based on the List&amp;lt;CustomHeader&amp;gt; object.&amp;nbsp; We also add the class to the AddBindingParamters method.&lt;/P&gt;
&lt;P&gt;One thing to note when creating the configuration class (in our case the CustomHeader class) is that the default behavior of the Transport Properties dialog box and underlying code expects that all configuration information will be of type string.&amp;nbsp; If you are using other types then you need to create your own type converter to convert to a string representation and back.&amp;nbsp; I have the code for the type converter at the bottom of this post called SerializationConverter.&lt;/P&gt;
&lt;P&gt;In the code above, in the CustomHeaderEndpointBehavior class, there were a couple of custom objects.&amp;nbsp; The first one we will dig into is in the ApplyDispatchBehavior where we add a new CustomHeaderMessageInspector.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The class implementation for the CustomHeaderMessageInspector looks like:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;BR&gt;using System.Text;&lt;BR&gt;using System.ServiceModel.Dispatcher;&lt;BR&gt;using System.Diagnostics;&lt;BR&gt;using System.ServiceModel;&lt;BR&gt;using System.ServiceModel.Channels;&lt;BR&gt;using System.Xml;&lt;BR&gt;&lt;BR&gt;namespace &lt;/SPAN&gt;&lt;SPAN class=style5&gt;Services.WCF.Behavior&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class CustomHeaderMessageInspector : IDispatchMessageInspector&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IDispatchMessageInspector Members&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt; writeProps = new List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt; promoteProps = new List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string writeKey = "&lt;A href="http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/WriteToContext" mce_href="http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/WriteToContext"&gt;http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/WriteToContext&lt;/A&gt;";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string promoteKey = "&lt;A href="http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/Promote" mce_href="http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/Promote"&gt;http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/Promote&lt;/A&gt;";&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomHeaderEndpointBehavior bhv = null;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (instanceContext.Host.Description.Endpoints.Find(channel.LocalAddress.Uri) != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;bhv = instanceContext.Host.Description.Endpoints.Find(channel.LocalAddress.Uri).Behaviors.Find&amp;lt;CustomHeaderEndpointBehavior&amp;gt;();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bhv != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;foreach (CustomHeader hdr in bhv.Headers)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int headerPos = OperationContext.Current.IncomingMessageHeaders.FindHeader(hdr.Name, hdr.Namespace);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (headerPos &amp;lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hdr.Required)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Fault Condition&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException(hdr.Name, "Required soap header not found.");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hdr.Action != ContextAction.None)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get an XmlDictionaryReader to read the header content&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;XmlDictionaryReader reader = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(headerPos);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;XmlDocument d = new XmlDocument();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;d.LoadXml(reader.ReadOuterXml());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;XmlQualifiedName PropName1 = new XmlQualifiedName(hdr.Name, hdr.Namespace);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hdr.Action == ContextAction.Write)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;writeProps.Add(new KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;(PropName1, d.DocumentElement.InnerText));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (hdr.Action == ContextAction.Promote)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;promoteProps.Add(new KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;(PropName1, d.DocumentElement.InnerText));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Debug.WriteLine("*****AfterReceiveRequest: No Behavior found of type CustomHeaderEndpointBehavior.*****");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (writeProps.Count &amp;gt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;request.Properties[writeKey] = writeProps;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (promoteProps.Count &amp;gt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style3&gt;request.Properties[promoteKey] = promoteProps;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;As we look at this code, in the AfterReceiveRequest method we have included both the writeProps and the promoteProps variables as well as both namespaces.&amp;nbsp; We then look in the &lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;instanceContext.Host.Description.Endpoints &lt;/SPAN&gt;&lt;/SPAN&gt;collection to find, within the behaviors collection, our CustomerHeaderEndPointBehavior object.&amp;nbsp; Then we loop through each of the headers that was setup through configuration and look for them in the message headers collection.&amp;nbsp; Finally, check if the header was required and if we need to write or promote the values.&lt;/P&gt;
&lt;P&gt;Lastly, here is the code that does our type conversion from the CustomHeader class to a string representation (in our case this will be XML). &lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;BR&gt;using System.Text;&lt;BR&gt;using System.ComponentModel;&lt;BR&gt;using System.Xml.Serialization;&lt;BR&gt;using System.IO;&lt;BR&gt;using System.Xml;&lt;BR&gt;using System.Globalization;&lt;BR&gt;&lt;BR&gt;namespace &lt;/SPAN&gt;&lt;SPAN class=style5&gt;Services.WCF.Behavior&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class SerializationConverter : TypeConverter&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Type _type;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SerializationConverter(Type type)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _type = type;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Helper Utilities&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private object Deserialize(object value)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_type == null) throw new ArgumentNullException("", "Serialization type was not set. Use the SerializationConvertor(Type) constructor.");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Deserialize(value, _type);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private object Deserialize(object value, Type destinationType)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringReader strRdr = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlReader xmlRdr = null;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!(value is string))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ApplicationException("Expecting parameter 'value' to be of type string. 'Value' is of type " + value.GetType().ToString());&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlSerializer serializer = new XmlSerializer(destinationType);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRdr = new StringReader(value.ToString());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlRdr = XmlReader.Create(strRdr);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return serializer.Deserialize(xmlRdr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strRdr.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlRdr.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private object Serialize(object value)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringWriter wtr = null;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (value == null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException("value");&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder sb = new StringBuilder();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlSerializer serializer = new XmlSerializer(value.GetType());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wtr = new StringWriter(sb);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; serializer.Serialize(wtr, value);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sb.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wtr.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Collection code.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Class to string&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (value is string)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Deserialize(value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (value.GetType() == _type)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Serialize(value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string msg = (_type == null ? "Value is not of type System.string and no type was specified at construction." : "Value is not of type System.string or " + _type.ToString() + ".");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ApplicationException(msg);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //String to class&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (value is string)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Deserialize(value, destinationType);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (value.GetType() == _type)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Serialize(value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string msg = (_type == null ? "Value is not of type System.string and no type was specified at construction." : "Value is not of type System.string or " + _type.ToString() + ".");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ApplicationException(msg);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style3&gt;endregion&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;At this point we have all the code that is part of our project.&amp;nbsp; Once this is compiled, we need to add the assembly to the machine config and add it to the BizTalk WCF endpoint.&amp;nbsp; The process to implement this remains the same as that described at the bottom of part 1 of this series.&lt;/P&gt;
&lt;P&gt;As always, the code in this post and this series are for reference only and are provided as is.&amp;nbsp; Now that we have that out of the way, I hope that these posts have been helpful and have shown how to deal with header values in the WCF stack and&amp;nbsp; shown the ability to create a behavior that exposes the properties through configuration to let you dynamically, per end point, set the header items.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9802671" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>Exposing Custom WCF Headers through WCF Behaviors - Part 2</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/06/10/exposing-custom-wcf-headers-through-wcf-behaviors-part-2.aspx</link><pubDate>Thu, 11 Jun 2009 07:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9725758</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9725758</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/06/10/exposing-custom-wcf-headers-through-wcf-behaviors-part-2.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;In &lt;A href="http://blogs.msdn.com/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx" mce_href="http://blogs.msdn.com/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx"&gt;part 1&lt;/A&gt; we covered how to create a custom behavior to inject header data into the dynamically created WSDL.&lt;/P&gt;
&lt;P&gt;In this part we will look at consuming the header data passed in.&lt;/P&gt;
&lt;P&gt;By default BizTalk will take any custom header it finds in the incoming WCF message and automatically map them to the Message Context.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;If it were really this simple we wouldn't need this posting.&lt;/P&gt;
&lt;P&gt;So, what is the issue.&amp;nbsp; The issue is that when BizTalk maps the header to the context it posts an xml fragment.&amp;nbsp; This fragment could certainly be used as is and parsed each time you need to use it but that gets tedious quickly and certainly doesn't do good things to the performance of your solution.&lt;/P&gt;
&lt;P&gt;What we need is to be able to parse the key and value of the header data when the message is submitted to BizTalk so that it looks like all of the other context entries (a key and a value pair).&lt;/P&gt;
&lt;P&gt;There are a number of options to enable you to do this including creating a pipeline component.&amp;nbsp; We are not going to go that route.&amp;nbsp; Instead, we are going to add code directly to our behavior.&amp;nbsp; I want everything to be encapsulated inside the behavior so that if developers decide to use the behavior they don't have to also remember to place a pipeline in the mix.&amp;nbsp; By having a separate pipeline component we are creating an error prone system that won't be caught until after deployment has occurred.&lt;/P&gt;
&lt;P&gt;To promote or write to the context when the message arrives we will modify the AfterReceiveRequest method on the SoapHeaderMessageInspector class.&amp;nbsp; This class was created in Part 1 of this series.&amp;nbsp; If you go back and look at that method you will see that we originally implemented it by returning null.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;First lets look at what is required to write or promote to the Message Context in code.&amp;nbsp; &lt;A href="http://msdn.microsoft.com/en-us/library/bb246105.aspx" mce_href="http://msdn.microsoft.com/en-us/library/bb246105.aspx"&gt;MSDN&lt;/A&gt; has a sample of how this can be done which I put below.&lt;/P&gt;&lt;PRE style="WORD-WRAP: break-word; WORD-BREAK: break-all" id=ctl00_mainContentContainer_ctl04other class=libCScode space="preserve"&gt;const string PropertiesToPromoteKey="http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/Promote";
const string PropertiesToWriteKey="http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/WriteToContext";

XmlQualifiedName PropName1=new XmlQualifiedName("Destination", "http://tempuri.org/2007/sample-properties");
XmlQualifiedName PropName2=new XmlQualifiedName("Source", "http://tempuri.org/2007/sample-properties");

//Create a List of KeyValuePairs that indicate properties to be promoted to BizTalk message context. 
//A Property Schema must be deployed and string values have a limit of 256 characters
List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt; promoteProps=new List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt;();
promoteProps.Add(new KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;(PropName1, "Property value"));
wcfMessage.Properties[PropertiesToPromoteKey]=promoteProps;

//Create a List of KeyValuePairs that indicate properties to be written to BizTalk message context
List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt; writeProps=new List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt;();
writeProps.Add(new KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;(PropName2, "Property value"));
wcfMessage.Properties[PropertiesToWriteKey]=writeProps;&lt;/PRE&gt;
&lt;P&gt;We are going to use this code but will format it a bit differently.&amp;nbsp; As I said earlier we need to modify the AfterReceiveRequest method to incorporate this code.&lt;/P&gt;
&lt;P&gt;Our method implementation will look like:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt; writeProps = new List&amp;lt;KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const string PropertiesToWriteKey = "http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties/WriteToContext";&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Int32 headerPosition = OperationContext.Current.IncomingMessageHeaders.FindHeader(SoapHeaderNames.SoapHeaderName, SoapHeaderNames.SoapHeaderNamespace);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (headerPosition &amp;lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Fault Condition&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException(SoapHeaderNames.SoapHeaderNamespace + "#" + SoapHeaderNames.SoapHeaderName, "SoapHeader not found.");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get an XmlDictionaryReader to read the header content&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlDictionaryReader reader = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(headerPosition);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlDocument d = new XmlDocument();&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; d.LoadXml(reader.ReadOuterXml());&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (XmlNode node in d.DocumentElement.ChildNodes)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((node.Name.ToLower().Equals(SoapHeaderNames.AppName.ToLower()) ||&lt;/SPAN&gt;&lt;SPAN class=style2&gt; node.Name.ToLower().Equals(SoapHeaderNames.UserName.ToLower())) &amp;amp;&amp;amp; &lt;/SPAN&gt;&lt;SPAN class=style2&gt;String.IsNullOrEmpty(node.InnerText))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException(node.Name, "Header value cannot be null.");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlQualifiedName PropName1 = new XmlQualifiedName(node.Name, SoapHeaderNames.SoapHeaderNamespace);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeProps.Add(new KeyValuePair&amp;lt;XmlQualifiedName, object&amp;gt;(PropName1, node.InnerText));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (writeProps.Count &amp;gt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.Properties[PropertiesToWriteKey] = writeProps;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;This code shows how we can select and read the header, and then loop through each element in the header and promote it.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In order to promote properties into the context you need to have a property schema.&amp;nbsp; We took the SoapHeader.xsd that we created in Part 1 of this post and used that for our property schema.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;When we take a look at the content of the incoming message after compiling and deploying our changes we can now see that our key name appears under the Name column and our value appears under the Value column of the Context dialog box.&amp;nbsp; We no longer have an xml fragment and no longer have to deal with the need to parse the fragment each time we want to use it.&amp;nbsp; Now that we have this data in the context we can utilize it in the same we would with any other data that appears in the context.&amp;nbsp; The best part is that it was all done in one location, through one artifact, and won't require the developer to remember to utilize another artifact to make the solution work.&lt;/P&gt;
&lt;P&gt;In the next post, we will cover the ability to create a behavior that exposes the properties through configuration to let you dynamically, per end point, set the header items as well as determine whether you want the values written or promoted dynamically as well.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9725758" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>Exposing Custom WCF Headers through WCF Behaviors</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx</link><pubDate>Sat, 30 May 2009 00:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9658649</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9658649</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx#comments</comments><description>&lt;P&gt;Since the WCF Publishing Wizard in BizTalk does&amp;nbsp;not support adding custom headers defined at the server, we need to programmatically modify what gets created by the wizard to add custom headers.&amp;nbsp; However, from the client you have the option to pass in header values at will.&amp;nbsp; If you are passing in headers generated at the client BizTalk will take them and map them to the context.&amp;nbsp; However, they show up as an XML fragment and not as individual data items.&amp;nbsp; It becomes annoying to constantly parse the fragment each and every time you want to get to the data.&lt;/P&gt;
&lt;P&gt;What we are really interested in is the ability to expose the end point with the header values already defined, accept the header values from the client and either promote or write the values to the context and lastly, be able to create a behavior that you can attach to your WCF endpoint that exposes the properties through configuration to let you dynamically, per end point, set the header items and what you want to do with them as they are submitted.&amp;nbsp; This will be a three part posting with a post covering each of these features.&lt;/P&gt;
&lt;P&gt;For this first post, we will focus on the ability to expose the end point with the header values already defined.&amp;nbsp; What makes this even more interesting is that there is no WSDL file as this gets generated dynamically when you access the SVC file.&amp;nbsp; If you wish you can create a static WSDL file and then use the externalMetadataLocation attribute of the &lt;A href="http://go.microsoft.com/fwlink/?LinkId=89121" mce_href="http://go.microsoft.com/fwlink/?LinkId=89121"&gt;&lt;SERVICEMETADATA&gt;&lt;/A&gt;element in the Web.config file that the wizard generates to specify the location of the WSDL file.&amp;nbsp; Then the static WSDL file will be sent to the user in response to WSDL and metadata exchange (MEX) requests instead of the auto-generated WSDL.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In our solution, we did not want to have to create WSDL files for each of our endpoints, nor did we want to maintain them.&amp;nbsp; We needed a way to hook in to the dynamic WSDL creation process.&lt;/P&gt;
&lt;P&gt;There are a number of posts out there that talk about this but after reviewing them I found that none of them gave the whole picture.&amp;nbsp; They were all very good and they provided enough information to fill in many missing pieces but there was enough missing that I though it warranted looking at the whole picture.&lt;/P&gt;
&lt;P&gt;We are going to start by creating our own EndPointBehavior.&amp;nbsp; The EndPointBehavior allows us to inject custom functionality in the WCF execution pipeline.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;To create the EndPointBehavior we need to create a solution that references System.ServiceModel.dll and includes a class that derives from BehaviorExtensionElement, IWsdlExportExtension and IEndpointBehavior.&amp;nbsp; We need the functionality of the BehaviorExtensionElement to implement the configuration of the behavior, the functionality of the IWsdlExportExtension to change the generated WSDL and the functionality of the IEndPointBehavior to define the endpoint and its behavior.&lt;/P&gt;
&lt;P&gt;Lets add a class file to our solution called SoapHeaderEndpointBehavior.&amp;nbsp; After we create the class and inherit from our objects we need to add the following line of code to the ExportEndPoint method&lt;/P&gt;
&lt;P class=style6&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;SoapHeaderWsdlExport.ExportEndpoint(exporter,context);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;and we need to add the following two lines of code to the ApplyDispatchBehavior method. &lt;/P&gt;
&lt;P class=style6&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;SoapHeaderMessageInspector headerInspector = new SoapHeaderMessageInspector();&lt;BR&gt;endpointDispatcher.DispatchRuntime.MessageInspectors.Add(headerInspector);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Our code should look like this:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Collections;&lt;BR&gt;using System.Configuration;&lt;BR&gt;using System.Runtime.Serialization;&lt;BR&gt;using System.ServiceModel;&lt;BR&gt;using System.ServiceModel.Channels;&lt;BR&gt;using System.ServiceModel.Configuration;&lt;BR&gt;using System.ServiceModel.Description;&lt;BR&gt;using System.ServiceModel.Dispatcher;&lt;BR&gt;using System.Text;&lt;BR&gt;using System.Xml;&lt;BR&gt;using System.Xml.Schema;&lt;BR&gt;using System.Web.Services;&lt;BR&gt;using System.Web.Services.Description;&lt;BR&gt;using WsdlDescription = System.Web.Services.Description.ServiceDescription;&lt;BR&gt;&lt;BR&gt;namespace Services.WCF.ServiceBehavior&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class SoapHeaderEndpointBehavior : BehaviorExtensionElement, IWsdlExportExtension, IEndpointBehavior&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region BehaviorExtensionElement Members&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override Type BehaviorType&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return typeof(SoapHeaderEndpointBehavior);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override object CreateBehavior()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new SoapHeaderEndpointBehavior();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IWsdlExportExtension Members&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //throw new NotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style5&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SoapHeaderWsdlExport.ExportEndpoint(exporter,context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IEndpointBehavior Members&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //throw new NotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //throw new NotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SoapHeaderMessageInspector headerInspector = new SoapHeaderMessageInspector();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endpointDispatcher.DispatchRuntime.MessageInspectors.Add(headerInspector);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Validate(ServiceEndpoint endpoint)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //throw new NotImplementedException();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;When we added code to the ExportEndpoint method, we utilized a custom object.&amp;nbsp; Let's add another class to our solution to implement the SoapHeaderWsdlExport.&amp;nbsp; This class will add a header schema and its namespace, create and add a header message description and finally add the header to the operation.&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;BR&gt;using System.Text;&lt;BR&gt;using System.Xml.Schema;&lt;BR&gt;using System.Reflection;&lt;BR&gt;using System.Web.Services.Description;&lt;BR&gt;using System.Xml;&lt;BR&gt;using System.ServiceModel.Description;&lt;BR&gt;using WsdlDescription = System.Web.Services.Description.ServiceDescription;&lt;BR&gt;&lt;BR&gt;namespace Services.WCF.ServiceBehavior&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class SoapHeaderWsdlExport&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read the schema of the custom header message&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;XmlSchema customSoapHeaderSchema = XmlSchema.Read(Assembly.GetExecutingAssembly().GetManifestResourceStream("Services.WCF.ServiceBehavior.SoapHeader.xsd"), &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new ValidationEventHandler (SoapHeaderWsdlExport.ValidationCallBack));&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create the HeaderMessage to add to wsdl:message AND to refer to from wsdl:operation&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;System.Web.Services.Description.Message headerMessage = CreateHeaderMessage();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;foreach (WsdlDescription wsdl in exporter.GeneratedWsdlDocuments)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Add the schema of the CustomSoapHeader to the types AND add the namespace to the list of namespaces&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;wsdl.Types.Schemas.Add(customSoapHeaderSchema);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;wsdl.Namespaces.Add("sh", SoapHeaderNames.SoapHeaderNamespace);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The actual adding of the message to the list of messages&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;wsdl.Messages.Add(headerMessage);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;addHeaderToOperations(headerMessage, context);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static System.Web.Services.Description.Message CreateHeaderMessage()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create Message&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;System.Web.Services.Description.Message headerMessage = new System.Web.Services.Description.Message();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Set the name of the header message&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;headerMessage.Name = SoapHeaderNames.SoapHeaderName;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create the messagepart and add to the header message&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;MessagePart part = new MessagePart();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;part.Name = "Header";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;part.Element = new XmlQualifiedName(SoapHeaderNames.SoapHeaderName, SoapHeaderNames.SoapHeaderNamespace);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;headerMessage.Parts.Add(part);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return headerMessage;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static void addHeaderToOperations(System.Web.Services.Description.Message headerMessage, WsdlEndpointConversionContext context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create a XmlQualifiedName based on the header message, this will be used for binding the header message and the SoapHeaderBinding&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;XmlQualifiedName header = new XmlQualifiedName(headerMessage.Name, headerMessage.ServiceDescription.TargetNamespace);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;foreach (OperationBinding operation in context.WsdlBinding.Operations)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Add the SoapHeaderBinding to the MessageBinding&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;ExportMessageHeaderBinding(operation.Input, context, header, false);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;ExportMessageHeaderBinding(operation.Output, context, header, false);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static void ExportMessageHeaderBinding(MessageBinding messageBinding, WsdlEndpointConversionContext context, XmlQualifiedName header, bool isEncoded)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // For brevity, assume Soap12HeaderBinding for Soap 1.2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;SoapHeaderBinding binding = new Soap12HeaderBinding();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;binding.Part = "Header";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;binding.Message = header;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;binding.Use = isEncoded ? SoapBindingUse.Encoded : SoapBindingUse.Literal;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;messageBinding.Extensions.Add(binding);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static void ValidationCallBack(object sender, ValidationEventArgs args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (args.Severity == XmlSeverityType.Warning)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("\tWarning: Matching schema not found. No validation occurred." + args.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;Console.WriteLine("\tValidation error: " + args.Message);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;In the addHeaderToOperations method there are two calls to the ExportMessageHeaderBinding method.&amp;nbsp; The second call passes the operation.Output parameter which will pass the header back to the calling application with the response message.&amp;nbsp; This also also means that the method signature at the client will be to pass in the header object by Ref.&amp;nbsp; Since we needed the client to pass the header data into BizTalk we didn't need to echo the header back to the client so we deleted this line.&amp;nbsp; If you want to echo it back then keep this line (as shown in the code above).&lt;/P&gt;
&lt;P&gt;Also, in the code above, in the ExportEndpoint and CreateHeaderMessage methods there was another custom class called SoapHeaderNames.&amp;nbsp; This class contained the values that we wanted to place in the custom header.&amp;nbsp; By creating a class for this data we could limit the location of this information to one location.&amp;nbsp; The code for the SoapHeaderNames class looks like this:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;BR&gt;using System.Text;&lt;BR&gt;&lt;BR&gt;namespace Services.WCF.ServiceBehavior&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static class SoapHeaderNames&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String SoapHeaderName = "SoapHeader";&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String AppName = "App";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String UserName = "User";&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String SoapHeaderNamespace = &lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;A href="http://demo.wellmark.com/"&gt;&lt;FONT face="Courier New"&gt;http://servicebehavior.mycompany.com&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;Way back at the top, in the ApplyDispatchBehavior method of the SoapHeaderEndpointBehavior class we have a custom object called SoapHeaderMessageInspector.&amp;nbsp; Therefore, let's add another class for the SoapHeaderMessageInspector.&amp;nbsp; There are two methods that we must implement on the IDispatchMessageInspector and they are the AfterReceiveRequest and the BeforeReceiveRequest.&amp;nbsp; Since we are interested in applying the headers in the dynamic WSDL we will only need code in the BeforeReceiveRequest.&amp;nbsp; The code will look like this:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;BR&gt;using System.Text;&lt;BR&gt;using System.ServiceModel.Dispatcher;&lt;BR&gt;using System.ServiceModel;&lt;BR&gt;using System.Xml;&lt;BR&gt;&lt;BR&gt;namespace Services.WCF.ServiceBehavior&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class SoapHeaderMessageInspector: IDispatchMessageInspector&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IDispatchMessageInspector Members&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Look for my custom header in the request&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Int32 headerPosition = OperationContext.Current.IncomingMessageHeaders.FindHeader(SoapHeaderNames.SoapHeaderName, SoapHeaderNames.SoapHeaderNamespace);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get an XmlDictionaryReader to read the header content&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;XmlDictionaryReader reader = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(headerPosition);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read through its static method ReadHeader&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;SoapHeader header = SoapHeader.ReadHeader(reader);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (header != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Add the header from the request&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;reply.Headers.Add(header);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;#&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;endregion&lt;/SPAN&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;This code grabs the header section and will inject the header elements.&amp;nbsp; In the BeforeSendReply method you will see we are using a SoapHeader object.&amp;nbsp; This object contains the properties and methods to deal with the elements that we will be reading and writing to the header.&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;BR&gt;using System.Text;&lt;BR&gt;using System.Xml;&lt;BR&gt;using System.ServiceModel.Channels;&lt;BR&gt;&lt;BR&gt;namespace Services.WCF.ServiceBehavior&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;[&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;Serializable]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class SoapHeader: MessageHeader&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string _app;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string _user;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string App&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (this._app);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;this._app = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string User &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (this._user);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style5&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this._user = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SoapHeader()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SoapHeader(string app, string user)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style5&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this._app = app;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN class=style5&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this._user = user;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override string Name&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return (SoapHeaderNames.SoapHeaderName); }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override string Namespace&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return (SoapHeaderNames.SoapHeaderNamespace); }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void OnWriteHeaderContents(System.Xml.XmlDictionaryWriter writer, MessageVersion messageVersion)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write the content of the header directly using the XmlDictionaryWriter&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;writer.WriteElementString(SoapHeaderNames.AppName, this.App);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN class=style5&gt;writer.WriteElementString(SoapHeaderNames.UserName, this.User);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static SoapHeader ReadHeader(XmlDictionaryReader reader)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String app = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String user = null;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read the header content (key) using the XmlDictionaryReader&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (reader.ReadToDescendant(SoapHeaderNames.AppName, SoapHeaderNames.SoapHeaderNamespace))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; app = reader.ReadElementString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (reader.ReadToDescendant(SoapHeaderNames.UserName, SoapHeaderNames.SoapHeaderNamespace))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; user = reader.ReadElementString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!String.IsNullOrEmpty(app) &amp;amp;&amp;amp; !String.IsNullOrEmpty(user))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new SoapHeader(app, user);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;{&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;}&lt;SPAN class=style2&gt;&lt;BR&gt;&lt;/SPAN&gt;}&lt;/P&gt;
&lt;P&gt;There is also a schema, called SoapHeader.xsd, that needs to be added to the project as well.&amp;nbsp; This schema defines the message contract for the header and is referenced and used in the ExportEndpoint method of the SoapHeaderWsdlExport class and looks like this:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;&amp;lt;?xml version="1.0" encoding="utf-16"?&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://servicebehavior.mycompany.com" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://servicebehavior.mycompany.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;xs:element name="SoapHeader"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;xs:complexType&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;xs:sequence&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;xs:element name="App" type="xs:string" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;&lt;SPAN class=style1&gt;&lt;SPAN class=style5&gt;xs:element name="User" type="xs:string" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:sequence&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:complexType&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xs:element&amp;gt;&lt;BR&gt;&amp;lt;/xs:schema&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;At this point we have all the code that is part of our project.&amp;nbsp; Once this is compiled, we need to add the assembly to the machine config.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;There is an easy way to add entries by using the SvcConfigEditor.exe tool.&amp;nbsp; This tool is part of the Windows SDK and, if installed, can be found in the \Program Files\Microsoft SDKs\Windows\v6.0A\Bin directory.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Once this utility is open you can click on the File -&amp;gt;Open-&amp;gt;Config File menu item.&amp;nbsp; Open the machine.config file.&amp;nbsp; At the bottom of the tree view on the left side you will see an Advanced folder.&amp;nbsp; Expand that node and expand the the Extensions folder.&amp;nbsp; Click on the the 'behavior element extensions' node.&amp;nbsp; At the bottom right, click on the new button.&amp;nbsp; This will bring up the Extension Configuration Element Editor dialog box.&amp;nbsp; Enter the name you wish to give to your extension and then click on the ellipses next to type.&amp;nbsp; This will bring up the Type Browser dialog box.&amp;nbsp; Browse to your component (also note that you can select assemblies already placed in the GAC).&amp;nbsp; Once selected, your fully qualified assembly name will be entered.&amp;nbsp; Select Save under the File menu.&amp;nbsp; You are now ready to start using the new behavior.&lt;/P&gt;
&lt;P&gt;Up to this point everything we have done has been specifically WCF functionality.&amp;nbsp; The next paragraph will outline how we can utilized this behavior in a BizTalk WCF endpoint.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Create a WCF endpoint in BizTalk (if you need more information on creating a WCF endpoint check out the docs on MSDN (Insert Link)).&amp;nbsp; One thing to keep in mind is that when you create a WCF end point in BizTalk using one of the standard bindings you will not have the option to specify a behavior.&amp;nbsp; In order to specify a behavior you need to specify either the WCF-Custom or WCF-CustomIsolated binding.&amp;nbsp; Once you select the binding type, click on the Configure button and the Transport Properties dialog will appear.&amp;nbsp; Select the Behavior tab and then right click on the the Endpoint Behavior node.&amp;nbsp; Once the popup menu appears, select Add extension.&amp;nbsp; Select your behavior from the Select Behavior Extensions dialog box and click OK.&amp;nbsp; Enter the rest of the specific information you need for the end point and click OK to save your endpoint.&lt;/P&gt;
&lt;P&gt;We have now done everything that is needed to create a custom behavior including the ability to link into the dynamic WSDL creation process at run time, register the behavior and finally to use the behavior. &lt;/P&gt;
&lt;P&gt;Now, when you create a client against the end point you will see that there will be two parameters for the web method call.&amp;nbsp; The first will be the custom header and the second will be the message body.&amp;nbsp; When we look in the object browser for the header object we will see that the two items appear that we defined in our behavior.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;As I said at the beginning of this post, this will be a three part series.&amp;nbsp; What we have not covered is the ability to accept these header values from the client and promote or write the values to the context (part 2) and we have not covered the ability to create a behavior that exposes the properties through configuration to let you dynamically, per end point, set the header items (part 3).&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9658649" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/WCF/">WCF</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item><item><title>Pro BizTalk 2009 Book</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/05/07/pro-biztalk-2009-book.aspx</link><pubDate>Thu, 07 May 2009 08:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592914</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9592914</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/05/07/pro-biztalk-2009-book.aspx#comments</comments><description>&lt;P&gt;I have just submitted my chapters for the new &lt;A href="http://www.apress.com/book/view/1430219815" mce_href="http://www.apress.com/book/view/1430219815"&gt;Pro BizTalk 2009&lt;/A&gt; book from APress.&amp;nbsp; You can also find information about the book on &lt;A href="http://www.amazon.com/Pro-BizTalk-2009-George-Dunphy/dp/1430219815/ref=sr_1_9?ie=UTF8&amp;amp;s=books&amp;amp;qid=1241624145&amp;amp;sr=8-9" mce_href="http://www.amazon.com/Pro-BizTalk-2009-George-Dunphy/dp/1430219815/ref=sr_1_9?ie=UTF8&amp;amp;s=books&amp;amp;qid=1241624145&amp;amp;sr=8-9"&gt;Amazon&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;I am co-authoring along with George Dunphy, Harold Campos, Peter Kelcey, Sergei Moukhnitski and David Peterson.&lt;/P&gt;
&lt;P&gt;&lt;IMG class=style1 height=240 alt="" src="http://blogs.msdn.com/photos/skaufman/images/9592902/original.aspx" width=240 mce_src="http://blogs.msdn.com/photos/skaufman/images/9592902/original.aspx"&gt;&lt;/P&gt;
&lt;P&gt;The book will be available this summer.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9592914" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category></item><item><title>I will be speaking at TechEd 2009</title><link>http://blogs.msdn.com/b/skaufman/archive/2009/03/18/i-will-be-speaking-at-teched-2009.aspx</link><pubDate>Thu, 19 Mar 2009 04:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9488685</guid><dc:creator>Stephen Kaufman</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/skaufman/rsscomments.aspx?WeblogPostID=9488685</wfw:commentRss><comments>http://blogs.msdn.com/b/skaufman/archive/2009/03/18/i-will-be-speaking-at-teched-2009.aspx#comments</comments><description>&lt;IMG alt="" src="http://blogs.msdn.com/photos/skaufman/images/9488652/original.aspx" mce_src="http://blogs.msdn.com/photos/skaufman/images/9488652/original.aspx"&gt; 
&lt;P&gt;I will be speaking at TechEd 2009 in Los Angeles.&lt;/P&gt;
&lt;P&gt;I will be presenting two sessions and doing demos at a third.&lt;/P&gt;
&lt;P&gt;My first presentation will be on 'Application Lifecycle Management Experience for BizTalk Server 2009 Developers'.&lt;/P&gt;
&lt;P&gt;My second presentation will&amp;nbsp; be a 'Deep Dive with Microsoft BizTalk Server 2009 Development Platform'.&lt;/P&gt;
&lt;P&gt;The demo will be done with &lt;A class="" href="http://blogs.msdn.com/dannyg/" mce_href="http://blogs.msdn.com/dannyg/"&gt;Danny Garber&lt;/A&gt; and will demo an application featuring the new capabilities of BizTalk Server 2009, Windows Azure Service Platform, the Live Framework, .NET Services, the new ESB Guidance v2.0 and the new Managed Services Engine (MSE) 7.0&lt;/P&gt;
&lt;P&gt;If you are going to be there stop by and say hello.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9488685" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/BizTalk/">BizTalk</category><category domain="http://blogs.msdn.com/b/skaufman/archive/tags/-NET/">.NET</category></item></channel></rss>
