<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUAFRnkyeCp7ImA9WhRbGEw.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940</id><updated>2012-02-09T18:55:17.790Z</updated><category term="BizTalk Server" /><category term="Bug" /><category term="Windows Communication Foundation" /><category term="ClickOnce" /><category term=".NET Framework" /><category term="Strong Names" /><category term="General" /><category term="Undropping a SQL Server Table" /><category term="System.Data" /><category term="XML Serialisation" /><category term="SQL Server" /><title>Ian Picknell - Under the Covers</title><subtitle type="html">Delving under the covers of various Microsoft development tools and technologies to provide information you won't find in the documentation.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://ianpicknell.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default?start-index=11&amp;max-results=10&amp;redirect=false&amp;v=2" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>10</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ianpicknell" /><feedburner:info uri="ianpicknell" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DkYFQXo6cCp7ImA9WhRREE4.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-7277592069656697676</id><published>2011-11-23T07:41:00.000Z</published><updated>2011-11-23T07:41:50.418Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-23T07:41:50.418Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title>Execute Procedure for XML Auto</title><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
  For several years now, SQL Server has had the ability to convert the results of an arbitrary SELECT statement into
  XML by appending the &lt;em&gt;FOR XML AUTO&lt;/em&gt; clause. For example, whilst:
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;SELECT&lt;/span&gt; &lt;span style="color:blue"&gt;TOP&lt;/span&gt; 10 &lt;span style="color:gray"&gt;*&lt;/span&gt; &lt;span style="color:blue"&gt;FROM&lt;/span&gt; &lt;span style="color:green"&gt;sys&lt;/span&gt;&lt;span style="color:gray"&gt;.&lt;/span&gt;&lt;span style="color:green"&gt;types&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  generates a standard rowset:
&lt;/p&gt;
&lt;table style="font-family:MS Sans Serif,Sans-Serif"&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;system_type_id&lt;/td&gt;&lt;td&gt;user_type_id&lt;/td&gt;&lt;td&gt;schema_id&lt;/td&gt;&lt;td&gt;principal_id&lt;/td&gt;&lt;td&gt;max_length&lt;/td&gt;&lt;td&gt;precision&lt;/td&gt;&lt;td&gt;scale&lt;/td&gt;&lt;td&gt;collation_name&lt;/td&gt;&lt;td&gt;is_nullable&lt;/td&gt;&lt;td&gt;is_user_defined&lt;/td&gt;&lt;td&gt;is_assembly_type&lt;/td&gt;&lt;td&gt;default_object_id&lt;/td&gt;&lt;td&gt;rule_object_id&lt;/td&gt;&lt;td&gt;is_table_type&lt;/td&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;image&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;text&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;Latin1_General_CI_AS&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;uniqueidentifier&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;date&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;time&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;datetime2&lt;/td&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;datetimeoffset&lt;/td&gt;&lt;td&gt;43&lt;/td&gt;&lt;td&gt;43&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;tinyint&lt;/td&gt;&lt;td&gt;48&lt;/td&gt;&lt;td&gt;48&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;smallint&lt;/td&gt;&lt;td&gt;52&lt;/td&gt;&lt;td&gt;52&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;56&lt;/td&gt;&lt;td&gt;56&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
  simply appending a FOR XML clause (in this case FOR XML &lt;em&gt;AUTO&lt;/em&gt;):
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;SELECT&lt;/span&gt; &lt;span style="color:blue"&gt;TOP&lt;/span&gt; 10 &lt;span style="color:gray"&gt;*&lt;/span&gt; &lt;span style="color:blue"&gt;FROM&lt;/span&gt; &lt;span style="color:green"&gt;sys&lt;/span&gt;&lt;span style="color:gray"&gt;.&lt;/span&gt;&lt;span style="color:green"&gt;types&lt;/span&gt; &lt;span style="color:blue"&gt;FOR&lt;/span&gt; &lt;span style="color:blue"&gt;XML&lt;/span&gt; &lt;span style="color:blue"&gt;AUTO&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  generates an XML fragment instead:
&lt;/p&gt;
&lt;table style="font-family:MS Sans Serif,Sans-Serif"&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;td&gt;XML_F52E2B61-18A1-11d1-B105-00805F49916B&lt;/td&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td nowrap="nowrap" style="color:blue; text-decoration:underline;"&gt;&amp;lt;sys.types name="image" system_type_id="34" user_type_id="34" schema_id="4" max_length="16" precision="0" scale="0" is_nullable="1" is_user_defined="0" is_assembly_type="0" default_object_id="0" rule_object_id="0" is_table_type="0"/&amp;gt;&amp;lt;sys.types name="text" system_type_id="35" user_type_id="35" schema_id="4" max_length="16" precision="0" scale="0" collation_name="Latin1_General_CI_AS" is_nullable="1" is_user_defined="0" is_assembly_type="0" default_object_id="0" rule_object_id="0" is_table_type="0"/&amp;gt;&amp;lt;sys.types name="uniqueidentifier" system_type_id="36" user_type_id="36" schema_id="4" max_length="16" precision="0" scale="0" is_nullable="1" is_user_defined="0" is_assembly_type="0" default_object_id="0" rule_object_id="0" is_table_type="0"/&amp;gt;&amp;lt;sys.types name="date" system_type_id="40" user_type_id="40" schema_id="4" max_length="3" precision="10" scale="0" is_nullable="1" is_user_defined="0" is_assembly_type="0" default_object_id="0" rule_object_id="0" is_table_type="0"/&amp;gt;&amp;lt;sys.types name="time" system_type_id="41" user_type_id="41" schema_id="4" max_length="5" precision="16" scale="7" is_nullable="1" is_user_defined="0" is_assembly_type="0" default_object_id="0" rule_object_id="0" is_table_type="0"/&amp;gt;&amp;lt;sys.types name="datetime2" system_type_id="42" user_type_id="42" schema_id="4" max_length="8" precision="27" scale="7" is_nullable="1" is_user_defined="0" is_assembly_type="0" default_object_id="0" rule_object_id="0" is_table_type="0"/&amp;gt;&amp;lt;sys.types name="datetimeoffset" system_type_id="43" user_type_id="43" schema_id="4" max_length="10" precision="34" scale="7" is_nullable="1" is_user_defined="0" is_assembly_type="0" default_object_id="0" rule_object_id="0" is_table_type="0"/&amp;gt;&amp;lt;sys.types name="tinyint" system_type_id="48" user_type_id="48" schema_id="4" max_length="1" precision="3" scale="0" is_nullable="1" is_user_defined="0" is_assembly_type="0" default_object_id="0" rule_object_id="0" is_table_type="0"/&amp;gt;&amp;lt;sys.types name="smallint" system_type_id="52" user_type_id="52" schema_id="4" max_length="2" precision="5"&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
  Clicking on the hyperlink shows you the full XML fragment in all its glory:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;image&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;34&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;34&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;16&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;text&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;35&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;35&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;16&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;collation_name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;Latin1_General_CI_AS&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;uniqueidentifier&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;36&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;36&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;16&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;date&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;40&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;40&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;3&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;10&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;time&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;41&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;41&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;5&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;16&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;7&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;datetime2&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;42&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;42&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;8&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;27&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;7&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;datetimeoffset&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;43&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;43&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;10&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;34&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;7&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;tinyint&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;48&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;48&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;3&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;smallint&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;52&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;52&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;2&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;5&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sys.types&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;system_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;56&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;user_type_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;56&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;schema_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;max_length&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;4&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;precision&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;10&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;scale&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_nullable&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_user_defined&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_assembly_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;default_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;rule_object_id&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;is_table_type&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;
  Note that I've referred to this as an XML &lt;i&gt;fragment&lt;/i&gt; as it contains no root element. We can add one if we like
  by modifying the FOR XML AUTO clause, but I want to keep this as vanilla as possible.
&lt;/p&gt;
&lt;p&gt;
  Now comes the tricky part - image the data you want to return as XML isn't available directly from a table or view,
  but is selected by a stored procedure. How you you select that that data as XML?
&lt;/p&gt;
&lt;p&gt;  
  Well, one option is simply to update the stored procedure such that it selects XML by adding a FOR XML clause within
  the procedure itself. But that'll break existing callers of the stored procedure.
&lt;/p&gt;
&lt;p&gt;
  You could copy/paste the stored procedure into a new one, and alter the new one to select XML. But that creates a
  maintenance burden as every time one stored procedure it changed, someone needs to remember to change the other
  one too to keep them in sync.
&lt;/p&gt;
&lt;p&gt;
  You could wrap one stored procedure in another. So your new stored procedures creates a temporary table, or perhaps
  a table variable, and does a INSERT INTO ... EXEC to populate the table with the results of the actual stored
  procedure, then selects the results from the temporary table with a FOR XML clause. For a lot of people, this is
  the option that'll work best. But it relies on the 'outer' stored procedure knowing the exact structure of the
  rowset selected by the 'inner' stored procedure, which may change at some point in the future. It's a solution
  which only works for the one stored procedure it's been coded for.
&lt;/p&gt;
&lt;p&gt;
  Isn't there a more flexible, generic solution? Yes there is...
&lt;/p&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;h2&gt;Managed Stored Procedures&lt;/h2&gt;
&lt;p&gt;
  Since SQL Server 2005 we've been able to create stored procedures in managed code (i.e. in .NET) rather than just
  in Transact-SQL. By creating the 'outer' stored procedure mentioned above in managed code, we can have it operate
  in an entirely generic manner. This means we can call any existing stored procedure, without modifying it, and have
  the results returned to us as XML. Here's how:
&lt;/p&gt;
&lt;p&gt;
  1. In Visual Studio (I'm using 2010, but 2008 or even 2005 should be fine) create a new Class Library project (I
  called mine SqlServerClr) and re-name the default Class1.cs to StoredProcedures.cs.
&lt;/p&gt;
&lt;p&gt;
  2. Use Project Properties to ensure the Target Framework is .NET Framework 2.0.
&lt;/p&gt;
&lt;p&gt;
  3. Replace the contents of the StoredProcedures class with:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style="color:blue"&gt;using&lt;/span&gt;&lt;span&gt; System;&lt;/span&gt;
&lt;span style="color:blue"&gt;using&lt;/span&gt;&lt;span&gt; System.Data;&lt;/span&gt;
&lt;span style="color:blue"&gt;using&lt;/span&gt;&lt;span&gt; System.Data.SqlClient;&lt;/span&gt;
&lt;span style="color:blue"&gt;using&lt;/span&gt;&lt;span&gt; System.Data.SqlTypes;&lt;/span&gt;
&lt;span style="color:blue"&gt;using&lt;/span&gt;&lt;span&gt; Microsoft.SqlServer.Server;&lt;/span&gt;

&lt;span style="color:blue"&gt;namespace&lt;/span&gt;&lt;span&gt; SqlServerClr&lt;/span&gt;
&lt;span&gt;{&lt;/span&gt;
  &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
  &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; Servers as a container for Common Language Runtime (CLR) stored procedures.&lt;/span&gt;
  &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;partial&lt;/span&gt; &lt;span style="color:blue"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;StoredProcedures&lt;/span&gt;
  {
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; Mimics the effect of a FOR XML AUTO clause having been applied to a stored procedure.&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;param name=&amp;quot;procedureName&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt;The name of the stored procedure to execute.&lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;param name=&amp;quot;parameters&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt;Any parameters which should be passed to the procedure.&lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;para&amp;gt;&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; The statement executed by this procedure is &amp;quot;EXECUTE [&lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt;procedureName&lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt;] &lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;span style="color:gray"&gt;&amp;lt;i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt;parameters&lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt;&amp;quot;; the&lt;/span&gt; text in &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt;parameters&lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt; should be formatted accordingly.&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; For example, &amp;quot;&amp;#39;07 Jun 1969&amp;#39;&amp;quot; or &amp;quot;1234, &amp;#39;Spa%&amp;#39;&amp;quot;.&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/para&amp;gt;&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;para&amp;gt;&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; This code is vulnerable to a SQL injection attack and should not be used in situations where&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; either &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt;procedureName&lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt; or &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt;parameters&lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span style="color:green"&gt; are supplied by end-users without thorough&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; input validation.&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/para&amp;gt;&lt;/span&gt;
    &lt;span style="color:gray"&gt;///&lt;/span&gt;&lt;span style="color:green"&gt; &lt;/span&gt;&lt;span style="color:gray"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; ExecuteProcedureForXmlAuto(&lt;span style="color:blue"&gt;string&lt;/span&gt; procedureName, &lt;span style="color:blue"&gt;string&lt;/span&gt; parameters)
    {
      &lt;span style="color:green"&gt;// validate our inputs&lt;/span&gt;
      &lt;span style="color:blue"&gt;if&lt;/span&gt; (&lt;span style="color:blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(procedureName))
      {
        &lt;span style="color:blue"&gt;throw&lt;/span&gt; &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2B91AF"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;procedureName&amp;quot;&lt;/span&gt;);
      }
      &lt;span style="color:blue"&gt;if&lt;/span&gt; (procedureName.IndexOfAny(&lt;span style="color:blue"&gt;new&lt;/span&gt;[] {&lt;span style="color:#A31515"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;,&lt;span style="color:#A31515"&gt;&amp;#39;]&amp;#39;&lt;/span&gt;,&lt;span style="color:#A31515"&gt;&amp;#39;&amp;quot;&amp;#39;&lt;/span&gt;}) != -1)
      {
        &lt;span style="color:blue"&gt;throw&lt;/span&gt; &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;The name of the stored procedure must not be delimited.&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515"&gt;&amp;quot;procedureName&amp;quot;&lt;/span&gt;);
      }

      &lt;span style="color:green"&gt;// establish a connection to the server within which stored procedure is running&lt;/span&gt;
      &lt;span style="color:blue"&gt;using&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;SqlConnection&lt;/span&gt; sqlConnection = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlConnection&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;context connection=true&amp;quot;&lt;/span&gt;))
      {
        sqlConnection.Open();
        &lt;span style="color:green"&gt;// create a memory stream into which we can write our XML&lt;/span&gt;
        &lt;span style="color:blue"&gt;using&lt;/span&gt; (System.IO.&lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue"&gt;new&lt;/span&gt; System.IO.&lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt;())
        {
          &lt;span style="color:green"&gt;// we&amp;#39;ll need an XmlTextWriter with which to write into the memory stream&lt;/span&gt;
          System.Xml.&lt;span style="color:#2B91AF"&gt;XmlTextWriter&lt;/span&gt; xmlTextWriter = &lt;span style="color:blue"&gt;new&lt;/span&gt; System.Xml.&lt;span style="color:#2B91AF"&gt;XmlTextWriter&lt;/span&gt;(memoryStream, System.Text.&lt;span style="color:#2B91AF"&gt;Encoding&lt;/span&gt;.Unicode);

          &lt;span style="color:green"&gt;// create the command we&amp;#39;re going to execute&lt;/span&gt;
          &lt;span style="color:blue"&gt;string&lt;/span&gt; commandText = &lt;span style="color:blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#A31515"&gt;&amp;quot;EXECUTE [{0}] {1}&amp;quot;&lt;/span&gt;, procedureName, parameters);
          &lt;span style="color:blue"&gt;using&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt; sqlCommand = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt;(commandText, sqlConnection))
          {
            &lt;span style="color:green"&gt;// execute the command, obtaining a SqlDataReader with which to read the results&lt;/span&gt;
            &lt;span style="color:blue"&gt;using&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;SqlDataReader&lt;/span&gt; sqlDataReader = sqlCommand.ExecuteReader())
            {
              &lt;span style="color:green"&gt;// load the contents of the SqlDataReader, as XML, into a MemoryStream&lt;/span&gt;
              &lt;span style="color:blue"&gt;while&lt;/span&gt; (sqlDataReader.Read())
              {
                xmlTextWriter.WriteStartElement(procedureName);
                &lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; ordinal = 0; ordinal &amp;lt; sqlDataReader.FieldCount; ordinal++)
                {
                  &lt;span style="color:green"&gt;// omit null values from the output&lt;/span&gt;
                  &lt;span style="color:blue"&gt;if&lt;/span&gt; (sqlDataReader.IsDBNull(ordinal) == &lt;span style="color:blue"&gt;false&lt;/span&gt;)
                  {
                    &lt;span style="color:blue"&gt;string&lt;/span&gt; attributeValue;
                    &lt;span style="color:blue"&gt;switch&lt;/span&gt; (sqlDataReader.GetDataTypeName(ordinal))
                    {
                      &lt;span style="color:blue"&gt;case&lt;/span&gt; &lt;span style="color:#A31515"&gt;&amp;quot;datetime&amp;quot;&lt;/span&gt;:
                        &lt;span style="color:green"&gt;// we can&amp;#39;t use &amp;quot;s&amp;quot;, the ISO 8601 format, as it omits the three-digit&lt;/span&gt;
                        &lt;span style="color:green"&gt;// seconds fraction which FOR XML AUTO uses&lt;/span&gt;
                        attributeValue = sqlDataReader.GetDateTime(ordinal).ToString(&lt;span style="color:#A31515"&gt;&amp;quot;yyyy-MM-ddTHH:mm:ss.fff&amp;quot;&lt;/span&gt;, System.Globalization.&lt;span style="color:#2B91AF"&gt;CultureInfo&lt;/span&gt;.CurrentCulture);
                        &lt;span style="color:blue"&gt;break&lt;/span&gt;;
                      &lt;span style="color:blue"&gt;case&lt;/span&gt; &lt;span style="color:#A31515"&gt;&amp;quot;float&amp;quot;&lt;/span&gt;:
                        &lt;span style="color:green"&gt;// use a exponential format, with 15 digits after the decimal point&lt;/span&gt;
                        attributeValue = sqlDataReader.GetDouble(ordinal).ToString(&lt;span style="color:#A31515"&gt;&amp;quot;e15&amp;quot;&lt;/span&gt;, System.Globalization.&lt;span style="color:#2B91AF"&gt;CultureInfo&lt;/span&gt;.CurrentCulture);
                        &lt;span style="color:blue"&gt;break&lt;/span&gt;;
                      &lt;span style="color:blue"&gt;case&lt;/span&gt; &lt;span style="color:#A31515"&gt;&amp;quot;bit&amp;quot;&lt;/span&gt;:
                        attributeValue = sqlDataReader.GetBoolean(ordinal) ? &lt;span style="color:#A31515"&gt;&amp;quot;1&amp;quot;&lt;/span&gt; : &lt;span style="color:#A31515"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;;
                        &lt;span style="color:blue"&gt;break&lt;/span&gt;;
                      &lt;span style="color:blue"&gt;default&lt;/span&gt;:
                        attributeValue = sqlDataReader.GetValue(ordinal).ToString().Trim();
                        &lt;span style="color:blue"&gt;break&lt;/span&gt;;
                    }
                    xmlTextWriter.WriteAttributeString(sqlDataReader.GetName(ordinal), attributeValue);
                  }
                }
                xmlTextWriter.WriteEndElement();
              }
              xmlTextWriter.Flush();
              memoryStream.Position = 0L;
            }
          }

          &lt;span style="color:green"&gt;// send a row of meta-data back to SQL Server&lt;/span&gt;
          &lt;span style="color:blue"&gt;string&lt;/span&gt; outputColumnName = &lt;span style="color:#A31515"&gt;&amp;quot;XML_&amp;quot;&lt;/span&gt; + System.&lt;span style="color:#2B91AF"&gt;Guid&lt;/span&gt;.NewGuid().ToString().ToUpper(System.Globalization.&lt;span style="color:#2B91AF"&gt;CultureInfo&lt;/span&gt;.CurrentCulture);
          &lt;span style="color:#2B91AF"&gt;SqlDataRecord&lt;/span&gt; sqlDataRecord = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlDataRecord&lt;/span&gt;(&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlMetaData&lt;/span&gt;(outputColumnName, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Xml));
          &lt;span style="color:#2B91AF"&gt;SqlContext&lt;/span&gt;.Pipe.SendResultsStart(sqlDataRecord);

          &lt;span style="color:green"&gt;// now send the XML itself in a single row&lt;/span&gt;
          &lt;span style="color:#2B91AF"&gt;SqlXml&lt;/span&gt; sqlXml = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlXml&lt;/span&gt;(memoryStream);
          sqlDataRecord.SetSqlXml(0, sqlXml);
          &lt;span style="color:#2B91AF"&gt;SqlContext&lt;/span&gt;.Pipe.SendResultsRow(sqlDataRecord);

          &lt;span style="color:green"&gt;// end the sending of results back to SQL Server&lt;/span&gt;
          &lt;span style="color:#2B91AF"&gt;SqlContext&lt;/span&gt;.Pipe.SendResultsEnd();
        }
      }
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;
  4. Build the project.
&lt;/p&gt;
&lt;p&gt;
  5. Fire up SQL Server Management Studio (or whatever Microsoft have re-named it to by the time you read this).
&lt;/p&gt;
&lt;p&gt;
  6. Open a new Query window, and select the database in which you wish the CLR stored procedure to be created.
&lt;/p&gt;
&lt;p&gt;
  7. Enable the CLR for your instance of SQL Server as follows (it doesn't matter if it's already enabled):
&lt;/p&gt;
&lt;pre&gt;
&lt;span style="color:blue"&gt;EXEC&lt;/span&gt; &lt;span style="color:maroon"&gt;sp_configure&lt;/span&gt; &lt;span style="color:red"&gt;&amp;#39;clr enabled&amp;#39;&lt;/span&gt;&lt;span style="color:gray"&gt;,&lt;/span&gt; &lt;span style="color:red"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;
&lt;span style="color:blue"&gt;GO&lt;/span&gt;
&lt;span style="color:blue"&gt;RECONFIGURE&lt;/span&gt;
&lt;span style="color:blue"&gt;GO&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  8. Load the assembly into SQL Server:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style="color:blue"&gt;CREATE&lt;/span&gt; &lt;span style="color:blue"&gt;ASSEMBLY&lt;/span&gt; SqlServerClrAssembly
&lt;span style="color:blue"&gt;FROM&lt;/span&gt; &lt;span style="color:red"&gt;&amp;#39;C:\Users\Ian.Picknell\Documents\Blog\SQL Server\Execute Procedure For XML Auto\SqlServerClr\bin\Debug\SqlServerClr.dll&amp;#39;&lt;/span&gt;
&lt;span style="color:blue"&gt;WITH&lt;/span&gt; &lt;span style="color:blue"&gt;PERMISSION_SET&lt;/span&gt; &lt;span style="color:gray"&gt;=&lt;/span&gt; &lt;span style="color:blue"&gt;SAFE&lt;/span&gt;
&lt;span style="color:blue"&gt;GO&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  9. Provide SQL Server with details of the stored procedure within the assembly (specifically its name and parameters).
&lt;/p&gt;
&lt;pre&gt;
&lt;span style="color:blue"&gt;CREATE&lt;/span&gt; &lt;span style="color:blue"&gt;PROCEDURE&lt;/span&gt; dbo&lt;span style="color:gray"&gt;.&lt;/span&gt;ExecuteProcedureForXmlAuto
&lt;span style="color:gray"&gt;(&lt;/span&gt;
  @ProcedureName &lt;span style="color:blue"&gt;NVARCHAR&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;128&lt;span style="color:gray"&gt;),&lt;/span&gt;
  @Parameters    &lt;span style="color:blue"&gt;NVARCHAR&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;4000&lt;span style="color:gray"&gt;)&lt;/span&gt; &lt;span style="color:gray"&gt;=&lt;/span&gt; &lt;span style="color:gray"&gt;NULL&lt;/span&gt;
&lt;span style="color:gray"&gt;)&lt;/span&gt;
&lt;span style="color:blue"&gt;AS&lt;/span&gt; &lt;span style="color:blue"&gt;EXTERNAL&lt;/span&gt; NAME SqlServerClrAssembly&lt;span style="color:gray"&gt;.&lt;/span&gt;[SqlServerClr.StoredProcedures]&lt;span style="color:gray"&gt;.&lt;/span&gt;ExecuteProcedureForXmlAuto&lt;span style="color:gray"&gt;;&lt;/span&gt;
&lt;span style="color:blue"&gt;GO&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Note that the format of the 'AS' clause in this context is AS EXTERNAL NAME &lt;i&gt;assembly_name&lt;/i&gt;.&lt;i&gt;class_name&lt;/i&gt;.&lt;i&gt;method_name&lt;/i&gt;.
The &lt;i&gt;class_name&lt;/i&gt; component must be a valid SQL Server identifier - so you'll almost always have to use delimters here.
&lt;/p&gt;
&lt;p&gt;
10. Call your target stored procedure 'through' the ExecuteProcedureForXmlAuto wrapper. For example:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style="color:blue"&gt;EXEC&lt;/span&gt; dbo&lt;span style="color:gray"&gt;.&lt;/span&gt;ExecuteProcedureForXmlAuto &lt;span style="color:red"&gt;&amp;#39;sp_configure&amp;#39;&lt;/span&gt;
&lt;span style="color:blue"&gt;GO&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
The above statement produced the following:
&lt;/p&gt;
&lt;table style="font-family:MS Sans Serif,Sans-Serif"&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;td&gt;XML_880017D4-254D-4287-9B9E-496D10CA0C82&lt;/td&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td nowrap="nowrap" style="color:blue; text-decoration:underline;"&gt;&amp;lt;sp_configure name="allow updates" minimum="0" maximum="1" config_value="0" run_value="0" /&amp;gt;&amp;lt;sp_configure name="backup compression default" minimum="0" maximum="1" config_value="0" run_value="0" /&amp;gt;&amp;lt;sp_configure name="clr enabled" minimum="0" maximum="1" config_value="1" run_value="1" /&amp;gt;&amp;lt;sp_configure name="cross db ownership chaining" minimum="0" maximum="1" config_value="0" run_value="0" /&amp;gt;&amp;lt;sp_configure name="default language" minimum="0" maximum="9999" config_value="0" run_value="0" /&amp;gt;&amp;lt;sp_configure name="filestream access level" minimum="0" maximum="2" config_value="0" run_value="0" /&amp;gt;&amp;lt;sp_configure name="max text repl size (B)" minimum="-1" maximum="2147483647" config_value="65536" run_value="65536" /&amp;gt;&amp;lt;sp_configure name="nested triggers" minimum="0" maximum="1" config_value="1" run_value="1" /&amp;gt;&amp;lt;sp_configure name="remote access" minimum="0" maximum="1" config_value="1" run_value="1" /&amp;gt;&amp;lt;sp_configure name="remote admin connections" minimum="0" maximum="1" config_value="0" run_value="0" /&amp;gt;&amp;lt;sp_configure name="remote login timeout (s)" minimum="0" maximum="2147483647" config_value="20" run_value="20" /&amp;gt;&amp;lt;sp_configure name="remote proc trans" minimum="0" maximum="1" config_value="0" run_value="0" /&amp;gt;&amp;lt;sp_configure name="remote query timeout (s)" minimum="0" maximum="2147483647" config_value="600" run_value="600" /&amp;gt;&amp;lt;sp_configure name="server trigger recursion" minimum="0" maximum="1" config_value="1" run_value="1" /&amp;gt;&amp;lt;sp_configure name="show advanced options" minimum="0" maximum="1" config_value="0" run_value="0" /&amp;gt;&amp;lt;sp_configure name="user options" minimum="0" maximum="32767" config_value="0" run_value="0" /&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
  Clicking the hyperlink then gives you XML which is (to my eye) identical to that produced by a genuine FOR XML AUTO clause:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;allow updates&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;backup compression default&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;clr enabled&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;cross db ownership chaining&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;default language&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;9999&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;filestream access level&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;2&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;max text repl size (B)&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;-1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span  style="color:blue"&gt;2147483647&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;65536&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;65536&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;nested triggers&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;remote access&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;remote admin connections&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;remote login timeout (s)&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;2147483647&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;20&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;20&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;remote proc trans&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;remote query timeout (s)&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;2147483647&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;600&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;600&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;server trigger recursion&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;show advanced options&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515"&gt;sp_configure&lt;/span&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;span style=""&gt;&amp;quot;&lt;span style="color:blue"&gt;user options&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;minimum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;maximum&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;32767&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;config_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;run_value&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;
  There probably aren't a huge number of scenarios where you have an existing stored procedure which produces a rowset, but now 
  need to get XML from it instead. I originally wrote a version of the above CLR stored procedure for use with BizTalk Server 2006,
  which required that data be returned from SQL Server as XML and my brief was that the messaging application I was developing must
  be capable of sourcing data from any existing stored procedure. ExecuteProcedureForXmlAuto fit the bill perfectly.
&lt;/p&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/04/validating-integers-in-sql-server.html"&gt;Validating Integers in SQL Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-7277592069656697676?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/GM38tDzgaSk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/7277592069656697676/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2011/11/execute-procedure-for-xml-auto.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/7277592069656697676?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/7277592069656697676?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/GM38tDzgaSk/execute-procedure-for-xml-auto.html" title="Execute Procedure for XML Auto" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2011/11/execute-procedure-for-xml-auto.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8DQnsyeyp7ImA9WhZSFE4.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-7666897233118191659</id><published>2011-03-29T23:08:00.001+01:00</published><updated>2011-03-29T23:14:33.593+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-29T23:14:33.593+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows Communication Foundation" /><title>Implementing IDispatchMessageInspector</title><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
  Have you ever needed to change the contract used by WCF service, but were held back by the impact it would have on
  existing clients? Sure, you could just ask your clients to update their service references and tweak the code which
  calls your service, but that requires that all your clients (of which there might be many) to do a code release on
  the same day you release your new server - not ideal.
&lt;/p&gt;
&lt;p&gt;
  One way to resolve this would be to leave the existing contract alone, but to create a second modified contract exposed
  via a new endpoint. That way clients could upgrade to the new contract (and the new endpoint) at their leisure. This will
  probably create some redundancy in the server-side code, as you'd have very similar code at both endpoints, although you
  could probably refactor any common code such that it was shared. There's also a risk that this approach would lead to
  end-point proliferation over time as you make various tweaks to the contract. So, is there an an alternative?
&lt;/p&gt;
&lt;p&gt;
  One approach which I used recently, and which is the subject of this post, is to &lt;b&gt;intercept the calls which use the old
  contract and transform them into a call to the new contract on-the-fly&lt;/b&gt;. WCF has an extensibility interface designed just
  for this purpose - &lt;b&gt;IDispatchMessageInspector&lt;/b&gt;. Note that, despite its name, implementing this interface allows us to both
  inspect &lt;i&gt;and modify&lt;/i&gt; inbound and outbound messages.
&lt;/p&gt;
&lt;p&gt;
  To demonstrate this approach I'm going to:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;create a WCF Service exposing a particular interface,&lt;/li&gt;
  &lt;li&gt;create a client which consumes this service,&lt;/li&gt;
  &lt;li&gt;modify the service in a manner which is not backwards compatible,&lt;/li&gt;
  &lt;li&gt;show that the client can no longer consume the service,&lt;/li&gt;
  &lt;li&gt;implement IDispatchMessageInspector in the service to modify calls on the fly, and&lt;/li&gt;
  &lt;li&gt;show that the client &lt;b&gt;can&lt;/b&gt; now consume the service again.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Creating the WCF Service&lt;/h2&gt;
&lt;p&gt;
  I'm not going to go through this step-by-step. If you're interested in implementing IDispatchMessageInspector to modify
  WCF messages on the fly, then I'm sure you'll have created a WCF service or two in your time. So I'll just be providing
  source code listing of the various files:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;IEmployeeService (the service contract)&lt;/li&gt;
  &lt;li&gt;EmployeeService (an implementation of that contract)&lt;/li&gt;
  &lt;li&gt;Employee (a data contract exposed via the service)&lt;/li&gt;
  &lt;li&gt;Server (contains the console application's entry point and service host provider)&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;IEmployeeService&lt;/h5&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.ServiceModel;

  &lt;span style="color:blue"&gt;namespace&lt;/span&gt; WcfService
  {
    [&lt;span style="color:#2B91AF"&gt;ServiceContract&lt;/span&gt;]
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;interface&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;IEmployeeService&lt;/span&gt;
    {
      [&lt;span style="color:#2B91AF"&gt;OperationContract&lt;/span&gt;]
      &lt;span style="color:blue"&gt;void&lt;/span&gt; SaveEmployee(&lt;span style="color:#2B91AF"&gt;Employee&lt;/span&gt; employee);
    }
  }
&lt;/pre&gt;

&lt;h5&gt;EmployeeService&lt;/h5&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System;

  &lt;span style="color:blue"&gt;namespace&lt;/span&gt; WcfService
  {
    &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;EmployeeService&lt;/span&gt; : &lt;span style="color:#2B91AF"&gt;IEmployeeService&lt;/span&gt;
    {
      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; SaveEmployee(&lt;span style="color:#2B91AF"&gt;Employee&lt;/span&gt; employee)
      {
        &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#A31515"&gt;&amp;quot;Saved {0}&amp;quot;&lt;/span&gt;, employee);
      }
    }
  }
&lt;/pre&gt;

&lt;h5&gt;Employee&lt;/h5&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.Runtime.Serialization;

  &lt;span style="color:blue"&gt;namespace&lt;/span&gt; WcfService
  {
    [&lt;span style="color:#2B91AF"&gt;DataContract&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;Employee&lt;/span&gt;
    {
      [&lt;span style="color:#2B91AF"&gt;DataMember&lt;/span&gt;]
      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; Name { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

      [&lt;span style="color:#2B91AF"&gt;DataMember&lt;/span&gt;]
      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;DateTime&lt;/span&gt; DateOfBirth { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

      [&lt;span style="color:#2B91AF"&gt;DataMember&lt;/span&gt;]
      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;char&lt;/span&gt; Gender { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;override&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; ToString()
      {
        &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#A31515"&gt;&amp;quot;{0} (DOB:{1} Gender:{2})&amp;quot;&lt;/span&gt;, Name, DateOfBirth.ToShortDateString(), Gender);
      }
    }
  }
&lt;/pre&gt;

&lt;h5&gt;Server&lt;/h5&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.ServiceModel;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.ServiceModel.Description;

  &lt;span style="color:blue"&gt;namespace&lt;/span&gt; WcfService
  {
    &lt;span style="color:blue"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Server&lt;/span&gt;
    {
      &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Main()
      {
        &lt;span style="color:green"&gt;// create a host and add an end-point to it&lt;/span&gt;
        &lt;span style="color:#2B91AF"&gt;ServiceHost&lt;/span&gt; serviceHost = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;ServiceHost&lt;/span&gt;(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;EmployeeService&lt;/span&gt;));
        &lt;span style="color:#2B91AF"&gt;ContractDescription&lt;/span&gt; contractDescription = &lt;span style="color:#2B91AF"&gt;ContractDescription&lt;/span&gt;.GetContract(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;IEmployeeService&lt;/span&gt;), &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;EmployeeService&lt;/span&gt;));
        &lt;span style="color:#2B91AF"&gt;NetTcpBinding&lt;/span&gt; netTcpBinding = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;NetTcpBinding&lt;/span&gt;();
        &lt;span style="color:#2B91AF"&gt;EndpointAddress&lt;/span&gt; endpointAddress = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;EndpointAddress&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;net.tcp://localhost:8001/EmployeeService&amp;quot;&lt;/span&gt;);
        &lt;span style="color:#2B91AF"&gt;ServiceEndpoint&lt;/span&gt; serviceEndpoint = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;ServiceEndpoint&lt;/span&gt;(contractDescription, netTcpBinding, endpointAddress);
        serviceHost.Description.Endpoints.Add(serviceEndpoint);

        &lt;span style="color:green"&gt;// add a meta-data end-point&lt;/span&gt;
        &lt;span style="color:#2B91AF"&gt;ServiceMetadataBehavior&lt;/span&gt; serviceMetadataBehavior = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;ServiceMetadataBehavior&lt;/span&gt;();
        serviceMetadataBehavior.HttpGetEnabled = &lt;span style="color:blue"&gt;true&lt;/span&gt;;
        serviceMetadataBehavior.HttpGetUrl = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Uri&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;http://localhost:8002/EmployeeService/mex&amp;quot;&lt;/span&gt;);
        serviceHost.Description.Behaviors.Add(serviceMetadataBehavior);

        &lt;span style="color:green"&gt;// open the host&lt;/span&gt;
        serviceHost.Open();
        &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#A31515"&gt;&amp;quot;Press ENTER to terminate service.&amp;quot;&lt;/span&gt;);

        &lt;span style="color:green"&gt;// close the host once the user hits ENTER&lt;/span&gt;
        &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.ReadLine();
        serviceHost.Close();
      }
    }
  }
&lt;/pre&gt;
&lt;p&gt;
  Okay, so that the server-side code sorted. As you can see it's all fairly basic stuff: the service merely accepts an
  Employee into the SaveEmployee method of its IEmployeeService and writes details of that Employee to the console.
&lt;/p&gt;

&lt;h2&gt;Creating the WCF Client&lt;/h2&gt;
&lt;p&gt;
  The client is just as trivial.&lt;a name='more'&gt;&lt;/a&gt; It consists of a single Client class (in addition to all the auto-generated Service
  Reference stuff and App.config) which creates an instance of the proxy Employee class and asks the service to save it.
&lt;/p&gt;

&lt;h5&gt;Client&lt;/h5&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; WcfClient.EmployeeServiceProxy;

  &lt;span style="color:blue"&gt;namespace&lt;/span&gt; WcfClient
  {
    &lt;span style="color:blue"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Client&lt;/span&gt;
    {
      &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Main()
      {
        &lt;span style="color:#2B91AF"&gt;EmployeeServiceClient&lt;/span&gt; employeeServiceClient = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;EmployeeServiceClient&lt;/span&gt;();
        employeeServiceClient.Open();
  
        &lt;span style="color:#2B91AF"&gt;Employee&lt;/span&gt; employee = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Employee&lt;/span&gt;
        {
          Name = &lt;span style="color:#A31515"&gt;&amp;quot;Jane Armstrong&amp;quot;&lt;/span&gt;,
          DateOfBirth = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;DateTime&lt;/span&gt;(1969, 7, 12),
          Gender = &lt;span style="color:#A31515"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;
        };

        &lt;span style="color:blue"&gt;try&lt;/span&gt;
        {
          &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#A31515"&gt;&amp;quot;Saving {0} (DOB:{1} Gender:{2})&amp;quot;&lt;/span&gt;, employee.Name, employee.DateOfBirth.ToShortDateString(), employee.Gender);
          employeeServiceClient.SaveEmployee(employee);
          employeeServiceClient.Close();
        }
        &lt;span style="color:blue"&gt;catch&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;Exception&lt;/span&gt; ex)
        {
          &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(ex);
          employeeServiceClient.Abort();
        }

        &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#A31515"&gt;&amp;quot;Press ENTER to terminate client.&amp;quot;&lt;/span&gt;);
        &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.ReadLine();
      }
    }
  }
&lt;/pre&gt;
&lt;p&gt;
  I generated the EmployeeServiceProxy class and App.config simply by using the Add Service Reference dialog, pointing it at the meta-data
  end-point of the service, http://localhost:8002/EmployeeService/mex.
&lt;/p&gt;

&lt;h2&gt;Testing the Client and Service&lt;/h2&gt;
&lt;p&gt;
  Okay, now we're ready to show how this client and service interact. They're both console applications, so you can just
  start them both up from the command-line. Let's start the service first:
&lt;/p&gt;
&lt;pre class="console"&gt;
  &gt; WcfService\bin\debug\WcfService.exe
  Press ENTER to terminate service.
&lt;/pre&gt;
&lt;p&gt;
  and then the client:
&lt;/p&gt;
&lt;pre class="console"&gt;
  &gt; WcfClient\bin\Debug\WcfClient.exe
  Saving Jane Armstrong (DOB:12/07/1969 Gender:F)
  Press ENTER to terminate client.
&lt;/pre&gt;
&lt;p&gt;
  If you glance back at the service, you'll notice that it now displays:
&lt;/p&gt;
&lt;pre class="console"&gt;
Saved Jane Armstrong (DOB:12/07/1969 Gender:F)
&lt;/pre&gt;
&lt;p&gt;
  So, our extremely simple WCF client/service application works fine. &lt;b&gt;Now let's break it.&lt;/b&gt;
&lt;/p&gt;

&lt;h2&gt;Changing the Contract&lt;/h2&gt;
&lt;p&gt;
  In an ideal world, WCF contracts would be immutable. But life's not like that. Requirements change. In my scenario I'm
  going to imagine that the client/service above underwent a code review and someone said: "You're using a &lt;i&gt;char&lt;/i&gt; for
  Gender? Hmmm. That allows a client to send a Gender of 'X' or some other invalid value. Perhaps an enumeration might
  be better?" The problem is, you've already deployed you client and have dozens of people using it. You really don't want
  to have to re-deploy it.
&lt;/p&gt;
&lt;p&gt;
  Before we look at how implementing IDispatchMessageInspector can solve this issue, let's change the contract (on
  the service-side only) and see what happens when a client calls it.
&lt;/p&gt;
&lt;p&gt;
  We're going to need a Gender enumeration:
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;namespace&lt;/span&gt; WcfService
  {
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;enum&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Gender&lt;/span&gt;
    {
      Male,
      Female
    }
  }
&lt;/pre&gt;
&lt;p&gt;
And we're going to need to change Employee to use this enumeration:
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.Runtime.Serialization;

  &lt;span style="color:blue"&gt;namespace&lt;/span&gt; WcfService
  {
    [&lt;span style="color:#2B91AF"&gt;DataContract&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;Employee&lt;/span&gt;
    {
      ...

      [&lt;span style="color:#2B91AF"&gt;DataMember&lt;/span&gt;]
      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Gender&lt;/span&gt; Gender { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }
      
      ...
    }
  }
&lt;/pre&gt;
&lt;p&gt;
  Once we've re-compiled the service, we can fire it up:
&lt;/p&gt;
&lt;pre class="console"&gt;
  &gt; WcfService\bin\Debug\WcfService.exe
  Press ENTER to terminate service.
&lt;/pre&gt;
&lt;p&gt;
  and watch what happens when the client (which is still sending a char Gender) tries to save an employee.
&lt;/p&gt;
&lt;pre class="console"&gt;
  &gt; WcfClient\bin\Debug\WcfClient.exe
  Saving Jane Armstrong (DOB:12/07/1969 Gender:F)
  System.ServiceModel.FaultException: The formatter threw an exception while tryin
  g to deserialize the message: There was an error while trying to deserialize par
  ameter http://tempuri.org/:employee. The InnerException message was '&lt;span style="color:Red"&gt;Invalid enu
  m value '70' cannot be deserialized into type 'WcfService.Gender'&lt;/span&gt;. Ensure that t
  he necessary enum values are present and are marked with EnumMemberAttribute att
  ribute if the type has DataContractAttribute attribute.'.  Please see InnerExcep
  tion for more details.
&lt;/pre&gt;
&lt;p&gt;
  Exactly as expected, the client can't pass a char as the service is expecting a member of the Gender enumeration.
  (In case you're wondering, the enum value 70 in the message above comes from the ASCII value for the letter 'F'.)
&lt;/p&gt;
&lt;h2&gt;Enter IDispatchMessageInspector&lt;/h2&gt;
&lt;p&gt;
  WCF allows us to both inspect and modify messages after they've been received by the service but, crucially,
  &lt;i&gt;before&lt;/i&gt; they've been forwarded to an operation. This is achieved by providing a class which implements
  IDispatchMessageInspector and adding it as a service behaviour. Adding it as a service behaviour can be achieved
  in code or via a configuration file. As my service is code-only so far, I'm going to stick with that approach.
&lt;/p&gt;
&lt;p&gt;
  A skeleton IDispatchMessageInspector implementation would look like this:
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.IO;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.ServiceModel;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.ServiceModel.Channels;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.ServiceModel.Dispatcher;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.Xml;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.Xml.XPath;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.Xml.Xsl;

  &lt;span style="color:blue"&gt;namespace&lt;/span&gt; WcfService
  {
    &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;MessageInspector&lt;/span&gt; : &lt;span style="color:#2B91AF"&gt;IDispatchMessageInspector&lt;/span&gt;
    {
      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt; AfterReceiveRequest(&lt;span style="color:blue"&gt;ref&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Message&lt;/span&gt; request, &lt;span style="color:#2B91AF"&gt;IClientChannel&lt;/span&gt; channel, &lt;span style="color:#2B91AF"&gt;InstanceContext&lt;/span&gt; instanceContext)
      {
        &lt;span style="color:green"&gt;// inspect and/or modify the request&lt;/span&gt;

        &lt;span style="color:green"&gt;// return any object which will be passed to BeforeSendReply to correlate requests and replies&lt;/span&gt;
        &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;null&lt;/span&gt;;
      }
  
      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; BeforeSendReply(&lt;span style="color:blue"&gt;ref&lt;/span&gt; &lt;span style="color:#2B91AF"&gt; Message&lt;/span&gt; reply, &lt;span style="color:blue"&gt;object&lt;/span&gt; correlationState)
      {
        &lt;span style="color:green"&gt;// inspect and/or modify the reply&lt;/span&gt;
      }
    }
  }
&lt;/pre&gt;
&lt;p&gt;
&lt;/p&gt;
  (In case you're wondering about all those redundant &lt;code&gt;using&lt;/code&gt; statements - we'll need them later when we provide some real implementations.)
&lt;p&gt;
  The object you return in AfterReceivedRequest &lt;i&gt;for a given request&lt;/i&gt; will be passed to BeforeSendReply when processing the matching reply. I've used this in the past to optionally transform the
  response - i.e. AfterReceiveRequest inspects the request and establishes whether it came from a legacy client (in our example, that would be one which is passing a char Gender) and returns true/false so
  BeforeSendReply knows whether it needs to transform the reply such that it can be processed by a legacy client (in our example, the reply hasn't changed, so there's no need to do anything in BeforeSendReply).
&lt;/p&gt;
&lt;p&gt;
  You'll notice that the request parameter passed to AfterReceiveRequest, and the reply parameter passed to BeforeSendRepy, are passed by reference. This is because the body of a Message object is immutable - 
  it can't be modified. If you want to modify the message (as we do) you need to create a new Message object with the message you want to use instead of the original and assign &lt;i&gt;that&lt;/i&gt; to the request (or reply)
  parameter. One other wrinkle is that the body of a Message object can only be read once. So if you read it in AfterReceiveRequest (just to log its contents to a file, for example) then it can't be read again
  by the rest of the WCF stack. Fun, eh? We'll ignore this issue for the moment (don't worry, we'll get back to it) and plough on. If you're just doing a straight transformation this isn't a problem anyway: you
  read the Message body (once) and create a new Message containing the body you want to be passed to the receiving operation. 
&lt;/p&gt;
&lt;p&gt;
  A Message object essentially represents a SOAP message and, like a SOAP message, contains both headers and a body. In order for us to write some code which transforms the message, we're going to need to
  &lt;i&gt;see&lt;/i&gt; what the message looks like as it arrives from the client. So we need an &lt;b&gt;IDispatchMessageInspector&lt;/b&gt; implementation to inspect the message. We can simply use the template above, and change the
  &lt;b&gt;AfterReceiveRequest&lt;/b&gt; method to read:
&lt;/p&gt;
&lt;pre&gt;
   &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt; AfterReceiveRequest(&lt;span style="color:blue"&gt;ref&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Message&lt;/span&gt; request, &lt;span style="color:#2B91AF"&gt;IClientChannel&lt;/span&gt; channel, &lt;span style="color:#2B91AF"&gt;InstanceContext&lt;/span&gt; instanceContext)
   {
     &lt;span style="color:green"&gt;// write the request to the console (only works for small messages)&lt;/span&gt;
     &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(request.ToString());

     &lt;span style="color:green"&gt;// we don&amp;#39;t need to pass a correlation state&lt;/span&gt;
     &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;null&lt;/span&gt;;
   }
&lt;/pre&gt;
&lt;p&gt;
  This code breaks one of the rules I mentioned above whereby a message can only be read once - it seems that ToString is allowed to ready the message, up to a point. Although I've not seen it documented anywhere I
  believe that there must be a small internal buffer which is used by the ToString method such that it can output a representation of the string without consuming its contents. For a larger message, the output
  produced by ToString would contain elipses (...) to indicate the message body.
&lt;/p&gt;
&lt;p&gt;
  To cause our MessageInspector to be invoked, we need to create a new class which implememnts &lt;b&gt;IEndpointBehavior&lt;/b&gt; and add our MessageInspector to the list of IMessageInspectors when its ApplyDispatchBehavior
  method is called:
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.ServiceModel.Channels;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.ServiceModel.Description;
  &lt;span style="color:blue"&gt;using&lt;/span&gt; System.ServiceModel.Dispatcher;

  &lt;span style="color:blue"&gt;namespace&lt;/span&gt; WcfService
  {
    &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;EndpointBehaviour&lt;/span&gt; : &lt;span style="color:#2B91AF"&gt;IEndpointBehavior&lt;/span&gt;
    {
      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; AddBindingParameters(&lt;span style="color:#2B91AF"&gt;ServiceEndpoint&lt;/span&gt; endpoint, &lt;span style="color:#2B91AF"&gt;BindingParameterCollection&lt;/span&gt; bindingParameters)
      {
        &lt;span style="color:green"&gt;// do nothing&lt;/span&gt;
      }

      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; ApplyClientBehavior(&lt;span style="color:#2B91AF"&gt;ServiceEndpoint&lt;/span&gt; endpoint, &lt;span style="color:#2B91AF"&gt;ClientRuntime&lt;/span&gt; clientRuntime)
      {
        &lt;span style="color:green"&gt;// do nothing&lt;/span&gt;
      }

      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style="color:#2B91AF"&gt;ServiceEndpoint&lt;/span&gt; endpoint, &lt;span style="color:#2B91AF"&gt;EndpointDispatcher&lt;/span&gt; endpointDispatcher)
      {
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;MessageInspector&lt;/span&gt;());
      }

      &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Validate(&lt;span style="color:#2B91AF"&gt;ServiceEndpoint&lt;/span&gt; endpoint)
      {
        &lt;span style="color:green"&gt;// do nothing&lt;/span&gt;
      }
    }
  }
&lt;/pre&gt;
&lt;p&gt;
  To cause our EndpointBehaviour to be used, we need to add it to the list of end-point behaviours by adding the following line to Server.cs, immediately after the serviceEndpoint has been initialised:
&lt;/p&gt;
&lt;pre&gt;
  serviceEndpoint.Behaviors.Add(&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;EndpointBehaviour&lt;/span&gt;());
&lt;/pre&gt;
&lt;p&gt;
  When we start the WcfService and WcfClient this time, the WcfClient will still fail (we haven't corrected the actual problem yet) but at least we'll see in the WcfService what the SOAP message sent by the
  WcfClient was:
&lt;/p&gt;
&lt;pre class="console"&gt;
Press ENTER to terminate service.
&amp;lt;s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w
3.org/2003/05/soap-envelope"&amp;gt;
  &amp;lt;s:Header&amp;gt;
    &amp;lt;a:Action s:mustUnderstand="1"&amp;gt;http://tempuri.org/IEmployeeService/SaveEmplo
yee&amp;lt;/a:Action&amp;gt;
    &amp;lt;a:MessageID&amp;gt;urn:uuid:796c06e4-03b9-4012-899c-935199d5e81e&amp;lt;/a:MessageID&amp;gt;
    &amp;lt;a:ReplyTo&amp;gt;
      &amp;lt;a:Address&amp;gt;http://www.w3.org/2005/08/addressing/anonymous&amp;lt;/a:Address&amp;gt;
    &amp;lt;/a:ReplyTo&amp;gt;
    &amp;lt;a:To s:mustUnderstand="1"&amp;gt;net.tcp://localhost:8001/EmployeeService&amp;lt;/a:To&amp;gt;
  &amp;lt;/s:Header&amp;gt;
  &amp;lt;s:Body&amp;gt;
    &amp;lt;SaveEmployee xmlns="http://tempuri.org/"&amp;gt;
      &amp;lt;employee xmlns:b="http://schemas.datacontract.org/2004/07/WcfService" xml
ns:i="http://www.w3.org/2001/XMLSchema-instance"&amp;gt;
        &amp;lt;b:DateOfBirth&amp;gt;1969-07-12T00:00:00&amp;lt;/b:DateOfBirth&amp;gt;
        &amp;lt;b:Gender&amp;gt;70&amp;lt;/b:Gender&amp;gt;
        &amp;lt;b:Name&amp;gt;Jane Armstrong&amp;lt;/b:Name&amp;gt;
      &amp;lt;/employee&amp;gt;
    &amp;lt;/SaveEmployee&amp;gt;
  &amp;lt;/s:Body&amp;gt;
&amp;lt;/s:Envelope&amp;gt;
&lt;/pre&gt;
&lt;p&gt;  
  The change we want to make to this Message is trivial: we simply need to change &lt;code&gt;&amp;lt;b:Gender&amp;gt;70&amp;lt;/b:Gender&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;b:Gender&amp;gt;Female&amp;lt;/b:Gender&amp;gt;&lt;/code&gt;. Now, we
  &lt;i&gt;could&lt;/i&gt; use XSLT to do this (which is what I'd typically do if the transformation required were non-trivial), but let's just use an XmlDocument for the modification.
&lt;/p&gt;
&lt;p&gt;
  So, we'll modify of the &lt;b&gt;AfterReceiveRequest&lt;/b&gt; so it reads:
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt; AfterReceiveRequest(&lt;span style="color:blue"&gt;ref&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Message&lt;/span&gt; request, &lt;span style="color:#2B91AF"&gt;IClientChannel&lt;/span&gt; channel, &lt;span style="color:#2B91AF"&gt;InstanceContext&lt;/span&gt; instanceContext)
  {
    &lt;span style="color:green"&gt;// copy the contents of the original message&amp;#39;s body into a MemoryStream&lt;/span&gt;
    &lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt;();
    &lt;span style="color:#2B91AF"&gt;XmlDictionaryWriter&lt;/span&gt; xmlDictionaryWriter = &lt;span style="color:#2B91AF"&gt;XmlDictionaryWriter&lt;/span&gt;.CreateTextWriter(memoryStream);
    request.WriteBodyContents(xmlDictionaryWriter);
    xmlDictionaryWriter.Flush();
    
    &lt;span style="color:green"&gt;// write the contents of the MemoryStream to the Console&lt;/span&gt;
    memoryStream.Position = 0L;
    &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;StreamReader&lt;/span&gt;(memoryStream).ReadToEnd());
    
    &lt;span style="color:green"&gt;// load the stream into an XmlDocument&lt;/span&gt;
    memoryStream.Position = 0L;
    &lt;span style="color:#2B91AF"&gt;XmlDocument&lt;/span&gt; xmlDocument = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlDocument&lt;/span&gt;();
    xmlDocument.Load(memoryStream);
    
    &lt;span style="color:green"&gt;// register the namespaces we&amp;#39;ll need to xpath to the &amp;lt;gender&amp;gt; node&lt;/span&gt;
    &lt;span style="color:#2B91AF"&gt;XmlNamespaceManager&lt;/span&gt; xmlNamespaceManager = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlNamespaceManager&lt;/span&gt;(xmlDocument.NameTable);
    xmlNamespaceManager.AddNamespace(&lt;span style="color:#A31515"&gt;&amp;quot;t&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515"&gt;&amp;quot;http://tempuri.org/&amp;quot;&lt;/span&gt;);
    xmlNamespaceManager.AddNamespace(&lt;span style="color:#A31515"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515"&gt;&amp;quot;http://schemas.datacontract.org/2004/07/WcfService&amp;quot;&lt;/span&gt;);
    
    &lt;span style="color:green"&gt;// modify the &amp;lt;gender&amp;gt; node&lt;/span&gt;
    &lt;span style="color:#2B91AF"&gt;XmlNode&lt;/span&gt; genderNode = xmlDocument.SelectSingleNode(&lt;span style="color:#A31515"&gt;&amp;quot;/t:SaveEmployee/t:employee/b:Gender&amp;quot;&lt;/span&gt;, xmlNamespaceManager);
    &lt;span style="color:blue"&gt;if&lt;/span&gt; (genderNode != &lt;span style="color:blue"&gt;null&lt;/span&gt;)
    {
      genderNode.InnerText = genderNode.InnerText == &lt;span style="color:#A31515"&gt;&amp;quot;70&amp;quot;&lt;/span&gt; ? &lt;span style="color:#A31515"&gt;&amp;quot;Female&amp;quot;&lt;/span&gt; : &lt;span style="color:#A31515"&gt;&amp;quot;Male&amp;quot;&lt;/span&gt;;
    }
    
    &lt;span style="color:green"&gt;// copy the modified XmlDocument back into the MemoryStream&lt;/span&gt;
    memoryStream.Position = 0L;
    xmlDocument.Save(memoryStream);
    
    &lt;span style="color:green"&gt;// write the contents of the MemoryStream to the Console&lt;/span&gt;
    memoryStream.Position = 0L;
    &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;StreamReader&lt;/span&gt;(memoryStream).ReadToEnd());
    
    &lt;span style="color:green"&gt;// create a new Message from the MemoryStream (copying the original&amp;#39;s properties and headers)&lt;/span&gt;
    memoryStream.Position = 0L;
    &lt;span style="color:#2B91AF"&gt;XmlReader&lt;/span&gt; xmlReader = &lt;span style="color:#2B91AF"&gt;XmlReader&lt;/span&gt;.Create(memoryStream);
    &lt;span style="color:#2B91AF"&gt;Message&lt;/span&gt; modifiedRequest = &lt;span style="color:#2B91AF"&gt;Message&lt;/span&gt;.CreateMessage(request.Headers.MessageVersion, request.Headers.Action, xmlReader);
    modifiedRequest.Properties.CopyProperties(request.Properties);
    modifiedRequest.Headers.CopyHeadersFrom(request);
    
    &lt;span style="color:green"&gt;// re-assign the request parameter to our new modified request&lt;/span&gt;
    request = modifiedRequest;
    
    &lt;span style="color:green"&gt;// return&lt;/span&gt;
    &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;null&lt;/span&gt;;
  }
&lt;/pre&gt;
&lt;p&gt;
  If you're like me you'll hate this code. Let's count the number of copies of the message are required: there's obviously the original message (one), then we copy it into a MemoryStream (two), then we copy
  that into an XmlDocument (three); once we've modified it, we copy it back into a MemoryStream (four) and finally into a new Message (five). Really? We need to have five copies of the message? In reality
  there we only four as we re-used the MemoryStream. Also, the final Message we create is passed XmlReader which wraps the MemoryStream - the Message doesn't have a separate copy of this data, it simply
  reads it from the MemoryStream via the XmlReader when necessarily, not at construction time. So there are actually only three copies the message in memory at any one time. But that's still two too many
  but my count. In this example the message is clearly tiny, but imagine if it weren't. Those extra copies of the message could really hurt scalability.
&lt;/p&gt;
&lt;p&gt;
  Before we look at alternative ways to code this, let's just see if it actually works first. So we'll fire up WcfService:
&lt;/p&gt;
&lt;pre class="console"&gt;
Press ENTER to terminate service.
&lt;/pre&gt;
&lt;p&gt;
  And then WcfClient:
&lt;/p&gt;
&lt;pre class="console"&gt;
Saving Jane Armstrong (DOB:12/07/1969 Gender:F)
Press ENTER to terminate client.
&lt;/pre&gt;
&lt;p&gt;
  Note that the client didn't experience an exception this time. Glancing back at the WcfService we now see:
&lt;/p&gt;
&lt;pre class="console"&gt;
Press ENTER to terminate service.
&lt;span style="color:#E26B0A"&gt;&amp;lt;SaveEmployee xmlns="http://tempuri.org/"&amp;gt;&amp;lt;employee xmlns:b="http://schemas.data
contract.org/2004/07/WcfService" xmlns:i="http://www.w3.org/2001/XMLSchema-insta
nce"&amp;gt;&amp;lt;b:DateOfBirth&amp;gt;1969-07-12T00:00:00&amp;lt;/b:DateOfBirth&amp;gt;&lt;span style="font-weight:bold;color:#974706"&gt;&amp;lt;b:Gender&amp;gt;70&amp;lt;/b:Gender&amp;gt;&lt;/span&gt;&amp;lt;b
:Name&amp;gt;Jane Armstrong&amp;lt;/b:Name&amp;gt;&amp;lt;/employee&amp;gt;&amp;lt;/SaveEmployee&amp;gt;&lt;/span&gt;
&lt;span style="color:#76933C"&gt;&amp;lt;SaveEmployee xmlns="http://tempuri.org/"&amp;gt;
  &amp;lt;employee xmlns:b="http://schemas.datacontract.org/2004/07/WcfService" xmlns:i
="http://www.w3.org/2001/XMLSchema-instance"&amp;gt;
    &amp;lt;b:DateOfBirth&amp;gt;1969-07-12T00:00:00&amp;lt;/b:DateOfBirth&amp;gt;
    &lt;span style="font-weight:bold;color:#4F6228"&gt;&amp;lt;b:Gender&amp;gt;Female&amp;lt;/b:Gender&amp;gt;&lt;/span&gt;
    &amp;lt;b:Name&amp;gt;Jane Armstrong&amp;lt;/b:Name&amp;gt;
  &amp;lt;/employee&amp;gt;
&amp;lt;/SaveEmployee&amp;gt;&lt;/span&gt;
Saved Jane Armstrong (DOB:12/07/1969 Gender:Female)
&lt;/pre&gt;
&lt;p&gt;
  (Yours won't be in colour - I've colour-coded the output to explain what you're seeing). The &lt;span style="color:#E26B0A"&gt;orange&lt;/span&gt; XML is the original message received by WcfService. You'll note that
  Gender is 70 (the ASCII value for 'F'). The &lt;span style="color:#76933C"&gt;green&lt;/span&gt; XML is once we've translate it; after translation the Gender is Female. You'll also note that the Saved message shows that
  the deserialised Employee object contains the correct value for Gender.
&lt;/p&gt;

&lt;h2&gt;Alternate Implementations&lt;/h2&gt;
&lt;p&gt;
  So, are there any better solutions? Well, you might try using the XPathNavigator returned by the MessageBuffer's CreateNavigator() method:
&lt;/p&gt;
&lt;pre&gt;
   &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt; AfterReceiveRequest(&lt;span style="color:blue"&gt;ref&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Message&lt;/span&gt; request, &lt;span style="color:#2B91AF"&gt;IClientChannel&lt;/span&gt; channel, &lt;span style="color:#2B91AF"&gt;InstanceContext&lt;/span&gt; instanceContext)
   {
    &lt;span style="color:green"&gt;// copy the original request into a buffer which we can read and modify&lt;/span&gt;
    &lt;span style="color:#2B91AF"&gt;MessageBuffer&lt;/span&gt; messageBuffer = request.CreateBufferedCopy(&lt;span style="color:#2B91AF"&gt;Int32&lt;/span&gt;.MaxValue);

    &lt;span style="color:green"&gt;// do the necessary prep work to navigate over the request&lt;/span&gt;
    &lt;span style="color:#2B91AF"&gt;XPathNavigator&lt;/span&gt; xpathNagivator = messageBuffer.CreateNavigator();
    &lt;span style="color:#2B91AF"&gt;XmlNamespaceManager&lt;/span&gt; xmlNamespaceManager = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlNamespaceManager&lt;/span&gt;(xpathNagivator.NameTable);
    xmlNamespaceManager.AddNamespace(&lt;span style="color:#A31515"&gt;&amp;quot;s&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515"&gt;&amp;quot;http://www.w3.org/2003/05/soap-envelope&amp;quot;&lt;/span&gt;);
    xmlNamespaceManager.AddNamespace(&lt;span style="color:#A31515"&gt;&amp;quot;t&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515"&gt;&amp;quot;http://tempuri.org/&amp;quot;&lt;/span&gt;);
    xmlNamespaceManager.AddNamespace(&lt;span style="color:#A31515"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515"&gt;&amp;quot;http://schemas.datacontract.org/2004/07/WcfService&amp;quot;&lt;/span&gt;);
     
    &lt;span style="color:green"&gt;// modify the &amp;lt;gender&amp;gt; node&lt;/span&gt;
    &lt;span style="color:#2B91AF"&gt;XPathNavigator&lt;/span&gt; genderNode = xpathNagivator.SelectSingleNode(&lt;span style="color:#A31515"&gt;&amp;quot;/s:Envelope/s:Body/t:SaveEmployee/t:employee/b:Gender&amp;quot;&lt;/span&gt;, xmlNamespaceManager);
    &lt;span style="color:blue"&gt;if&lt;/span&gt; (genderNode != &lt;span style="color:blue"&gt;null&lt;/span&gt;)
    {
      genderNode.SetValue(genderNode.Value == &lt;span style="color:#A31515"&gt;&amp;quot;70&amp;quot;&lt;/span&gt; ? &lt;span style="color:#A31515"&gt;&amp;quot;Female&amp;quot;&lt;/span&gt; : &lt;span style="color:#A31515"&gt;&amp;quot;Male&amp;quot;&lt;/span&gt;);
    }

    &lt;span style="color:green"&gt;// re-assign the request parameter to a new Message built from our modified buffer&lt;/span&gt;
    request = messageBuffer.CreateMessage();

    &lt;span style="color:green"&gt;// tidy up and return&lt;/span&gt;
    messageBuffer.Close();
    &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;null&lt;/span&gt;;
  }
&lt;/pre&gt;
&lt;p&gt;
  Unfortunately, the XPathNavigator created is read-only (its CanEdit property is set to false) so the call to its &lt;b&gt;SetValue&lt;/b&gt; method throws a &lt;b&gt;NotSupportedException&lt;/b&gt;.
&lt;/p&gt;
&lt;p&gt;
  What about an XSLT-based approach? How would that work? Let's start by creating the XSLT itself. We can use the orange XML above as our sample input, and the green XML above as out expected output.
  The XSLT is pretty simple, as you'd expect.
&lt;/p&gt;
&lt;pre&gt;
   &lt;span style="color:blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#A31515"&gt;xml&lt;/span&gt; &lt;span style="color:red"&gt;version&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color:red"&gt;encoding&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;?&amp;gt;&lt;/span&gt;
   &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:stylesheet&lt;/span&gt; &lt;span style="color:red"&gt;version&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color:red"&gt;xmlns:xsl&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;http://www.w3.org/1999/XSL/Transform&lt;/span&gt;&amp;quot; &lt;span style="color:red"&gt;xmlns:t&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;http://tempuri.org/&lt;/span&gt;&amp;quot; &lt;span style="color:red"&gt;xmlns:b&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;http://schemas.datacontract.org/2004/07/WcfService&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
     &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:output&lt;/span&gt; &lt;span style="color:red"&gt;method&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;xml&lt;/span&gt;&amp;quot; &lt;span style="color:red"&gt;indent&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;yes&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;/&amp;gt;&lt;/span&gt;

     &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;!--&lt;span style="color:green"&gt; transform the Gender node &lt;/span&gt;&lt;span style="color:blue"&gt;--&amp;gt;&lt;/span&gt;
     &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:template&lt;/span&gt; &lt;span style="color:red"&gt;match&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;t:SaveEmployee/t:employee/b:Gender/text()&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
       &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:choose&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
         &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:when&lt;/span&gt; &lt;span style="color:red"&gt;test&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;.=&amp;#39;70&amp;#39;&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;Female&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:when&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
         &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;Male&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
       &lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:choose&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
     &lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:template&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;

     &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;!--&lt;span style="color:green"&gt; simply copy all other nodes as-is &lt;/span&gt;&lt;span style="color:blue"&gt;--&amp;gt;&lt;/span&gt;
     &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:template&lt;/span&gt; &lt;span style="color:red"&gt;match&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;@* | node()&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
       &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:copy&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
         &lt;span style="color:blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:apply-templates&lt;/span&gt; &lt;span style="color:red"&gt;select&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;@* | node()&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt;/&amp;gt;&lt;/span&gt;
       &lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:copy&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
     &lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:template&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
   &lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#2B91AF"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  We need to add this file (I called mine TransformRequest.xslt) to the WcfService project and set its Build Action to Embedded Resource. We won't want to load a compile this XSLT every time a request comes in,
  so we'll place that logic in the MessageInspector's constructor:
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;private&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XslCompiledTransform&lt;/span&gt; _compiledTransform;

  &lt;span style="color:blue"&gt;public&lt;/span&gt; MessageInspector()
  {
    &lt;span style="color:blue"&gt;string&lt;/span&gt; transformResourceName = &lt;span style="color:blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#A31515"&gt;&amp;quot;{0}.{1}&amp;quot;&lt;/span&gt;, GetType().Namespace, TransformFileName);
    &lt;span style="color:blue"&gt;using&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;Stream&lt;/span&gt; stream = GetType().Assembly.GetManifestResourceStream(transformResourceName))
    {
      &lt;span style="color:blue"&gt;if&lt;/span&gt; (stream == &lt;span style="color:blue"&gt;null&lt;/span&gt;)
      {
        &lt;span style="color:blue"&gt;throw&lt;/span&gt; &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Exception&lt;/span&gt;(&lt;span style="color:blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#A31515"&gt;&amp;quot;Unable to load the resource named &amp;#39;{0}&amp;#39; - is it embedded within the the &amp;#39;{1}&amp;#39; assembly?&amp;quot;&lt;/span&gt;, transformResourceName, GetType().Assembly.FullName));
      }
      _compiledTransform = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XslCompiledTransform&lt;/span&gt;();
      _compiledTransform.Load(&lt;span style="color:#2B91AF"&gt;XmlReader&lt;/span&gt;.Create(stream));
    }
  }
&lt;/pre&gt;
&lt;p&gt;
  Once we have the XSLT in memory, using it within a revised &lt;b&gt;AfterReceiveRequest&lt;/b&gt; becomes quite simple.
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt; AfterReceiveRequest(&lt;span style="color:blue"&gt;ref&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Message&lt;/span&gt; request, &lt;span style="color:#2B91AF"&gt;IClientChannel&lt;/span&gt; channel, &lt;span style="color:#2B91AF"&gt;InstanceContext&lt;/span&gt; instanceContext)
  {
    &lt;span style="color:green"&gt;// transform the original request, via the XSLT, into a new MemoryStream&lt;/span&gt;
    &lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt;();
    _compiledTransform.Transform(request.GetReaderAtBodyContents(), &lt;span style="color:blue"&gt;null&lt;/span&gt;, memoryStream);

    &lt;span style="color:green"&gt;// create a new Message from the MemoryStream (copying the original&amp;#39;s properties and headers)&lt;/span&gt;
    memoryStream.Position = 0L;
    &lt;span style="color:#2B91AF"&gt;XmlReader&lt;/span&gt; xmlReader = &lt;span style="color:#2B91AF"&gt;XmlReader&lt;/span&gt;.Create(memoryStream);
    &lt;span style="color:#2B91AF"&gt;Message&lt;/span&gt; modifiedRequest = &lt;span style="color:#2B91AF"&gt;Message&lt;/span&gt;.CreateMessage(request.Headers.MessageVersion, request.Headers.Action, xmlReader);
    modifiedRequest.Properties.CopyProperties(request.Properties);
    modifiedRequest.Headers.CopyHeadersFrom(request);

    &lt;span style="color:green"&gt;// re-assign the request parameter to our new modified request and return&lt;/span&gt;
    request = modifiedRequest;
    &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;null&lt;/span&gt;;
  }
&lt;/pre&gt;
&lt;p&gt;
  You note that there are now only two copies of the request message - the original message and the revised messages stored in the MemoryStream. As was noted before, although the Message object we create is
  passed an XmlReader which wraps the MemoryStream - the Message doesn't have a separate copy of the data, it simply reads it from the MemoryStream via the XmlReader when necessarily.
&lt;/p&gt;
&lt;p&gt;
  Although using XSLT might be overkill for this simple requirement, I actually prefer it. It nicely separates the act of performing the transformation (the XSLT) from the plumbing necessary to hook
  it up to WCF (the AfterReceiveRequest method).
&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;
  IDispatchMessageInspector isn't something you'd design into an appliction at the outset - you should really aim to get your WCF contract fixed before you start allowing clients to connect.
  But as a get-out-of-jail-free card when you've no choice but to change the interface, it's invaluable.
&lt;/p&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2009/12/systemdata-serialisation-bug-scenario-2.html"&gt;System.Data Serialisation Bug - Scenario 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/03/serialising-enumerations-with-wcf.html"&gt;Serialising Enumerations with WCF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-7666897233118191659?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/2zveQeUVezA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/7666897233118191659/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2011/03/implementing-idispatchmessageinspector.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/7666897233118191659?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/7666897233118191659?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/2zveQeUVezA/implementing-idispatchmessageinspector.html" title="Implementing IDispatchMessageInspector" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2011/03/implementing-idispatchmessageinspector.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UGSX0-cCp7ImA9Wx9TFEQ.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-7083422877045847194</id><published>2010-11-23T08:00:00.000Z</published><updated>2010-11-23T08:00:28.358Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-23T08:00:28.358Z</app:edited><title>Detecting Month-Ends in JavaScript</title><content type="html">&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;
  I came across the following problem many years ago whilst doing some work for a financial services company.
  They had some code (which I don't think was written by me, but my memory is a little hazy on the subject)
  which attempted to establish whether the current date was the last date in a month. The code was written in
  JavaScript.
&lt;/p&gt;
&lt;p&gt;
  The normal way of performing such a test is to:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;(a) establish what month the current date falls within,&lt;/li&gt;
  &lt;li&gt;(b) add a single day to the current date,&lt;/li&gt;
  &lt;li&gt;(c) establish what month the date resulting from (b) falls within, and&lt;/li&gt;
  &lt;li&gt;(d) compare values (a) and (c) - if they are different then the current date is indeed the last date in a month.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  Steps (a) and (c) are easy - JavaScripts's Date object provides a getMonth() method which returns the zero-based
  month number (i.e. 0=January, 1=February, etc).
&lt;/p&gt;
&lt;p&gt;
  Step (b) isn't so easy as JavaScript's Data object does not provide any date arithmetic operations per se. That it,
  it does not provide an addDays() method or any equivalent thereof.
&lt;/p&gt;
&lt;p&gt;
  Well, the value actually stored internally by the Data object is the number of milliseconds between the date/time being
  represented and midnight (GMT) on 1st January 1970. And we can both read this value via the getTime() method, and write
  this value via the single-parametered constructor respectively. That is, I can obtain the internally stored value of a
  Date object called &lt;code&gt;now&lt;/code&gt; via &lt;code&gt;ms = now.getTime();&lt;/code&gt; and I can create a Date object from
  this value via &lt;code&gt;then = new Date(ms);&lt;/code&gt;. As we know how many milliseconds there are in a day (1000*60*60*24),
  we can add a day's worth of milliseconds to a given date to add one day to it - which is actually what step (b) requires.
&lt;/p&gt;
&lt;p&gt;
  So, putting it all together we get:
&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;
&lt;pre&gt;
  &lt;span style="color:blue;"&gt;var&lt;/span&gt; dateToday = &lt;span style="color:blue"&gt;new&lt;/span&gt; Date();
  &lt;span style="color:blue;"&gt;var&lt;/span&gt; dateTomorrow = &lt;span style="color:blue"&gt;new&lt;/span&gt; Date(dateToday.getTime() + (1000 * 60 * 60 * 24));

  &lt;span style="color:blue;"&gt;if&lt;/span&gt; (dateToday.getMonth() == dateTomorrow.getMonth())
    alert(&lt;span style="color:maroon"&gt;&amp;quot;NOT last day of month&amp;quot;&lt;/span&gt;);
  &lt;span style="color:blue;"&gt;else&lt;/span&gt;
    alert(&lt;span style="color:maroon"&gt;&amp;quot;IS last day of month&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;p&gt;
  So, has anyone spotted the floor in this logic? What if I told you the logic would fail (in the UK) on the last day
  of October 2004, 2010 and 2021? Yes - you've guess it - it'd to do with British Summer Time (BST) ending and the UK
  reverting to Grenwich Mean Time (GMT). At 2:00am on the last Sunday in October the clocks are put back to 1:00am. On
  such days there are therefore 25 hours (midnight to midnight). If the last Sunday in October happens to be the last
  day of the month (i.e. in 2004, 2010 and 2021) then the above logic will claim that it's &lt;i&gt;not&lt;/i&gt; the last day of
  the month.
&lt;/p&gt;
&lt;p&gt;
  Such a bug can clearly lie dormant for many, many years before it's encountered.
&lt;/p&gt;
&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;p&gt;
  The solution is easy. The code shouldn't have used getMonth() to retrieve the current month, as that retrieves the
  month according to &lt;i&gt;local&lt;/i&gt; time. To ignore the effect of the clocks changing we want to use getUTCMonth() instead.
  Problem solved. Or is it?
&lt;/p&gt;
&lt;p&gt;
  Remember that the Date object stores a GMT-relative value. So when it retrieves the date from the current system clock
  (as in &lt;code&gt;date = new Date()&lt;/code&gt;) or has its value set via constructor arguments (as in
  &lt;code&gt;date = new Date(2010, 9, 31)&lt;/code&gt;) it will always convert that to GMT before storing it. So if the current
  date/time happened to be midnight (00:00) on 31 October 2010 - which is still within British Summer Time - what's
  actually stored is 23:00 on 30 October 2010 - because that is the same date/time expressed in terms of GMT. So when
  we add 24 hours to &lt;i&gt;this&lt;/i&gt; date we get 23:00 on 31 October 2010. As the month &lt;i&gt;still&lt;/i&gt; has't changed, even a
  version of the above code which uses getUTCMonth() will report that 31 October 2010 is &lt;i&gt;not&lt;/i&gt; the last day of the
  month as long as the time component is less that 01:00.
&lt;/p&gt;
&lt;p&gt;
  So a getUTCMonth-version of the above code will work, except for the one hour between 00:00 and 01:00 on the
  31st October if that date is a Sunday. So for the &lt;i&gt;fifteen years&lt;/i&gt; between 1st January 2005 and 31st December 2020
  there's only a &lt;i&gt;single hour&lt;/i&gt; during which it will fail. That asmuses me. It's the sort of really rare bug that 
  would almost certainly go unnoticed during testing but could well cause problems (depending upon the end-of-month
  processing the test was intended to trigger).
&lt;/p&gt;
&lt;h2&gt;An Actual Solution&lt;/h2&gt;
&lt;p&gt;
  There are probably lots of solutions involving the use of GMT (rather than local) time throughout. But the simplest
  approach is to realise that we really don't care about the time, but it's the time which is getting us into trouble.
  So let's change it.
&lt;/p&gt;
&lt;p&gt;
  Simply adding the following line into the original code, immediately after &lt;code&gt;dateToday&lt;/code&gt; is initialised
  fixes things nicely:
&lt;/p&gt;
&lt;pre&gt;
  dateToday.setHours(12, 0, 0, 0);
&lt;/pre&gt;
&lt;p&gt;
  Although this might seem a little like cheating, it works well. And that's good enough for me.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-7083422877045847194?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/_1cc9v0n9DI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/7083422877045847194/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2010/11/detecting-month-ends-in-javascript.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/7083422877045847194?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/7083422877045847194?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/_1cc9v0n9DI/detecting-month-ends-in-javascript.html" title="Detecting Month-Ends in JavaScript" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2010/11/detecting-month-ends-in-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YFQ3g8eyp7ImA9Wx9TFEQ.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-5450177743057933712</id><published>2010-10-28T18:09:00.000+01:00</published><updated>2010-11-23T07:58:32.673Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-23T07:58:32.673Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="XML Serialisation" /><title>Selectively Overriding XML Serialisation Attributes</title><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
 As I mentioned in my
 &lt;a href="http://ianpicknell.blogspot.com/2010/04/default-values-dont-get-serialised.html"&gt;last post&lt;/a&gt;,
 although you can override XML serialisation attributes by passing an XmlAttributeOverrides instance to an
 XmlSerializer, the attributes you provide for a given type and member replace &lt;i&gt;all&lt;/i&gt; the existing XML
 serialisation attributes - you can't simply tweak one or two and leave the rest intact.
&lt;/p&gt;
&lt;p&gt;
 If you're thinking that type and members only tend to have one or two serialistion attributes, then take a
 look at this set attributes from an auto-generated EquityDerivativeBase class:
&lt;/p&gt;
&lt;pre&gt;
[System.Xml.Serialization.XmlIncludeAttribute(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(EquityDerivativeShortFormBase))]
[System.Xml.Serialization.XmlIncludeAttribute(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(EquityOptionTransactionSupplement))]
[System.Xml.Serialization.XmlIncludeAttribute(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(BrokerEquityOption))]
[System.Xml.Serialization.XmlIncludeAttribute(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(EquityDerivativeLongFormBase))]
[System.Xml.Serialization.XmlIncludeAttribute(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(EquityOption))]
[System.Xml.Serialization.XmlIncludeAttribute(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(EquityForward))]
[System.CodeDom.Compiler.GeneratedCodeAttribute(&lt;span style="color:#A31515"&gt;&amp;quot;xsd&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515"&gt;&amp;quot;4.0.30319.1&amp;quot;&lt;/span&gt;)]
[System.&lt;span style="color:#2B91AF"&gt;SerializableAttribute&lt;/span&gt;()]
[System.Diagnostics.&lt;span style="color:#2B91AF"&gt;DebuggerStepThroughAttribute&lt;/span&gt;()]
[System.ComponentModel.DesignerCategoryAttribute(&lt;span style="color:#A31515"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;)]
[System.Xml.Serialization.XmlTypeAttribute(Namespace=&lt;span style="color:#A31515"&gt;&amp;quot;http://www.fpml.org/FpML-5/confirmation&amp;quot;&lt;/span&gt;)]
&lt;/pre&gt;
&lt;p&gt;
 Let's suppose I want to use XmlAttributeOverrides to alter the value of the XmlTypeAttribute at run-rime, to place the
 element in a different namespace. Well I can. But the XmlAttributeOverrides instance I supply is used to replace &lt;i&gt;all&lt;/i&gt;
 the existing attributes. So I lose each of the XmlIncludeAttribute attributes which define the classes which use this
 class as a base class.
&lt;/p&gt;
&lt;h2&gt;Book and Genre classes (with Xml Attributes)&lt;/h2&gt;
&lt;p&gt;
 To demonstrate how to override the attributes &lt;i&gt;selectively&lt;/i&gt; I'm going to use the same Book class as in my 
 &lt;a href="http://ianpicknell.blogspot.com/2010/04/default-values-dont-get-serialised.html"&gt;last post&lt;/a&gt;
 to demonstrate selectively overriding these attributes. I've added a lot more attributes to the members of the
 Book class to demonstrate that they all get retained.
&lt;/p&gt;
&lt;pre&gt;
[&lt;span style="color:#2B91AF"&gt;XmlType&lt;/span&gt;(TypeName=&lt;span style="color:#A31515"&gt;&amp;quot;Book&amp;quot;&lt;/span&gt;)]
[&lt;span style="color:#2B91AF"&gt;XmlRoot&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;book&amp;quot;&lt;/span&gt;, Namespace=&lt;span style="color:#A31515"&gt;&amp;quot;http://tempuri.org&amp;quot;&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;Book&lt;/span&gt;
{
  [&lt;span style="color:#2B91AF"&gt;XmlIgnore&lt;/span&gt;]
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt; InternalId { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

  [&lt;span style="color:#2B91AF"&gt;XmlElement&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;)]
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; Title { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

  [&lt;span style="color:#2B91AF"&gt;DefaultValue&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;Anonymous&amp;quot;&lt;/span&gt;)]
  [&lt;span style="color:#2B91AF"&gt;XmlArray&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;authors&amp;quot;&lt;/span&gt;)]
  [&lt;span style="color:#2B91AF"&gt;XmlArrayItem&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;author&amp;quot;&lt;/span&gt;)]
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt;[] Authors { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

  [&lt;span style="color:#2B91AF"&gt;XmlElement&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;isbn13&amp;quot;&lt;/span&gt;)]
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; Isbn13 { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }
 
  [&lt;span style="color:#2B91AF"&gt;XmlText&lt;/span&gt;]
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; Extract { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

  [&lt;span style="color:#2B91AF"&gt;XmlAttribute&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;genre&amp;quot;&lt;/span&gt;)]
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Genre&lt;/span&gt; Genre { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

  [&lt;span style="color:#2B91AF"&gt;XmlNamespaceDeclarations&lt;/span&gt;]
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlSerializerNamespaces&lt;/span&gt; XmlNamespaces { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

  [&lt;span style="color:#2B91AF"&gt;XmlAnyAttribute&lt;/span&gt;]
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAttribute&lt;/span&gt;[] OtherAttributes { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

  [&lt;span style="color:#2B91AF"&gt;XmlAnyElement&lt;/span&gt;]
  &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlElement&lt;/span&gt;[] OtherElements { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

  &lt;span style="color:blue"&gt;public&lt;/span&gt; Book()
  {
    XmlNamespaces = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlSerializerNamespaces&lt;/span&gt;();
    XmlNamespaces.Add(&lt;span style="color:#A31515"&gt;&amp;quot;ns&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515"&gt;&amp;quot;http://tempuri.org&amp;quot;&lt;/span&gt;);
  }
}

&lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;enum&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Genre&lt;/span&gt;
{
  [&lt;span style="color:#2B91AF"&gt;XmlEnum&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;unknown&amp;quot;&lt;/span&gt;)]
  Unknown,
  [&lt;span style="color:#2B91AF"&gt;XmlEnum&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;autobiography&amp;quot;&lt;/span&gt;)]
  Autobiography,
  [&lt;span style="color:#2B91AF"&gt;XmlEnum&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;computing-text&amp;quot;&lt;/span&gt;)]
  ComputingText,
  [&lt;span style="color:#2B91AF"&gt;XmlEnum&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;classic&amp;quot;&lt;/span&gt;)]
  Classic
}
&lt;/pre&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;
 The solution is to copy all the existing attributes into an XmlAttributeOverrides instance (modifying them as they're
 copied), and then apply the XmlAttributeOverrides to the XmlSerializer. That way the XmlAttributeOverrides object retains
 all of the original attributes (with the exception of any changes made in transit). Let me show you what I mean:
&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;
&lt;pre&gt;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.ComponentModel;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.IO;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Reflection;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Xml;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Xml.Serialization;

&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; ConsoleApplication
{
  &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;Program&lt;/span&gt;
  {
    &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue"&gt;string&lt;/span&gt;[] args)
    {
      &lt;span style="color:green"&gt;// create some Books&lt;/span&gt;
      &lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;[] books = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;[]
      {
        &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt; { InternalId=1, Title=&lt;span style="color:#A31515"&gt;&amp;quot;The Road Ahead&amp;quot;&lt;/span&gt;, Authors=&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt;[] {&lt;span style="color:#A31515"&gt;&amp;quot;Bill Gates&amp;quot;&lt;/span&gt;}, Isbn13=&lt;span style="color:#A31515"&gt;&amp;quot;978-0670859139&amp;quot;&lt;/span&gt;, Genre=&lt;span style="color:#2B91AF"&gt;Genre&lt;/span&gt;.Autobiography },
        &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt; { InternalId=2, Title=&lt;span style="color:#A31515"&gt;&amp;quot;Beowulf&amp;quot;&lt;/span&gt;, Authors=&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt;[] {&lt;span style="color:#A31515"&gt;&amp;quot;Anonymous&amp;quot;&lt;/span&gt;}, Isbn13=&lt;span style="color:#A31515"&gt;&amp;quot;978-1588278296&amp;quot;&lt;/span&gt;, Extract=&lt;span style="color:#A31515"&gt;&amp;quot;That grim spirit was called Grendel,\nFamous waste-wanderer that held the moors\nFen and fastness; the land of the race of monsters\nThe unhappy creature occupied for a while\nAfter the Creator had condemned them.&amp;quot;&lt;/span&gt;, Genre=&lt;span style="color:#2B91AF"&gt;Genre&lt;/span&gt;.Classic },
        &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt; { InternalId=3, Title=&lt;span style="color:#A31515"&gt;&amp;quot;The C Programming Language (2nd Edition)&amp;quot;&lt;/span&gt;, Authors=&lt;span style="color:blue"&gt;new&lt;/span&gt;&lt;span style="color:blue"&gt;string&lt;/span&gt;[] {&lt;span style="color:#A31515"&gt;&amp;quot;Brian W Kernighan&amp;quot;&lt;/span&gt;,&lt;span style="color:#A31515"&gt;&amp;quot;Dennis M Ritchie&amp;quot;&lt;/span&gt;}, Isbn13=&lt;span style="color:#A31515"&gt;&amp;quot;978-0131103627&amp;quot;&lt;/span&gt;, Genre=&lt;span style="color:#2B91AF"&gt;Genre&lt;/span&gt;.ComputingText },
      };

      &lt;span style="color:green"&gt;// copy the existing attributes into an XmlAttributeOverrides instance (providing an&lt;/span&gt;
      &lt;span style="color:green"&gt;// Action which tweaks the attributes for Book.Isbn13)&lt;/span&gt;
      &lt;span style="color:#2B91AF"&gt;XmlAttributeOverrides&lt;/span&gt; xmlAttributeOverrides = GetXmlAttributeOverrides(&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Type&lt;/span&gt;[] { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;), &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;Genre&lt;/span&gt;) },
        (type, memberName, xmlAttributes) =&amp;gt;
        {
          &lt;span style="color:blue"&gt;if&lt;/span&gt; (type == &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;) &amp;amp;&amp;amp; memberName == &lt;span style="color:#A31515"&gt;&amp;quot;Isbn13&amp;quot;&lt;/span&gt;)
          {
            &lt;span style="color:green"&gt;// remove the sttribute which specifies an element named &amp;quot;isbn13&amp;quot;&lt;/span&gt;
            xmlAttributes.XmlElements.Clear();
            &lt;span style="color:green"&gt;// and add an attribute which specifies an attribute named &amp;quot;isbn&amp;quot;&lt;/span&gt;
            xmlAttributes.XmlAttribute = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAttributeAttribute&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;isbn&amp;quot;&lt;/span&gt;);
          }
        });

      &lt;span style="color:green"&gt;// serialise the books into a MemoryStream (using the overrides)&lt;/span&gt;
      &lt;span style="color:#2B91AF"&gt;XmlSerializer&lt;/span&gt; xmlSerializer = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlSerializer&lt;/span&gt;(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;[]), xmlAttributeOverrides);
      &lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt;();
      xmlSerializer.Serialize(memoryStream, books);

      &lt;span style="color:green"&gt;// write the contents of the MemoryStream to the Console&lt;/span&gt;
      memoryStream.Position = 0L;
      &lt;span style="color:#2B91AF"&gt;StreamReader&lt;/span&gt; streamReader = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;StreamReader&lt;/span&gt;(memoryStream);
      &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(streamReader.ReadToEnd());

      &lt;span style="color:green"&gt;// wait for user to hit ENTER&lt;/span&gt;
      &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.ReadLine();
    }

    &lt;span style="color:blue"&gt;private&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAttributeOverrides&lt;/span&gt; GetXmlAttributeOverrides(&lt;span style="color:#2B91AF"&gt;Type&lt;/span&gt;[] types, &lt;span style="color:#2B91AF"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:#2B91AF"&gt;Type&lt;/span&gt;, &lt;span style="color:blue"&gt;string&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;XmlAttributes&lt;/span&gt;&amp;gt; tweakAttributesAction)
    {
      &lt;span style="color:#2B91AF"&gt;XmlAttributeOverrides&lt;/span&gt; xmlAttributeOverrides = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAttributeOverrides&lt;/span&gt;();
      &lt;span style="color:#2B91AF"&gt;XmlAttributes&lt;/span&gt; xmlAttributes;

       &lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;Type&lt;/span&gt; type &lt;span style="color:blue"&gt;in&lt;/span&gt; types)
       {
        &lt;span style="color:green"&gt;// get the Type&amp;#39;s attributes first&lt;/span&gt;
        xmlAttributes = GetXmlAttributes(type.GetCustomAttributes(&lt;span style="color:blue"&gt;false&lt;/span&gt;));
        xmlAttributeOverrides.Add(type, xmlAttributes);

        &lt;span style="color:green"&gt;// then iterate over the members, checking those attributes too&lt;/span&gt;
        &lt;span style="color:blue"&gt;if&lt;/span&gt; (type.IsEnum)
        {
          &lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;FieldInfo&lt;/span&gt; fieldInfo &lt;span style="color:blue"&gt;in&lt;/span&gt; type.GetFields(&lt;span style="color:#2B91AF"&gt;BindingFlags&lt;/span&gt;.Static | &lt;span style="color:#2B91AF"&gt;BindingFlags&lt;/span&gt;.Public))
          {
            xmlAttributes = GetXmlAttributes(fieldInfo.GetCustomAttributes(&lt;span style="color:blue"&gt;false&lt;/span&gt;));
            tweakAttributesAction(type, fieldInfo.Name, xmlAttributes);
            xmlAttributeOverrides.Add(type, fieldInfo.Name, xmlAttributes);
          }
        }
        &lt;span style="color:blue"&gt;else&lt;/span&gt;
        {
          &lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;PropertyInfo&lt;/span&gt; propertyInfo &lt;span style="color:blue"&gt;in&lt;/span&gt; type.GetProperties())
          {
            xmlAttributes = GetXmlAttributes(propertyInfo.GetCustomAttributes(&lt;span style="color:blue"&gt;false&lt;/span&gt;));
            tweakAttributesAction(type, propertyInfo.Name, xmlAttributes);
            xmlAttributeOverrides.Add(type, propertyInfo.Name, xmlAttributes);
          }
        }
      }

      &lt;span style="color:blue"&gt;return&lt;/span&gt; xmlAttributeOverrides;
    }

    &lt;span style="color:blue"&gt;private&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAttributes&lt;/span&gt; GetXmlAttributes(&lt;span style="color:blue"&gt;object&lt;/span&gt;[] attributes)
    {
      &lt;span style="color:#2B91AF"&gt;XmlAttributes&lt;/span&gt; xmlAttributes =&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAttributes&lt;/span&gt;();

      &lt;span style="color:#2B91AF"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#2B91AF"&gt;Type&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:blue"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; dictionary = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#2B91AF"&gt;Type&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:blue"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;()
      {
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlAnyAttributeAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlAnyAttribute = attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAnyAttributeAttribute&lt;/span&gt; },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlAnyElementAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlAnyElements.Add(attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAnyElementAttribute&lt;/span&gt;) },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlArrayAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlArray = attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlArrayAttribute&lt;/span&gt; },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlArrayItemAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlArrayItems.Add(attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlArrayItemAttribute&lt;/span&gt;) },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlAttributeAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlAttribute = attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAttributeAttribute&lt;/span&gt; },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;DefaultValueAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlDefaultValue = (attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;DefaultValueAttribute&lt;/span&gt;).Value },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlElementAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlElements.Add(attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlElementAttribute&lt;/span&gt;) },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlEnumAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlEnum = attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlEnumAttribute&lt;/span&gt; },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlIgnoreAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlIgnore = &lt;span style="color:blue"&gt;true&lt;/span&gt; },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlNamespaceDeclarationsAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.Xmlns = &lt;span style="color:blue"&gt;true&lt;/span&gt; },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlRootAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlRoot = attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlRootAttribute&lt;/span&gt; },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlTextAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlText = attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlTextAttribute&lt;/span&gt; },
        { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;XmlTypeAttribute&lt;/span&gt;), attribute =&amp;gt; xmlAttributes.XmlType = attribute &lt;span style="color:blue"&gt;as&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlTypeAttribute&lt;/span&gt; },
      };

      &lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue"&gt;object&lt;/span&gt; attribute &lt;span style="color:blue"&gt;in&lt;/span&gt; attributes)
      {
        &lt;span style="color:green"&gt;// establish what type of attribute we&amp;#39;re dealing with&lt;/span&gt;
        &lt;span style="color:#2B91AF"&gt;Type&lt;/span&gt; type = attribute.GetType();
        &lt;span style="color:green"&gt;// if the attribute is one of those supported by XmlAttributes&lt;/span&gt;
        &lt;span style="color:blue"&gt;if&lt;/span&gt; (dictionary.ContainsKey(type))
        {
          &lt;span style="color:green"&gt;// lookup the appropriate action and invoke it&lt;/span&gt;
          dictionary[type](attribute);
        }
      }

      &lt;span style="color:blue"&gt;return&lt;/span&gt; xmlAttributes;
    }
}
&lt;/pre&gt;
&lt;p&gt;
 You'll notice that I use an Action to tweak the existing attributes prior to copying them into the XmlAttributeOverrides
 object, rather than simpy copying them all into the XmlAttributeOverrides object and then tweaking them there. This is
 because you can only add attributes to XmlAttributeOverrides - you can't remove them or modify them.
&lt;/p&gt;
&lt;p&gt;
  The above code produced the following output. Note that the Isbn13 property has been serialised into an &lt;i&gt;attribute&lt;/i&gt;
  named isbn, contrary to what the attributes applied statically request. Also note that all other attributes have been
  honoured.
&lt;/p&gt;
&lt;pre class="console"&gt;
&amp;lt;?xml version="1.0"?&gt;
&amp;lt;ArrayOfBook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &amp;lt;Book xmlns:ns="http://tempuri.org" isbn="978-0670859139" genre="autobiography"&gt;
    &amp;lt;ns:title&gt;The Road Ahead&amp;lt;/ns:title&gt;
    &amp;lt;ns:authors&gt;
      &amp;lt;ns:author&gt;Bill Gates&amp;lt;/ns:author&gt;
    &amp;lt;/ns:authors&gt;
  &amp;lt;/Book&gt;
  &amp;lt;Book xmlns:ns="http://tempuri.org" isbn="978-1588278296" genre="classic"&gt;
    &amp;lt;ns:title&gt;Beowulf&amp;lt;/ns:title&gt;
    &amp;lt;ns:authors&gt;
      &amp;lt;ns:author&gt;Anonymous&amp;lt;/ns:author&gt;
    &amp;lt;/ns:authors&gt;That grim spirit was called Grendel,
Famous waste-wanderer that held the moors
Fen and fastness; the land of the race of monsters
The unhappy creature occupied for a while
After the Creator had condemned them.&amp;lt;/Book&gt;
  &amp;lt;Book xmlns:ns="http://tempuri.org" isbn="978-0131103627" genre="computing-text"&gt;
    &amp;lt;ns:title&gt;The C Programming Language (2nd Edition)&amp;lt;/ns:title&gt;
    &amp;lt;ns:authors&gt;
      &amp;lt;ns:author&gt;Brian W Kernighan&amp;lt;/ns:author&gt;
      &amp;lt;ns:author&gt;Dennis M Ritchie&amp;lt;/ns:author&gt;
    &amp;lt;/ns:authors&gt;
  &amp;lt;/Book&gt;
&amp;lt;/ArrayOfBook&gt;
&lt;/pre&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;
  So, to selectively override XML serialisation attributes, simply create an XmlAttributeOverrides which contains all the
  attributes you want to apply - even if you have to copy most of them from the attributes applied statically.
&lt;/p&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/04/default-values-dont-get-serialised.html"&gt;Default Value's Don't Get Serialised&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-5450177743057933712?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/pD1K6mXOdto" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/5450177743057933712/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2010/05/selectively-overriding-xml.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/5450177743057933712?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/5450177743057933712?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/pD1K6mXOdto/selectively-overriding-xml.html" title="Selectively Overriding XML Serialisation Attributes" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2010/05/selectively-overriding-xml.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cHSHk4cSp7ImA9Wx9TFEQ.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-1558636982129795482</id><published>2010-10-17T13:20:00.000+01:00</published><updated>2010-11-23T07:57:19.739Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-23T07:57:19.739Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="XML Serialisation" /><title>Default Values Don't Get Serialised</title><content type="html">&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;
  I came across some unusual behaviour during XML Serialisation recently and thought I'd share both
  the problem and my solution to it.
&lt;/p&gt;
&lt;p&gt;
  To demonstrate the behaviour I've created a small console application which serialises two Book objects to the Console.
  I've marked the default value of the Author property as "Anonymous", which seems reasonable enough. The second of the two
  Book objects specifically has its Author property set to "Anonymous", which it doesn't really need to have - as that's
  the default value.
&lt;/p&gt;
&lt;p&gt;
  Here's the code:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.ComponentModel;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.IO;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Xml.Serialization;

&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; ConsoleApplication
{
  &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;Program&lt;/span&gt;
  {
    &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue"&gt;string&lt;/span&gt;[] args)
    {
      &lt;span style="color:green"&gt;// create some Books&lt;/span&gt;
      &lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;[] books = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;[]
      {
        &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt; { Title = &lt;span style="color:#A31515"&gt;&amp;quot;The Road Ahead&amp;quot;&lt;/span&gt;, Author = &lt;span style="color:#A31515"&gt;&amp;quot;Bill Gates&amp;quot;&lt;/span&gt;, Isbn13 = &lt;span style="color:#A31515"&gt;&amp;quot;978-0670859139&amp;quot;&lt;/span&gt; },
        &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt; { Title = &lt;span style="color:#A31515"&gt;&amp;quot;Beowulf&amp;quot;&lt;/span&gt;, Author = &lt;span style="color:#A31515"&gt;&amp;quot;Anonymous&amp;quot;&lt;/span&gt;, Isbn13 = &lt;span style="color:#A31515"&gt;&amp;quot;978-1588278296&amp;quot;&lt;/span&gt; },
      };

      &lt;span style="color:green"&gt;// serialise it into a MemoryStream&lt;/span&gt;
      &lt;span style="color:#2B91AF"&gt;XmlSerializer&lt;/span&gt; xmlSerializer = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlSerializer&lt;/span&gt;(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;[]));
      &lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;MemoryStream&lt;/span&gt;();
      xmlSerializer.Serialize(memoryStream, books);
    
      &lt;span style="color:green"&gt;// write the contents of the MemoryStream to the Console&lt;/span&gt;
      memoryStream.Position = 0L;
      &lt;span style="color:#2B91AF"&gt;StreamReader&lt;/span&gt; streamReader = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;StreamReader&lt;/span&gt;(memoryStream);
      &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.WriteLine(streamReader.ReadToEnd());

      &lt;span style="color:green"&gt;// wait for user to hit ENTER&lt;/span&gt;
      &lt;span style="color:#2B91AF"&gt;Console&lt;/span&gt;.ReadLine();
    }
  }

  &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;Book&lt;/span&gt;
  {
    [&lt;span style="color:#2B91AF"&gt;XmlElement&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;)]
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; Title { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }

    [&lt;span style="color:#2B91AF"&gt;XmlElement&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;author&amp;quot;&lt;/span&gt;)]
    [&lt;span style="color:#2B91AF"&gt;DefaultValue&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;Anonymous&amp;quot;&lt;/span&gt;)]
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; Author { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }
    
    [&lt;span style="color:#2B91AF"&gt;XmlElement&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;isbn13&amp;quot;&lt;/span&gt;)]
    &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; Isbn13 { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }
  }
}
&lt;/pre&gt;
&lt;p&gt;
  When I run the above, something odd happens. The Author property &lt;b&gt;is not serialised&lt;/b&gt; for the second book, as you'll
  see below. It turns out that this is by design. The theory is that if the default value has been used, then there's no
  need to explicitly output it - a consumer of the data will simply see that the element is missing and infer the default value.
&lt;/p&gt;
&lt;pre class='console'&gt;
&amp;lt;?xml version="1.0"?&gt;
&amp;lt;ArrayOfBook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &amp;lt;Book&gt;
    &amp;lt;title&gt;The Road Ahead&amp;lt;/title&gt;
    &amp;lt;author&gt;Bill Gates&amp;lt;/author&gt;
    &amp;lt;isbn13&gt;978-0670859139&amp;lt;/isbn13&gt;
  &amp;lt;/Book&gt;
  &amp;lt;Book&gt;
    &amp;lt;title&gt;Beowulf&amp;lt;/title&gt;
    &amp;lt;isbn13&gt;978-1588278296&amp;lt;/isbn13&gt;
  &amp;lt;/Book&gt;
&amp;lt;/ArrayOfBook&gt;
&lt;/pre&gt;
&lt;p&gt;
  The problem, obviously, is that this approach assumes that consumer is aware that a default value exists. Can you see any
  indication from the serialised XML that a default value exists, or that an element has been suppressed because it's value
  was equal to the default value? No - that information is hidden from the consumer. We're simply left to hope that the
  consumer is aware of this default value.
&lt;/p&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;p&gt;
  Well, the obvious solution is to simply remove the Default attribute from the Author property. But what if you can't? It's
  perfectly possible that you're serialising an object to which you do not have the source code. In my case I was serialising
  an object where the source code had been auto-generated from an series of XSDs - and was 43,600 lines long, and contained 72
  default constraints. If I can avoid editing auto-generated code I always will. So how?
&lt;/p&gt;
&lt;p&gt;
  Well, although I'd never used it before, there's an overload to the XmlSerializer which allows you to provide a series
  of overrides for the serialisation attributes. Unfortunately, it overrides &lt;i&gt;all&lt;/i&gt; of the serialisation attributes
  for a given type and member - you can't just say "use this Default attribute, but leave all other attributes alone". This
  means we need to re-state the XmlElement attribute to specify a name of "author" (otherwise you'll get the default of
  "Author"). The call to the XmlSerializer's constructor thus becomes:
&lt;/p&gt;
&lt;pre&gt;
      &lt;span style="color:#2B91AF"&gt;XmlAttributes&lt;/span&gt; bookAuthorXmlAttributes = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAttributes&lt;/span&gt;();
      bookAuthorXmlAttributes.XmlElements.Add(&lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlElementAttribute&lt;/span&gt;(&lt;span style="color:#A31515"&gt;&amp;quot;author&amp;quot;&lt;/span&gt;));
      &lt;span style="color:#2B91AF"&gt;XmlAttributeOverrides&lt;/span&gt; xmlAttributeOverrides = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlAttributeOverrides&lt;/span&gt;();
      xmlAttributeOverrides.Add(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;), &lt;span style="color:#A31515"&gt;&amp;quot;Author&amp;quot;&lt;/span&gt;,  bookAuthorXmlAttributes);
      &lt;span style="color:#2B91AF"&gt;XmlSerializer&lt;/span&gt; xmlSerializer = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;XmlSerializer&lt;/span&gt;(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2B91AF"&gt;Book&lt;/span&gt;[]), xmlAttributeOverrides);
&lt;/pre&gt;
&lt;p&gt;
  The output this time is:
&lt;/p&gt;
&lt;pre class="console"&gt;
&amp;lt;?xml version="1.0"?&gt;
&amp;lt;ArrayOfBook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &amp;lt;Book&gt;
    &amp;lt;title&gt;The Road Ahead&amp;lt;/title&gt;
    &amp;lt;author&gt;Bill Gates&amp;lt;/author&gt;
    &amp;lt;isbn13&gt;978-0670859139&amp;lt;/isbn13&gt;
  &amp;lt;/Book&gt;
  &amp;lt;Book&gt;
    &amp;lt;title&gt;Beowulf&amp;lt;/title&gt;
    &amp;lt;author&gt;Anonymous&amp;lt;/author&gt;
    &amp;lt;isbn13&gt;978-1588278296&amp;lt;/isbn13&gt;
  &amp;lt;/Book&gt;
&amp;lt;/ArrayOfBook&gt;
&lt;/pre&gt;
&lt;p&gt;
  Perfect. But it's a shame we've had to re-state the XmlElement attribute isn't it? It would be better if we could inspect the attributes
  which were already present and add all of these in the XmlAttributeOverrides, with the exception of the Default attribute we're trying to
  remove. That'll be the subject of my next post.
&lt;/p&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/05/selectively-overriding-xml.html"&gt;Selectively Overriding XML Serialisation Attributes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-1558636982129795482?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/cFvp_GPwHVI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/1558636982129795482/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2010/04/default-values-dont-get-serialised.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/1558636982129795482?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/1558636982129795482?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/cFvp_GPwHVI/default-values-dont-get-serialised.html" title="Default Values Don't Get Serialised" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2010/04/default-values-dont-get-serialised.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUCQng9fip7ImA9WxFTGU8.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-1771562619055562898</id><published>2010-04-10T18:57:00.000+01:00</published><updated>2010-04-10T18:57:43.666+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-10T18:57:43.666+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title>Validating Integers in SQL Server</title><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
  Hypothetical  scenario: Data has been loaded into a SQL Server table from a CSV file; each column
  in the table has been defined as VARCHAR(255) to prevent the data load job from failing if one or
  more values are not of the expected data type. You're job is to copy data from this 'raw' table
  into one where the columns are strongly typed (i.e. INT, DATETIME, DECIMAL, etc). The requirement
  is to pull through those rows which are entirely valid, but to ignore those rows where any value
  in the VARCHAR column cannot be successfully converted to the target data type. Actually,
  if rows which are only partially valid could be copied across too, with invalid values being set
  to NULL in the target table, then that would be even better.
&lt;/p&gt;
&lt;p&gt;  
  The requirement seems simple enough, but how would you do this? It's actually quite tricky
  to get right. So I'm going to make the scenario even simpler - you only have to support
  INT data types. Your job is simply to make sure that the supplied VARCHAR can be converted to
  an INT before you actual attempt to do so.
&lt;/p&gt;

&lt;h2&gt;ISNUMERIC&lt;/h2&gt;
&lt;p&gt;
  You first port-of-call might be to use ISNUMERIC to establish whether a source value is numeric.
  This sounds reasonable enough.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; &lt;span style='color:fuchsia'&gt;ISNUMERIC&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'9876543210'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  The above statement returns 1 - the value '9876543210' is numeric. But is it an INT? No - it's
  too large. The documentation for ISNUMERIC says that it returns 1 if the supplied character column
  can be converted to at least one of the numeric data types. So that's not particularly useful if
  we're trying to establish whether a value is a valid INT or not.
&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;
&lt;h2&gt;ARITHABORT&lt;/h2&gt;
&lt;p&gt;
  So you decide simply to convert the value, ignoring arithmetic overflows using SET ARITHABORT OFF. Let's try:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;SET&lt;/span&gt; &lt;span style='color:blue'&gt;ARITHABORT&lt;/span&gt; &lt;span style='color:blue'&gt;OFF&lt;/span&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; &lt;span style='color:fuchsia'&gt;CONVERT&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;INT&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; &lt;span style='color:red'&gt;'9876543210'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;

&lt;span style='color:red'&gt;Msg 248, Level 16, State 1, Line 2&lt;/span&gt;
&lt;span style='color:red'&gt;The conversion of the varchar value '9876543210' overflowed an int column. Maximum integer value exceeded.&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Then you remember that setting ARITHABORT OFF has no effect unless you also set ANSI_WARNINGS OFF.
  So you try again:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;SET&lt;/span&gt; &lt;span style='color:blue'&gt;ARITHABORT&lt;/span&gt; &lt;span style='color:blue'&gt;OFF&lt;/span&gt;
&lt;span style='color:blue'&gt;SET&lt;/span&gt; &lt;span style='color:blue'&gt;ANSI_WARNINGS&lt;/span&gt; &lt;span style='color:blue'&gt;OFF&lt;/span&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; &lt;span style='color:fuchsia'&gt;CONVERT&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;INT&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; &lt;span style='color:red'&gt;'9876543210'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Perfect - this selects the value NULL, which can be easily tested for.
&lt;/p&gt;

&lt;h2&gt;User-Defined Function&lt;/h2&gt;
&lt;p&gt;
  So we wrap this test into a user-defined function so it can be easily re-used.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;CREATE&lt;/span&gt; &lt;span style='color:blue'&gt;FUNCTION&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT
&lt;span style='color:gray'&gt;(&lt;/span&gt;
  @Input &lt;span style='color:blue'&gt;VARCHAR&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;255&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:blue'&gt;RETURNS&lt;/span&gt; &lt;span style='color:blue'&gt;BIT&lt;/span&gt;
&lt;span style='color:blue'&gt;AS&lt;/span&gt;
&lt;span style='color:blue'&gt;BEGIN&lt;/span&gt;
  &lt;span style='color:blue'&gt;SET&lt;/span&gt; &lt;span style='color:blue'&gt;ARITHABORT&lt;/span&gt; &lt;span style='color:blue'&gt;OFF&lt;/span&gt;
  &lt;span style='color:blue'&gt;SET&lt;/span&gt; &lt;span style='color:blue'&gt;ANSI_WARNINGS&lt;/span&gt; &lt;span style='color:blue'&gt;OFF&lt;/span&gt;
  &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:blue'&gt;CASE&lt;/span&gt; &lt;span style='color:blue'&gt;WHEN&lt;/span&gt; &lt;span style='color:fuchsia'&gt;CONVERT&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;INT&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; @Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;IS&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt; &lt;span style='color:blue'&gt;THEN&lt;/span&gt; 0 &lt;span style='color:blue'&gt;ELSE&lt;/span&gt; 1 &lt;span style='color:blue'&gt;END&lt;/span&gt;
&lt;span style='color:blue'&gt;END&lt;/span&gt;
GO

&lt;span style='color:red'&gt;Msg 443, Level 16, State 15, Procedure IsINT, Line 8&lt;/span&gt;
&lt;span style='color:red'&gt;Invalid use of side-effecting or time-dependent operator in 'SET OPTION OFF' within a function.&lt;/span&gt;
&lt;span style='color:red'&gt;Msg 443, Level 16, State 15, Procedure IsINT, Line 9&lt;/span&gt;
&lt;span style='color:red'&gt;Invalid use of side-effecting or time-dependent operator in 'SET OPTION OFF' within a function.&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  We can't use SET &lt;em&gt;option&lt;/em&gt; OFF within a function? That's a shame. Okay, so we'll have to require that the
  caller does this. But the least we should do is check that they have.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;CREATE&lt;/span&gt; &lt;span style='color:blue'&gt;FUNCTION&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT
&lt;span style='color:gray'&gt;(&lt;/span&gt;
  @Input &lt;span style='color:blue'&gt;VARCHAR&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;255&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:blue'&gt;RETURNS&lt;/span&gt; &lt;span style='color:blue'&gt;BIT&lt;/span&gt;
&lt;span style='color:blue'&gt;AS&lt;/span&gt;
&lt;span style='color:blue'&gt;BEGIN&lt;/span&gt;
  &lt;span style='color:blue'&gt;IF&lt;/span&gt; &lt;span style='color:fuchsia'&gt;SESSIONPROPERTY&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'ARITHABORT'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;=&lt;/span&gt; 1
    &lt;span style='color:blue'&gt;RAISERROR&lt;/span&gt; &lt;span style='color:gray'&gt;(&lt;/span&gt;N&lt;span style='color:red'&gt;'This function requires that ARITHABORT be set to OFF before it is called.'&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; 16&lt;span style='color:gray'&gt;,&lt;/span&gt; 1&lt;span style='color:gray'&gt;)&lt;/span&gt;

  &lt;span style='color:blue'&gt;IF&lt;/span&gt; &lt;span style='color:fuchsia'&gt;SESSIONPROPERTY&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'ANSI_WARNINGS'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;=&lt;/span&gt; 1
    &lt;span style='color:blue'&gt;RAISERROR&lt;/span&gt; &lt;span style='color:gray'&gt;(&lt;/span&gt;N&lt;span style='color:red'&gt;'This function requires that ANSI_WARNINGS be set to OFF before it is called.'&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; 16&lt;span style='color:gray'&gt;,&lt;/span&gt; 1&lt;span style='color:gray'&gt;)&lt;/span&gt;

  &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:blue'&gt;CASE&lt;/span&gt; &lt;span style='color:blue'&gt;WHEN&lt;/span&gt; &lt;span style='color:fuchsia'&gt;CONVERT&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;INT&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; @Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;IS&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt; &lt;span style='color:blue'&gt;THEN&lt;/span&gt; 0 &lt;span style='color:blue'&gt;ELSE&lt;/span&gt; 1 &lt;span style='color:blue'&gt;END&lt;/span&gt;
&lt;span style='color:blue'&gt;END&lt;/span&gt;

&lt;span style='color:red'&gt;Msg 443, Level 16, State 14, Procedure IsINT, Line 9&lt;/span&gt;
&lt;span style='color:red'&gt;Invalid use of side-effecting or time-dependent operator in 'RAISERROR' within a function.&lt;/span&gt;
&lt;span style='color:red'&gt;Msg 443, Level 16, State 14, Procedure IsINT, Line 12&lt;/span&gt;
&lt;span style='color:red'&gt;Invalid use of side-effecting or time-dependent operator in 'RAISERROR' within a function.&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Nope. Can't do that either. We'll just have to be content with returning NULL if the options haven't
  been set correctly and hoping the caller has read the documentation for our function.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;CREATE&lt;/span&gt; &lt;span style='color:blue'&gt;FUNCTION&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT
&lt;span style='color:gray'&gt;(&lt;/span&gt;
  @Input &lt;span style='color:blue'&gt;VARCHAR&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;255&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:blue'&gt;RETURNS&lt;/span&gt; &lt;span style='color:blue'&gt;BIT&lt;/span&gt;
&lt;span style='color:blue'&gt;AS&lt;/span&gt;
&lt;span style='color:green'&gt;-- Note to callers: ARITHABORT and ANSI_WARNINGS must be set to OFF&lt;/span&gt;
&lt;span style='color:green'&gt;-- before calling; if not, this function will always return NULL.&lt;/span&gt;
&lt;span style='color:blue'&gt;BEGIN&lt;/span&gt;
  &lt;span style='color:blue'&gt;IF&lt;/span&gt; &lt;span style='color:fuchsia'&gt;SESSIONPROPERTY&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'ARITHABORT'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;=&lt;/span&gt; 1
    &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt;

  &lt;span style='color:blue'&gt;IF&lt;/span&gt; &lt;span style='color:fuchsia'&gt;SESSIONPROPERTY&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'ANSI_WARNINGS'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;=&lt;/span&gt; 1
    &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt;

  &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:blue'&gt;CASE&lt;/span&gt; &lt;span style='color:blue'&gt;WHEN&lt;/span&gt; &lt;span style='color:fuchsia'&gt;CONVERT&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;INT&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; @Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;IS&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt; &lt;span style='color:blue'&gt;THEN&lt;/span&gt; 0 &lt;span style='color:blue'&gt;ELSE&lt;/span&gt; 1 &lt;span style='color:blue'&gt;END&lt;/span&gt;
&lt;span style='color:blue'&gt;END&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Let's try our function with something which is clearly a valid integer:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'12345'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Ooops - forgot to set ARITHABORT and ANSI_WARNINGS off so it returned NULL.
  Good job it warned me. Let's try again.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;SET&lt;/span&gt; &lt;span style='color:blue'&gt;ARITHABORT&lt;/span&gt; &lt;span style='color:blue'&gt;OFF&lt;/span&gt;
&lt;span style='color:blue'&gt;SET&lt;/span&gt; &lt;span style='color:blue'&gt;ANSI_WARNINGS&lt;/span&gt; &lt;span style='color:blue'&gt;OFF&lt;/span&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'12345'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  That worked (it returned 1). Let's throw a few more valid integers at it:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'2147483647'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'0'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'-0'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'-'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:green'&gt;-- treated as 0&lt;/span&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'-2147483648'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Yup - they all returned 1. How about a couple which are out-of-range:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'2147483648'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'-2147483649'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Both these returned 0. Finally, let's check to see what happens when we pass a non-integer
  number or a non-numeric value.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'1.23'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;

&lt;span style='color:red'&gt;Msg 245, Level 16, State 1, Line 1&lt;/span&gt;
&lt;span style='color:red'&gt;Conversion failed when converting the varchar value '1.23' to data type int.&lt;/span&gt;

&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'N/A'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;

&lt;span style='color:red'&gt;Msg 245, Level 16, State 1, Line 1&lt;/span&gt;
&lt;span style='color:red'&gt;Conversion failed when converting the varchar value 'N/A' to data type int.&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Not so good. It seems that ARITHABORT can only be used to suppress errors of an arithmetic
  nature, not all conversion errors.
&lt;/p&gt;

&lt;h2&gt;Numeric, but not Integer&lt;/h2&gt;
&lt;p&gt;
We can cater for non-numerics by using ISNUMERIC within our function:
&lt;/p&gt;  
&lt;pre&gt;
  &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:blue'&gt;CASE&lt;/span&gt; &lt;span style='color:blue'&gt;WHEN&lt;/span&gt; &lt;span style='color:fuchsia'&gt;ISNUMERIC&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;@Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;=&lt;/span&gt; 0 &lt;span style='color:gray'&gt;OR&lt;/span&gt; &lt;span style='color:fuchsia'&gt;CONVERT&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;INT&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; @Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;IS&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt; &lt;span style='color:blue'&gt;THEN&lt;/span&gt; 0 &lt;span style='color:blue'&gt;ELSE&lt;/span&gt; 1 &lt;span style='color:blue'&gt;END&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  But how are we going to cope with '1.23' without raising an error? I guess we could convert
  the input to a FLOAT first (on the assumption that all genuine numerics will convert to a FLOAT)
  and then check to see if there are any digits to the right of the decimal place. Or we could
  take a look for a '.' within the input string. We might need to be a little careful as I'm sure
  there are some locales which use a character other than '.' as the decimal symbol, although
  I'm not sure what support SQL Server has for these. A quick check in Control Panel shows that
  the decimal symbol is indeed configurable within Windows itself, with the default in France being ','.
  I can't see any support for this within SQL Server though so perhaps that's a red herring.
&lt;/p&gt;
&lt;p&gt;
  So let's go with the simple option of looking for a '.' within the input string; if we find one
  we know the input cannot be an integer. (I'm ignoring the question of whether or not "1.0" should be
  considered an integer for the moment.)
&lt;/p&gt;
&lt;p&gt;
  Our RETURN statement thus becomes:
&lt;/p&gt;
&lt;pre&gt;
  &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:blue'&gt;CASE&lt;/span&gt; &lt;span style='color:blue'&gt;WHEN&lt;/span&gt; &lt;span style='color:fuchsia'&gt;CHARINDEX&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'.'&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; @Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;!=&lt;/span&gt; 0 &lt;span style='color:gray'&gt;OR&lt;/span&gt; &lt;span style='color:fuchsia'&gt;ISNUMERIC&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;@Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;=&lt;/span&gt; 0 &lt;span style='color:gray'&gt;OR&lt;/span&gt; &lt;span style='color:fuchsia'&gt;CONVERT&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;INT&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; @Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;IS&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt; &lt;span style='color:blue'&gt;THEN&lt;/span&gt; 0 &lt;span style='color:blue'&gt;ELSE&lt;/span&gt; 1 &lt;span style='color:blue'&gt;END&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Surely we must have tested for everything now: we only even attempt the conversion if the
  input is devoid of a '.' and is considered to be numeric, and then we ignore the result
  of any arithmetic overflow. Job done.
&lt;/p&gt;

&lt;h2&gt;Exponential Notation&lt;/h2&gt;
&lt;p&gt;
  Hang on a moment. What about integers expressed in exponential form? What happens if we
  try our IsINT function against '1E5'. It doesn't contain a '.', is numeric, and shouldn't
  cause an overflow. Let's see:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;SELECT&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'1E5'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt;

&lt;span style='color:red'&gt;Msg 245, Level 16, State 1, Line 1&lt;/span&gt;
&lt;span style='color:red'&gt;Conversion failed when converting the varchar value '1E5' to data type int.&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  Now 1E5 is certainly an integer. It's just 100000 expressed in exponential form. But the
  requirement was to &lt;cite&gt;"to make sure that the supplied VARCHAR can be converted to
  an INT"&lt;/cite&gt;. So the fact that 1E5 &lt;em&gt;is&lt;/em&gt; an
  integer is irrelevant - we only care about whether or not it can be converted to an INT.
  It cannot. In fact, this little 'Get Out of Jail Free' card allows us to ignore the issue
  of whether or not "1.0" is an integer or not too - CONVERT chokes on it, and that's all that
  counts.
&lt;/p&gt;
&lt;p&gt;
  So, it's looks like we're going to have to handle this as a special case. Using the same
  approach we used when checking for a '.' seems the right thing to do. Actually, seeing as we'll
  have to check for '.', 'E' and 'e' we might as well use LIKE.
&lt;/p&gt;

&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;
  The final solution we end up with is therefore:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;CREATE&lt;/span&gt; &lt;span style='color:blue'&gt;FUNCTION&lt;/span&gt; dbo&lt;span style='color:gray'&gt;.&lt;/span&gt;IsINT
&lt;span style='color:gray'&gt;(&lt;/span&gt;
  @Input &lt;span style='color:blue'&gt;VARCHAR&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;255&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:gray'&gt;)&lt;/span&gt;
&lt;span style='color:blue'&gt;RETURNS&lt;/span&gt; &lt;span style='color:blue'&gt;BIT&lt;/span&gt;
&lt;span style='color:blue'&gt;AS&lt;/span&gt;
&lt;span style='color:green'&gt;-- Note to callers: ARITHABORT and ANSI_WARNINGS must be set to OFF&lt;/span&gt;
&lt;span style='color:green'&gt;-- before calling; if not this function will always return NULL.&lt;/span&gt;
&lt;span style='color:blue'&gt;BEGIN&lt;/span&gt;
  &lt;span style='color:blue'&gt;IF&lt;/span&gt; &lt;span style='color:fuchsia'&gt;SESSIONPROPERTY&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'ARITHABORT'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;=&lt;/span&gt; 1
    &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt;
&lt;span style='color:gray'&gt;&lt;/span&gt;
  &lt;span style='color:blue'&gt;IF&lt;/span&gt; &lt;span style='color:fuchsia'&gt;SESSIONPROPERTY&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:red'&gt;'ANSI_WARNINGS'&lt;/span&gt;&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;=&lt;/span&gt; 1
    &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt;
&lt;span style='color:gray'&gt;&lt;/span&gt;
  &lt;span style='color:blue'&gt;RETURN&lt;/span&gt; &lt;span style='color:blue'&gt;CASE&lt;/span&gt; &lt;span style='color:blue'&gt;WHEN&lt;/span&gt; @Input &lt;span style='color:gray'&gt;LIKE&lt;/span&gt; &lt;span style='color:red'&gt;'%[.Ee]%'&lt;/span&gt; &lt;span style='color:gray'&gt;OR&lt;/span&gt; &lt;span style='color:fuchsia'&gt;ISNUMERIC&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;@Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;=&lt;/span&gt; 0 &lt;span style='color:gray'&gt;OR&lt;/span&gt; &lt;span style='color:fuchsia'&gt;CONVERT&lt;/span&gt;&lt;span style='color:gray'&gt;(&lt;/span&gt;&lt;span style='color:blue'&gt;INT&lt;/span&gt;&lt;span style='color:gray'&gt;,&lt;/span&gt; @Input&lt;span style='color:gray'&gt;)&lt;/span&gt; &lt;span style='color:gray'&gt;IS&lt;/span&gt; &lt;span style='color:gray'&gt;NULL&lt;/span&gt; &lt;span style='color:blue'&gt;THEN&lt;/span&gt; 0 &lt;span style='color:blue'&gt;ELSE&lt;/span&gt; 1 &lt;span style='color:blue'&gt;END&lt;/span&gt;
&lt;span style='color:blue'&gt;END&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  That's quite a lot of effort just to establish whether a VARCHAR can convert into an INT. Imagine how
  much more effort it would be if we needed to support DATETIME types too, with all their variations, or
  DECIMALs with precision and scale to account for. And even now, I don't know for sure that IsINT won't
  thrown an exception one day when someone passes something to it which I haven't allowed for.
&lt;/p&gt;
&lt;p&gt;
  So, the next time someone suggests you just load data as VARCHARs and do the conversion to a 
  string type within SQL Server, I hope you'll at least think twice before saying what a good idea
  that is.
&lt;/p&gt;

&lt;h2&gt;Post Script&lt;/h2&gt;
&lt;p&gt;
  In case any of you are thinking that the easy option would simply be to wrap the attempted conversion
  in a TRY CATCH block, you're out of luck. SQL Server doesn't support the use of exception handling
  within a user-defined function. And clearly you don't want to attempt to convert an entire set of
  data within a TRY CATCH block as a single conversion failure will drop you into the CATCH block, whilst
  we want good data to survive. The only way I can see to use the TRY CATCH approach is to CURSOR
  over the set of data being converted. Okay for small sets of data perhaps, but not for anything larger.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-1771562619055562898?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/50wf0rMFuw8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/1771562619055562898/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2010/04/validating-integers-in-sql-server.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/1771562619055562898?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/1771562619055562898?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/50wf0rMFuw8/validating-integers-in-sql-server.html" title="Validating Integers in SQL Server" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2010/04/validating-integers-in-sql-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUGQno8eCp7ImA9WxFTEEs.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-1351354499101841743</id><published>2010-03-31T21:43:00.002+01:00</published><updated>2010-03-31T21:43:43.470+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-31T21:43:43.470+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Strong Names" /><title>Strong Name Storage</title><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
  In &lt;a href="http://ianpicknell.blogspot.com/2009/12/adding-strong-name-to-third-party.html"&gt;Adding a Strong Name to a Third-Party Assembly&lt;/a&gt;
  I described how you can add a strong name to a third-party assembly by disassembling that assembly into
  IL using ILDASM and then re-assemble it with ILASM, specifying a strong name key.
&lt;/p&gt;
&lt;p&gt;
  I never really liked that approach. It seemed like using a sledge-hammer to crack a nut: just because we
  want to add a few bytes (i.e. the strong name) into an assembly, we have to break the entire assembly
  apart and put it back together again?
&lt;/p&gt;
&lt;p&gt;
  It always struck me as odd that the Strong Name Tool (SN.exe) provided no support for adding a strong
  name signature to a assembly, unless one already existed or the assembly had at least been delayed signed
  at compilation stage. Is adding a few bytes into the assembly to accommodate the strong name signature
  &lt;em&gt;really&lt;/em&gt; that hard?
&lt;/p&gt;
&lt;p&gt;
  So for the last couple of weeks I've been studying both:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/pecoff_v8.docx"&gt;Microsoft Portable Executable and Common Object File Format Specification&lt;/a&gt; (Word) and&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://download.microsoft.com/download/D/C/1/DC1B219F-3B11-4A05-9DA3-2D0F98B20917/Partition%20II%20Metadata.doc"&gt;Common Language Infrastructure (CLI) Partition II: Metadata Definition and Semantics&lt;/a&gt; (Word).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  These documents describe the physical structure of .NET assemblies. Using the information contained
  therein, I've been able to establish just how a strong name is stored within an assembly. It's not
  pretty.
&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;
&lt;h2&gt;Portable Executable / Common Object File Format&lt;/h2&gt;
&lt;p&gt;
  A PE/COFF file (which all Windows EXEs/DLLs are) contains a series of headers followed by a series
  of sections. Each section must being on a boundary defined by the File Alignment field within one of
  the headers, which indicates that each section begins on either a 512-byte or 4096-byte boundary. We
  are only really interested in the section named ".text" as it is this section which contains the Strong
  Name Signature and the CLI Meta Data.
&lt;/p&gt;
&lt;h2&gt;CLR Runtime Header / CLI Header&lt;/h2&gt;
&lt;p&gt;
  Within one of the headers exists a Data Directory which references various tables and strings within
  the image. The 14th entry in the Data Directory (counting from 0) contains the VirtualAddress and Size
  of the a header referred to variously as the CLR Runtime Header or CLI Header. I'll use the term 
  CLI Header for the sake of consistency.
&lt;/p&gt;
&lt;p&gt;  
  The VirtualAddress of the CLI Header is the address of the first byte of the header relative to the
  image base when the section is loaded into memory. As we're dealing with the file itself, not an
  in-memory image, we need to refer to the virtual address of the containing section and the file offset
  of the first byte of the section to establish the file offset of the CLI Header.
&lt;/p&gt;
&lt;h2&gt;Strong Name Signature&lt;/h2&gt;
&lt;p&gt;
  The strong name itself is referenced by two fields within the CLI Header - StrongNameSignatureRVA
  and StrongNameSignatureSize. In a weak-named assembly both of these fields are set to 0. In a
  strong-named assembly they contain the relative virtual address (i.e. the offset relative to the
  start of the containing section) and size (in bytes) of the strong name signature. We &lt;em&gt;could&lt;/em&gt;
  attempt to derive the strong name ourselves, but there seems little point. All we really need to do is
  set each byte in the strong name signature to 0x00 as that will represent a delay-signed assembly.
  We can then have the Strong Name Tool (SN.exe) perform the actual signing.
&lt;/p&gt;
&lt;p&gt;
  Given that each section is padded to a 512-byte (or 4096-byte) boundary anyway, it's possible that
  we can simply point StrongNameSignatureRVA to some location within this 'padding' area and make
  &lt;em&gt;that&lt;/em&gt; the strong name signature. But it's also quite likely that there will be insufficient
  free space within the section to accommodate the strong name, so the section itself may need to be
  lengthened. Obviously this will mean the sections which follow it will need to be moved, and all the
  offsets within the headers will need to be updated to reference their new locations.
&lt;/p&gt;
&lt;h2&gt;Public Key&lt;/h2&gt;
&lt;p&gt;
  Although we may leave the Strong Name Signature itself full of 0x00 bytes, we can't get away without
  setting the Public Key. Establishing where to locate the Strong Name Signature above was fairly easy -
  the location of the public key is a little more tricky.
&lt;/p&gt;
&lt;p&gt;
  First, we have to reference the MetaDataRVA and MetaDataSize fields within the CLI Header to establish
  the location of the CLI Meta Data within the image. The CLI Meta Data consists of a header plus
  five streams of data. One of these streams, #Blob (the Blob Heap), contains the 160-byte public key.
  Unfortunately, entries within the Blob Heap are not named - they are referenced by their offset
  relative to the start of the stream - so we can't just add a new entry to this stream and be done with
  it. The  entry which refers to the public key within the Blob Heap in within a separate steam, #~, which
  consists of a series of tables with varying structures.
&lt;/p&gt;
&lt;p&gt;
  The simplest .NET application you can think of will contain the following tables: Module, TypeRef,
  TypeDef, MethodDef, MemberRef, CustomAttribute, Assembly and AssemblyRef. The reference to the public
  key is stored within the Assembly table. But to even find the Assembly table you need to seek past
  all the tables preceding it (the list above is in order, so Assembly is one of the last tables).
&lt;/p&gt;
&lt;p&gt;
  To establish the location of the Assembly table you need to know which tables precede it (the list
  above is a minimum set, there may be many other tables in a given assembly). This list of tables is
  readily available. You also need to know how many rows are in each table. This too, is readily available.
  Finally, you need to know how wide each row is. Establishing this is not so straight-forward.
  For example, the Extends column in the TypeDef table contains an index into the TypeDef, TypeRef,
  or TypeSpec tables. This index will occupy 2 or 4 bytes depending upon the number of rows in those
  tables. Such an index is referred to in the specification as a coded index "using 2 bytes if the maximum
  number of rows of tables t&lt;sub&gt;0&lt;/sub&gt;, ...t&lt;sub&gt;&lt;em&gt;n&lt;/em&gt;-1&lt;/sub&gt;, is less than
  2&lt;sup&gt;(16 – (log &lt;em&gt;n&lt;/em&gt;))&lt;/sup&gt;, and using 4 bytes otherwise". In this example &lt;em&gt;n&lt;/em&gt; is 3 (as
  the index may reference one of 3 separate tables).
&lt;/p&gt;
&lt;h2&gt;Method Implementations&lt;/h2&gt;
&lt;p&gt;
  One other thing we need to handle is the fact that the RVA field in reach row of the MethodDef
  table contains the relative virtual address of that method's implementation.
  Once we've inserted a zeroed-out strong name signature and a public key and into the file, these method
  implementations will now be at different locations so we'll have to update the RVAs too. A similar
  issue occurs with the RVA column in the FieldRVA table.
&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;
  Given all the above, it's no surprise that the Strong Name tool opted not to support this scenario.
  I don't give up easily, so I'm going to pursue my goal of creating a tool which performs all the magic
  necessary to add a strong name where the Strong Name Tool cannot. But I suspect I won't achieve this
  any time soon.
&lt;/p&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2009/12/adding-strong-name-to-third-party.html"&gt;Adding a Strong Name to a Third-Party Assembly&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/02/tampering-with-strong-named-assembly.html"&gt;Tampering with a Strong-Named Assembly&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/02/faking-strong-name.html"&gt;Faking a Strong Name&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/02/evading-strong-name-integrity-check.html"&gt;Evading the Strong Name Integrity Check&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-1351354499101841743?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/qkZ2MKi84Cs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/1351354499101841743/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2010/03/strong-name-storage.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/1351354499101841743?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/1351354499101841743?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/qkZ2MKi84Cs/strong-name-storage.html" title="Strong Name Storage" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2010/03/strong-name-storage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EEQ3g5eSp7ImA9WxBbE0o.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-8066958337813248542</id><published>2010-03-12T07:38:00.001Z</published><updated>2010-03-12T07:40:02.621Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-12T07:40:02.621Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ClickOnce" /><title>Launching a ClickOnce Application</title><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
  If you're anything like the me, you won’t be content with knowing that browsing to
  http://MyServer/MyVirtualDir/MyApplication.application downloads, installs and launches MyApplication.
  You'll want to know &lt;em&gt;how&lt;/em&gt; this is achieved. This post goes under the covers of ClickOnce to show
  you how it's done. Well, at least how &lt;em&gt;some&lt;/em&gt; of it is done.
&lt;/p&gt;
&lt;p&gt;
  As this post makes quite a lot of references to registry entries, I'll use the standard abbreviations
  HKCU and HKCR to represent the HKEY_CURRENT_USER and HKEY_CLASSES_ROOT hives respectively.
&lt;/p&gt;
               
&lt;h2&gt;Retrieving the Deployment Manifest&lt;/h2&gt;
&lt;p&gt;
  What happens when you browse to http://MyServer/MyVirtualDir/MyApplication.application?
&lt;/p&gt;
&lt;p&gt;
  The first thing to realise is that no 'magic' is happening behind the scenes. When you send an
  HTTP GET request to a web server (Internet Information Services, IIS, for example) the web server
  will typically react in one of two ways. It will either establish that your request must be
  forwarded to a component on the server for processing (a 'handler' in IIS terminology) or will
  establish that the request represents a static file which should simply have its contents returned.
&lt;/p&gt;
&lt;p&gt;
  IIS stores details of handlers, and the requests which are forwarded to each handler, in its
  metabase. Handlers can be defined in terms of a script map (potentially in combination with a
  managed handler) or a module mapping. For example:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Requests matching the pattern *.asp are forwarded, via a script map, to the ISAPI module %windir%\system32\inetsrv\asp.dll.&lt;/li&gt;
  &lt;li&gt;Requests matching the pattern *.aspx are forwarded, via a script map, to the ISAPI module %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll and to the managed handler System.Web.UI.PageHandlerFactory.&lt;/li&gt;
  &lt;li&gt;Requests matching the pattern *.shtml are forwarded, via a module mapping, to the pre-registered ServerSideIncludeModule module.&lt;/li&gt;    
&lt;/ul&gt;&lt;a name='more'&gt;&lt;/a&gt;
&lt;p&gt;
  You can view the current script maps via IIS Manager or by issuing the following statement at the
  command line whilst in your C:\Inetpub\AdminScripts folder:
&lt;/p&gt;
&lt;pre class="console"&gt;
cscript adsutil.vbs get W3SVC/ScriptMaps
&lt;/pre&gt;
&lt;p&gt;
  There is no static map, managed handler, or module mapping for an *.application request. Such requests
  are picked up by the StaticFileModule module which matches * requests (i.e. requests not processed elsewhere).
&lt;/p&gt;
&lt;p&gt;
  Once IIS has established that the request represents a static file which will simply have its
  contents returned, it looks up the MIME type which it should place in the Content-Type header
  of the HTTP response. This, and not the &lt;em&gt;name&lt;/em&gt; of the file requested, is to be used by
  the browser to establish what type of data is present within the body of the HTTP response.
&lt;/p&gt;
&lt;p&gt;
  IIS stores a map from file extension to MIME type within its metabase. To see the default MIME
  map for your IIS instance use IIS Manager or issue the following statement at the command line whilst
  in your C:\Inetpub\AdminScripts folder:
&lt;/p&gt;
&lt;pre class="console"&gt;
cscript adsutil.vbs enum /MIMEMAP
&lt;/pre&gt;
&lt;p&gt;
  The MIME map reports than the .application extension maps to a MIME type of application/x-ms-application.
  This value is therefore placed in the Content-Type HTTP response header. The HTTP response body simply
  contains the unprocessed contents of the .application file itself.
&lt;/p&gt;
&lt;p&gt;
  Upon receiving the HTTP response, Internet Explorer looks up the file extension which should be
  assumed, given the MIME type specified in the header HTTP response. If this seems a little odd
  to you, you are not alone. I believe it stems from the fact that within Windows it is file
  extensions, not MIME types, which are associated with applications. As the HTTP standard defines
  that the MIME type should be used to determine the type of data, Windows has no real choice but
  to map the MIME type onto a file extension, to then map from a file extension to an application.
&lt;/p&gt;
&lt;p&gt;  
  Internet Explorer looks up application/x-ms-application first in the user-specific MIME
  database at HKCU\Software\Classes\MIME\Database\Content Type and, if it fails to
  find an entry there, the machine-specific MIME database at HKCR\MIME\Database\Content Type.
  It reads the Extension sub-key and establishes that the MIME type application/x-ms-application
  maps to the .application extension. Internet Explorer then saves the file into its Temporary Internet Files
  folder (typically located at %USERPROFILE%\AppData\Local\Microsoft\Windows\Temporary Internet Files,
  %USERPROFILE%\Local Settings\Temporary Internet Files or %SYSTEMROOT%\Temp\Temporary Internet Files).
  Of course, you won't be able to &lt;em&gt;see&lt;/em&gt; the file in Windows Explorer as Internet Explorer does its
  usual cloak-and-dagger trick of preventing you access to files on your own PC. When I tested this, the
  received file was placed within a hidden system folder called KEH38PJB which was within a hidden system
  folder called Content.IE5 (I tested on Internet Explorer 8.0) beneath Temporary Internet Files. The file
  name will be derived from the requested URL, albeit with the name modified to ensure uniqueness and to
  apply the .application file extension. For example, suppose you create an ASPX page called
  Default.aspx and have it return an HTTP response with the MIME type "application/x-ms-application"
  (as I have done) you'll end up with a file beneath Temporary Internet Files called Default[1].application.
  This again re-enforces the fact that it's the MIME type which drives this process, not the file name
  extension as stored on the server.
&lt;/p&gt;

&lt;h2&gt;Opening the Deployment Manifest&lt;/h2&gt;
&lt;p&gt;
  Once the deployment manifest has been stored in the Temporary Internet Files folder, Internet
  Explorer then attempts to establish how it should handle the file with the (assumed and actual)
  .application extension. It checks the user-specific file types at HKCU\Software\Classes and,
  if it fails to find an .application sub-key there, checks for machine-specific file types at
  HKCR. Via this means it establishes that the .application extension denotes an Application.Manifest
  file. It then uses this information to check the user-specific HKCU\Software\Classes\Application.Manifest
  and machine-specific HKCR\Application.Manifest keys to establish the CLSID of a library which handles
  Application.Manifest files and yields the result {98af66e4-aa41-4226-b80f-0b1a8f34eeb4}. Finally, it
  looks up this CLSID in the user-specific HKCU\Software\Classes\CLSID\{98af66e4-aa41-4226-b80f-0b1a8f34eeb4}
  and machine-specific HKCR\CLSID\{98af66e4-aa41-4226-b80f-0b1a8f34eeb4} paths to establish that
  .application files are handled by C:\WINDOWS\system32\&lt;strong&gt;DFshim.dll&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
  This is where things start to get a little complicated. I said earlier that no 'magic' was happening
  behind the scenes. Well, whilst that was true for the process of retrieving the deployment manifest
  it most certainly is not true of the process of actually launching the ClickOnce application once
  the deployment manifest has been retrieved and the handler, DFshim.dll, has been identified.
&lt;/p&gt;
&lt;p&gt;
  DFshim.dll is described in the registry as the 'Manifest mime handler' although its file properties
  describe it as the 'Application Deployment Support Library'. It implements the Internet Explorer MIME
  handler COM interface. It is a native 32-bit DLL, written in Microsoft Visual C++ 2005, and was installed
  into C:\Windows\system32 when the .NET Framework 2.0 was installed.
&lt;/p&gt;
&lt;p&gt;
  DFshim.dll has a hard-coded reference to &lt;strong&gt;DFdll.dll&lt;/strong&gt;, which it locates by checking
  the values of HKLM\SOFTWARE\Microsoft\.NETFramework\InstallRoot (typically C:\Windows\Microsoft.NET\Framework\)
  and the keys beneath HKLM\SOFTWARE\Microsoft\.NETFramework\Policy\AppPatch (typically v2.0.50727,
  even if a later version of the Framework is installed). DFdll.dll too is a native 32-bit DLL written
  in Microsoft Visual C++ 2005.
&lt;/p&gt;
&lt;p&gt;
  DFdll.dll uses COM services exposed by &lt;strong&gt;DFsvc.exe&lt;/strong&gt;, which is also located in the
  .NET Framework folder. DFsvc.exe is a standard .NET MSIL assembly. DFsvc contains a single
  Main method (within the System.Deployment.Application namespace) which simply calls the internal
  System.Deployment.Application.DFServiceEntryPoint.Initialize method within System.Deployment.dll. The
  Initialize method registers System.Deployment.Application.DeploymentServiceCom with COM via
  System.Runtime.InteropServices.RegistrationServices (i.e. it performs the equivalent of
  CoRegisterClassObject in COM) using the CLSID {33246f92-d56f-4e34-837a-9a49bfc91df3}. This is the
  means by which its services are made available to DFdll.dll.
&lt;/p&gt;
&lt;p&gt;
  The COM service exposed by System.Deployment.Application.DeploymentServiceCom delegates the
  majority of its methods to other non-ComVisible classes within the System.Deployment.Application
  namespace. For example, the public ActivateDeployment method calls ActivateDeployment on a new 
  System.Deployment.Application.ApplicationActivator instance, the public CheckForDeploymentUpdate
  method calls CheckForDeploymentUpdate on System.Deployment.Application.SubscriptionStore, etc.
&lt;/p&gt;
&lt;p&gt;
  It is clear that the vast majority of the work surrounding the actual installation and launch of the
  ClickOnce application is undertaken by classes within the System.Deployment namespace, hosted within
  DFsvc.exe. DFshim.dll and DFdll.dll appear to primarily be responsible for arbitrating between the
  COM-based world of Internet Explorer and the .NET-based world of ClickOnce.
&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;
  Despite appearances, the Web server has very little involvement in the process of launching a
  ClickOnce application: it simply serves-up the contents of the deployment manifest along with
  the appropriate MIME type. The real fun happens on the client.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-8066958337813248542?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/BTqviJ0Lwas" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/8066958337813248542/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2010/03/launching-clickonce-application.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/8066958337813248542?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/8066958337813248542?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/BTqviJ0Lwas/launching-clickonce-application.html" title="Launching a ClickOnce Application" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2010/03/launching-clickonce-application.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAERXgyeSp7ImA9WxBUFUw.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-8706601524414797311</id><published>2010-03-02T07:55:00.001Z</published><updated>2010-03-02T07:58:24.691Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-02T07:58:24.691Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows Communication Foundation" /><title>Serialising Enumerations with WCF</title><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
  There are occasions when the exceptions thrown by Windows Communication Foundation (WCF) are clear
  and unambiguous. There are also occassions where they are not. In this post I'll describe a real-world
  problem which a colleague encountered recently together which the steps which you might reasonably
  perform to diagnose it.
&lt;/p&gt;
&lt;p&gt;
  The problem manifested itself in a System.ServiceModel.CommunicationException being thrown with
  nothing particularly useful in the Exception message itself. 
&lt;/p&gt;
&lt;pre class="console"&gt;
System.ServiceModel.CommunicationException: An error occurred while receiving th
e HTTP response to http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary
/Service1/. This could be due to the service endpoint binding not using the HTTP
 protocol. This could also be due to an HTTP request context being aborted by th
e server (possibly due to the service shutting down). See server logs for more d
etails. ---&gt; System.Net.WebException: The underlying connection was closed: An u
nexpected error occurred on a receive. ---&gt; System.IO.IOException: Unable to rea
d data from the transport connection: An existing connection was forcibly closed
 by the remote host. ---&gt; System.Net.Sockets.SocketException: An existing connec
tion was forcibly closed by the remote host
&lt;/pre&gt;
&lt;p&gt;
  Clearly something very bad happened. But the WCF service itself was still up
  and running, so one of the theories put forward in the message above &lt;cite&gt;"possibly due to the service
  shutting down"&lt;/cite&gt; can be quickly dismissed. I'm sure it's obvious, but the above message was
  generated by my mock-up of the problem rather than the original problem itself.
&lt;/p&gt;
&lt;h2&gt;Mock-up of Original Problem&lt;/h2&gt;
&lt;p&gt;
  Let me quickly run through the mock-up of the problem which I put together. It consists of three
  projects: &lt;strong&gt;WcfServiceLibrary&lt;/strong&gt; contains a single WCF service called Service1,
  &lt;strong&gt;WcfConsoleHost&lt;/strong&gt; provides a host for Service1 in the form of a Console Application,
  and &lt;strong&gt;WcfClient&lt;/strong&gt; consumes Service1.
&lt;/p&gt;
&lt;img style="border-style: none" width="348" height="577" alt="Solution Explorer view of SerialisingEnumerationsWithWCF.sln" src="http://lh6.ggpht.com/_fkuTkJfqL8Q/S4r1vQfGDJI/AAAAAAAAAD4/cXGVTWmwUs8/s800/SerialisingEnumerationsWithWCF_SolutionExplorer.jpg" /&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;p&gt;
  WcfServiceLibrary consists of a Service1 class which implements an IService1 interface. Here's the interface:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System.Runtime.Serialization;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System.ServiceModel;

&lt;span style='color:blue'&gt;namespace&lt;/span&gt; WcfServiceLibrary
{
    &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;enum&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;Gender&lt;/span&gt;
    {
        Male = 1,
        Female = 2
    }

    [&lt;span style='color:#2B91AF'&gt;DataContract&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;MyCompositeType&lt;/span&gt;
    {
        [&lt;span style='color:#2B91AF'&gt;DataMember&lt;/span&gt;]
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;bool&lt;/span&gt; MyBool
        {
            &lt;span style='color:blue'&gt;get&lt;/span&gt;;
            &lt;span style='color:blue'&gt;set&lt;/span&gt;;
        }

        [&lt;span style='color:#2B91AF'&gt;DataMember&lt;/span&gt;]
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;string&lt;/span&gt; MyString
        {
            &lt;span style='color:blue'&gt;get&lt;/span&gt;;
            &lt;span style='color:blue'&gt;set&lt;/span&gt;;
        }

        [&lt;span style='color:#2B91AF'&gt;DataMember&lt;/span&gt;]
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;Gender&lt;/span&gt; MyEnum
        {
            &lt;span style='color:blue'&gt;get&lt;/span&gt;;
            &lt;span style='color:blue'&gt;set&lt;/span&gt;;
        }
    }

    [&lt;span style='color:#2B91AF'&gt;ServiceContract&lt;/span&gt;]
    &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;interface&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;IService1&lt;/span&gt;
    {
        [&lt;span style='color:#2B91AF'&gt;OperationContract&lt;/span&gt;]
        &lt;span style='color:#2B91AF'&gt;MyCompositeType&lt;/span&gt; GetMyCompositeType(&lt;span style='color:blue'&gt;bool&lt;/span&gt; initialised);
    }
}
&lt;/pre&gt;
&lt;p&gt;
  And the class:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System;

&lt;span style='color:blue'&gt;namespace&lt;/span&gt; WcfServiceLibrary
{
    &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;Service1&lt;/span&gt; : &lt;span style='color:#2B91AF'&gt;IService1&lt;/span&gt;
    {
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;MyCompositeType&lt;/span&gt; GetMyCompositeType(&lt;span style='color:blue'&gt;bool&lt;/span&gt; initialised)
        {
            &lt;span style='color:#2B91AF'&gt;MyCompositeType&lt;/span&gt; myCompositeObject = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;MyCompositeType&lt;/span&gt;();

            &lt;span style='color:blue'&gt;if&lt;/span&gt; (initialised)
            {
                myCompositeObject.MyBool = &lt;span style='color:blue'&gt;true&lt;/span&gt;;
                myCompositeObject.MyString = &lt;span style='color:#A31515'&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;;
                myCompositeObject.MyEnum = &lt;span style='color:#2B91AF'&gt;Gender&lt;/span&gt;.Male;
            }

            &lt;span style='color:blue'&gt;return&lt;/span&gt; myCompositeObject;
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;
  WcfConsoleHost just contains a Program class which hosts Service1:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System.ServiceModel;

&lt;span style='color:blue'&gt;namespace&lt;/span&gt; WcfConsoleHost
{
    &lt;span style='color:blue'&gt;class&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;Program&lt;/span&gt;
    {
        &lt;span style='color:blue'&gt;static&lt;/span&gt; &lt;span style='color:blue'&gt;void&lt;/span&gt; Main(&lt;span style='color:blue'&gt;string&lt;/span&gt;[]args)
        {
            &lt;span style='color:blue'&gt;try&lt;/span&gt;
            {
                &lt;span style='color:#2B91AF'&gt;ServiceHost&lt;/span&gt; serviceHost = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;ServiceHost&lt;/span&gt;(&lt;span style='color:blue'&gt;typeof&lt;/span&gt;(WcfServiceLibrary.&lt;span style='color:#2B91AF'&gt;Service1&lt;/span&gt;));
                serviceHost.Open();

                &lt;span style='color:blue'&gt;foreach&lt;/span&gt; (System.ServiceModel.Description.&lt;span style='color:#2B91AF'&gt;ServiceEndpoint&lt;/span&gt; serviceEndPoint &lt;span style='color:blue'&gt;in&lt;/span&gt; serviceHost.Description.Endpoints)
                {
                    &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(&lt;span style='color:#A31515'&gt;&amp;quot;Listening at {0}...&amp;quot;&lt;/span&gt;, serviceEndPoint.Address.ToString());
                }
            }
            &lt;span style='color:blue'&gt;catch&lt;/span&gt; (System.&lt;span style='color:#2B91AF'&gt;Exception&lt;/span&gt; ex)
            {
                System.&lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(ex.ToString());
            }

            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.ReadLine();
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;
  Finally, we have WcfClient which again just consist of a Program class. Upon execution, WcfClient
  simply retrieves an initialised instance of MyCompositeType via WCF and writes its details to the
  console.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System;

&lt;span style='color:blue'&gt;namespace&lt;/span&gt; WcfClient
{
    &lt;span style='color:blue'&gt;class&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;Program&lt;/span&gt;
    {
        &lt;span style='color:blue'&gt;static&lt;/span&gt; &lt;span style='color:blue'&gt;void&lt;/span&gt; Main(&lt;span style='color:blue'&gt;string&lt;/span&gt;[]args)
        {
            &lt;span style='color:blue'&gt;try&lt;/span&gt;
            {
                DisplayMyCompositeObject(&lt;span style='color:blue'&gt;true&lt;/span&gt;);
            }
            &lt;span style='color:blue'&gt;catch&lt;/span&gt; (System.&lt;span style='color:#2B91AF'&gt;Exception&lt;/span&gt; ex)
            {
                &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(ex);
            }

            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.ReadLine();
        }

        &lt;span style='color:blue'&gt;static&lt;/span&gt; &lt;span style='color:blue'&gt;void&lt;/span&gt; DisplayMyCompositeObject(&lt;span style='color:blue'&gt;bool&lt;/span&gt; initialised)
        {
            Service1Reference.&lt;span style='color:#2B91AF'&gt;MyCompositeType&lt;/span&gt; myCompositeObject = GetMyCompositeType(initialised);

            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(&lt;span style='color:#A31515'&gt;&amp;quot;MyBool={0}&amp;quot;&lt;/span&gt;, myCompositeObject.MyBool);
            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(&lt;span style='color:#A31515'&gt;&amp;quot;MyString={0}&amp;quot;&lt;/span&gt;, myCompositeObject.MyString);
            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(&lt;span style='color:#A31515'&gt;&amp;quot;MyString={0}&amp;quot;&lt;/span&gt;, myCompositeObject.MyEnum);
            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine();
        }

        &lt;span style='color:blue'&gt;static&lt;/span&gt; Service1Reference.&lt;span style='color:#2B91AF'&gt;MyCompositeType&lt;/span&gt; GetMyCompositeType(&lt;span style='color:blue'&gt;bool&lt;/span&gt; initialised)
        {
            Service1Reference.&lt;span style='color:#2B91AF'&gt;Service1Client&lt;/span&gt; service1Client = &lt;span style='color:blue'&gt;null&lt;/span&gt;;
            Service1Reference.&lt;span style='color:#2B91AF'&gt;MyCompositeType&lt;/span&gt; myCompositeObject = &lt;span style='color:blue'&gt;null&lt;/span&gt;;

            &lt;span style='color:blue'&gt;try&lt;/span&gt;
            {
                service1Client = &lt;span style='color:blue'&gt;new&lt;/span&gt; Service1Reference.&lt;span style='color:#2B91AF'&gt;Service1Client&lt;/span&gt;();
                myCompositeObject = service1Client.GetMyCompositeType(initialised);
                service1Client.Close();
            }
            &lt;span style='color:blue'&gt;catch&lt;/span&gt;
            {
                &lt;span style='color:blue'&gt;if&lt;/span&gt;(service1Client != &lt;span style='color:blue'&gt;null&lt;/span&gt;)
                {
                    service1Client.Abort();
                }
                &lt;span style='color:blue'&gt;throw&lt;/span&gt;;
            }

            &lt;span style='color:blue'&gt;return&lt;/span&gt; myCompositeObject;
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;
  For the sake of completeness, I'll also show you the configuration files I'm using. First, the
  server-side configuration file in WcfConsoleHost:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;&amp;lt;?&lt;/span&gt;&lt;span style='color:#A31515'&gt;xml&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;version&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;encoding&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; ?&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;configuration&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;system.web&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;compilation&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;debug&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;true&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; /&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;system.web&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;system.serviceModel&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;services&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;service&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;WcfServiceLibrary.Service1&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;behaviorConfiguration&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;WcfServiceLibrary.Service1Behavior&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;host&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;          &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;baseAddresses&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;            &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;add&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;baseAddress&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary/Service1/&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;/&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;          &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;baseAddresses&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;host&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;endpoint&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;address&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;binding&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;basicHttpBinding&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;contract&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;WcfServiceLibrary.IService1&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;          &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;identity&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;            &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;dns&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;value&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;localhost&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;/&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;          &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;identity&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;endpoint&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;endpoint&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;address&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;mex&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;binding&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;mexHttpBinding&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;contract&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;IMetadataExchange&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;/&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;service&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;services&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;behaviors&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;serviceBehaviors&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;behavior&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;WcfServiceLibrary.Service1Behavior&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;          &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;serviceMetadata&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;httpGetEnabled&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;true&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;/&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;          &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;serviceDebug&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;includeExceptionDetailInFaults&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;true&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; /&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;behavior&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;serviceBehaviors&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;behaviors&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;system.serviceModel&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;configuration&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  And the client-side configuration file in WcfClient:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;&amp;lt;?&lt;/span&gt;&lt;span style='color:#A31515'&gt;xml&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;version&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;encoding&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; ?&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;configuration&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;system.serviceModel&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;bindings&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;basicHttpBinding&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;binding&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;BasicHttpBinding_IService1&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;closeTimeout&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;00:01:00&lt;/span&gt;&amp;quot;
&lt;span style='color:blue'&gt;          &lt;/span&gt;&lt;span style='color:red'&gt;openTimeout&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;00:01:00&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;receiveTimeout&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;00:10:00&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;sendTimeout&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;00:01:00&lt;/span&gt;&amp;quot;
&lt;span style='color:blue'&gt;          &lt;/span&gt;&lt;span style='color:red'&gt;allowCookies&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;false&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;bypassProxyOnLocal&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;false&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;hostNameComparisonMode&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;StrongWildcard&lt;/span&gt;&amp;quot;
&lt;span style='color:blue'&gt;          &lt;/span&gt;&lt;span style='color:red'&gt;maxBufferSize&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;65536&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;maxBufferPoolSize&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;524288&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;maxReceivedMessageSize&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;65536&lt;/span&gt;&amp;quot;
&lt;span style='color:blue'&gt;          &lt;/span&gt;&lt;span style='color:red'&gt;messageEncoding&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;Text&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;textEncoding&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;transferMode&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;Buffered&lt;/span&gt;&amp;quot;
&lt;span style='color:blue'&gt;          &lt;/span&gt;&lt;span style='color:red'&gt;useDefaultWebProxy&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;true&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;          &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;readerQuotas&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;maxDepth&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;32&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;maxStringContentLength&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;8192&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;maxArrayLength&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;16384&lt;/span&gt;&amp;quot;
&lt;span style='color:blue'&gt;            &lt;/span&gt;&lt;span style='color:red'&gt;maxBytesPerRead&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;4096&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;maxNameTableCharCount&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;16384&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; /&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;          &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;security&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;mode&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;None&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;            &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;transport&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;clientCredentialType&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;None&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;proxyCredentialType&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;None&lt;/span&gt;&amp;quot; &lt;span style='color:red'&gt;realm&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&lt;span style='color:blue'&gt; /&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;            &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;message&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;clientCredentialType&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;UserName&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;algorithmSuite&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;Default&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; /&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;          &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;security&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;binding&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;basicHttpBinding&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;bindings&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;client&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;endpoint&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;address&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary/Service1/&lt;/span&gt;&amp;quot;
&lt;span style='color:blue'&gt;        &lt;/span&gt;&lt;span style='color:red'&gt;binding&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;basicHttpBinding&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;bindingConfiguration&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;BasicHttpBinding_IService1&lt;/span&gt;&amp;quot;
&lt;span style='color:blue'&gt;        &lt;/span&gt;&lt;span style='color:red'&gt;contract&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;Service1Reference.IService1&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;BasicHttpBinding_IService1&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; /&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;client&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;system.serviceModel&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;configuration&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;h2&gt;Testing the Application&lt;/h2&gt;
&lt;p&gt;
  With all this in place we can start the WcfConsoleHost:
&lt;/p&gt;
&lt;pre class="console"&gt;
Listening at http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary/Servi
ce1/...
Listening at http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary/Servi
ce1/mex...
&lt;/pre&gt;  
&lt;p&gt;
  Firing up WcfClient the gives us a nice simple:
&lt;/p&gt;
&lt;pre class="console"&gt;
MyBool=True
MyString=Hello World
MyString=Male
&lt;/pre&gt;
&lt;p&gt;
  So what's the problem? Well the problem is that if we pass &lt;strong&gt;false&lt;/strong&gt; to
  WcfClient.Program.DisplayMyCompositeObject (and hence to WcfClient.Program.GetMyCompositeType and hence
  to WcfServiceLibrary.Service1.GetMyCompositeType), to ask that an &lt;em&gt;uninitialised&lt;/em&gt; instance of
  MyCompositeObject be returned, we get the following output:
&lt;/p&gt;
&lt;pre class="console"&gt;
System.ServiceModel.CommunicationException: An error occurred while receiving th
e HTTP response to http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary
/Service1/. This could be due to the service endpoint binding not using the HTTP
 protocol. This could also be due to an HTTP request context being aborted by th
e server (possibly due to the service shutting down). See server logs for more d
etails. ---&gt; System.Net.WebException: The underlying connection was closed: An u
nexpected error occurred on a receive. ---&gt; System.IO.IOException: Unable to rea
d data from the transport connection: An existing connection was forcibly closed
 by the remote host. ---&gt; &lt;span style="color:Red"&gt;.Net.Sockets.SocketException: An existing connec
tion was forcibly closed by the remote host&lt;/span&gt;
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size,
 SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 s
ize)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 s
ize)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetriev
edStream, Boolean probeRead)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.GetResponse()
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpCha
nnelRequest.WaitForReply(TimeSpan timeout)
   --- End of inner exception stack trace ---

Server stack trace:
   at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebExc
eption(WebException webException, HttpWebRequest request, HttpAbortReason abortR
eason)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpCha
nnelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeS
pan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message messag
e, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean on
eway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan tim
eout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean on
eway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCall
Message methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage req
Msg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp; msgDa
ta, Int32 type)
   at WcfClient.Service1Reference.IService1.GetMyCompositeType(Boolean initialis
ed)
   at WcfClient.Service1Reference.Service1Client.GetMyCompositeType(Boolean init
ialised) in C:\Users\Ian.Picknell\Documents\Blog\WCF\Serialising Enumerations wi
th WCF\WcfClient\Service References\Service1Reference\Reference.cs:line 140
   at WcfClient.Program.GetMyCompositeType(Boolean initialised) in C:\Users\Ian.
Picknell\Documents\Blog\WCF\Serialising Enumerations with WCF\WcfClient\Program.
cs:line 48
   at WcfClient.Program.DisplayMyCompositeObject(Boolean initialised) in C:\User
s\Ian.Picknell\Documents\Blog\WCF\Serialising Enumerations with WCF\WcfClient\Pr
ogram.cs:line 23
   at WcfClient.Program.Main(String[] args) in C:\Users\Ian.Picknell\Documents\B
log\WCF\Serialising Enumerations with WCF\WcfClient\Program.cs:line 11
&lt;/pre&gt;
&lt;p&gt;
  I've highlighted what I believe to be the first exception thrown. One thing you may
  have noticed in the server-side configuration file earlier in the post was that I'm asking
  for exception details to be included within faults, which is generally a good idea during
  development. The inner-most exception (according to the client) was &lt;code&gt;
  .Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host&lt;/code&gt;.
&lt;/p&gt;
&lt;h2&gt;Diagnosing the Problem&lt;/h2&gt;
&lt;p&gt;
  Lets enable logging on both client and server to obtain more details. We update &lt;strong&gt;both&lt;/strong&gt;
  configuration files to add the following within the &lt;code&gt;&amp;lt;system.serviceModel&amp;gt;&lt;/code&gt; element:
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;diagnostics&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;messageLogging&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;logEntireMessage&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;true&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;logMalformedMessages&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;true&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;logMessagesAtServiceLevel&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;true&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;logMessagesAtTransportLevel&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;true&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; /&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;diagnostics&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  We then direct the messages to an appropriate listener by adding a &lt;code&gt;&amp;lt;system.diagnostics&amp;gt;&lt;/code&gt;
  element directly within the &lt;code&gt;&amp;lt;configuration&amp;gt;&lt;/code&gt; element.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;system.diagnostics&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;sources&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;source&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;System.ServiceModel&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;switchValue&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;Information, ActivityTracing&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;propagateActivity&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;true&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;listeners&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;add&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;xml&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;/&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;listeners&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;source&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;source&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;System.ServiceModel.MessageLogging&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;listeners&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;add&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;xml&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;/&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;listeners&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;source&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;sources&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;sharedListeners&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;add&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;initializeData&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;WcfClient.svclog&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;type&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;System.Diagnostics.XmlWriterTraceListener&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;xml&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;/&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;sharedListeners&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;system.diagnostics&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  The only difference between the new entries in the client-side and server-side configuration files
  is the name of the file to which diagnostic messages will be written: WcfClient.svclog and
  WcfConsoleHost.svclog respectively.
&lt;/p&gt;
&lt;p&gt;
  Now we can both re-start WcfConsoleHost and WcfClient and re-produce the error. Having done this we need
  to check the logs for any additional information. So we fire-up &lt;strong&gt;Microsoft Service Trace Viewer&lt;/strong&gt;,
  within the &lt;strong&gt;Microsoft Windows SDK&lt;/strong&gt; and open the client-side log file, WcfClient.svclog.
&lt;/p&gt;
&lt;p&gt;
  In the Activity tab on the far left we immediately notice that one of the activities is highlighted in red.
  This is a 'Process action' activity for 'http://tempuri.org/IService1/GetMyCompositeType'. Clicking on the
  activity populates the panel in the top-right, which has a 'Throwing an exception' message highlighted in red.
  Clicking this text populates the panel in the bottom-right with details of the exception. Studying the exception
  doesn't really provide any additional information - it simply re-iterates that &lt;code&gt;An existing connection was
  forcibly closed by the remote host&lt;/code&gt;. Checking the messages and activities immediately prior to the
  failure provides no additional insight.
&lt;/p&gt;
&lt;p&gt;
  Let's check the server-side log file. After all, if the client is saying that the server terminated the
  connection then hopefully the server is aware that it did this and knows why. So we open WcfConsoleHost.svclog
  with Microsoft Service Trace Viewer.
&lt;/p&gt;
&lt;p&gt;
  We again notice in the Activity tab on the far left that one of the activities is highlighted in red. This is
  a 'Process action' activity for 'http://tempuri.org/IService1/GetMyCompositeType'. Clicking on the activity
  populates the panel in the top-right, which has a 'Throwing an exception' message highlighted in red. This all
  sounds worrying familiar so far. Clicking on this text populates the panel in the bottom-right with details
  of the exception. But the exception is different to that experience by the client. The exception message is:
&lt;/p&gt;
&lt;pre&gt;
There was an error while trying to serialize parameter http://tempuri.org/:GetMyCompositeTypeResult. The InnerException message was &lt;span style="color:Red"&gt;'Enum value '0' is invalid for type 'WcfServiceLibrary.Gender'&lt;/span&gt; and cannot be serialized. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.'.  Please see InnerException for more details.
&lt;/pre&gt;
&lt;p&gt;
  Of course. Silly me. The Gender enumeration has values 1 and 2 (for Male and Female respectively) but as
  it's uninitialised it'll have the value 0 which simply isn't valid. It's a shame that WCF doesn't propagate
  the above exception to the client, especially as I've set includeExceptionDetailInFaults to true in my
  server-side configuration file. But at least the message is plain and simple once we switch on server-side
  logging.
&lt;/p&gt;
&lt;p&gt;
  Moral of the story? Always ensure that your enumerations support 0, even if you map that to something
  generic like Unknown or Undefined. You'll still have to handle these values at some point, but at least
  WCF won't thrown exceptions when attempting to pass them across the wire.
&lt;/p&gt;
&lt;h2&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2009/12/systemdata-serialisation-bug-scenario-2.html"&gt;System.Data Serialisation Bug - Scenario 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-8706601524414797311?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/9Rhyb2VBrHo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/8706601524414797311/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2010/03/serialising-enumerations-with-wcf.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/8706601524414797311?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/8706601524414797311?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/9Rhyb2VBrHo/serialising-enumerations-with-wcf.html" title="Serialising Enumerations with WCF" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_fkuTkJfqL8Q/S4r1vQfGDJI/AAAAAAAAAD4/cXGVTWmwUs8/s72-c/SerialisingEnumerationsWithWCF_SolutionExplorer.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2010/03/serialising-enumerations-with-wcf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MGQHkzcCp7ImA9WxBVGUw.&quot;"><id>tag:blogger.com,1999:blog-7929053599129622940.post-883200417203160854</id><published>2010-02-23T07:50:00.000Z</published><updated>2010-02-23T07:50:21.788Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T07:50:21.788Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Strong Names" /><title>Faking a Strong Name</title><content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
  Once upon a time a strong name was just that - strong. If you'd referenced an assembly with a
  strong name within your application you could be sure that &lt;em&gt;that's&lt;/em&gt; the assembly you were
  going to get a run-time. Well, even that was never true. An 
  &lt;a href="http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx"&gt;assembly re-direct&lt;/a&gt;
  could cause you to be delivered a different &lt;em&gt;version&lt;/em&gt; but it would always have to have the
  same name and public key token, and hence must have originated from the same source. They key
  thing is that no-one could slip your application a fake assembly and pass it off as the real
  thing.
&lt;/p&gt;
&lt;p&gt;
  Well, it turns out that now they can. You simply place your fake assembly in the GAC
  folder within which the real version of the assembly would logically reside. The name of
  the &lt;em&gt;folder&lt;/em&gt; is used to establish its version and public key token. Don't believe me?
  Read on...
&lt;/p&gt;

&lt;h2&gt;Scenario&lt;/h2&gt;
&lt;p&gt;
  The scenario is based upon a situation I encountered a few years ago. &lt;strong&gt;ThirdPartySecurity&lt;/strong&gt;
  contains a class called DirectoryServices which is essentially a wrapper around
  System.DirectoryServices - it allows the caller to easily performs some look-ups against Active
  Directory ('who are the members of this group', that kind of thing). &lt;strong&gt;ConsoleApplication&lt;/strong&gt; has
  a reference to ThirdPartySecurity and simply acts as a test harness. &lt;strong&gt;MockDirectoryServices&lt;/strong&gt; is
  exactly that - a mocked-up implementation of System.DirectoryServices. It is not referenced by
  anything.
&lt;/p&gt;
&lt;img style="border-style: none" width="282" height="469" alt="Solution Explorer view of FakingAStrongName.sln" src="http://lh3.ggpht.com/_fkuTkJfqL8Q/S3Xp6xFikdI/AAAAAAAAADQ/4oFwczzYUd8/s800/FakingAStrongName_SolutionExplorer.jpg"" /&gt;
&lt;p&gt;&lt;a name='more'&gt;&lt;/a&gt;
  He's the source code for the third-party DirectoryServices in its entirety. This is the actual
  source code of the assembly which was performing this job on a project I worked on. The code is
  &lt;em&gt;not&lt;/em&gt; mine. I did &lt;em&gt;not&lt;/em&gt; write it. I've left the completely alone (despite the urge to
  perform some major re-factoring), with the exception that I changed the namespace to protect the
  innocent and have changed the catch block in GetUsersInGroup such that it re-throws an exception
  rather than logging and swallowing it.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System.DirectoryServices;

&lt;span style='color:blue'&gt;namespace&lt;/span&gt; ThirdPartySecurity
{
    &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; Summary description for ActiveDirectory.&lt;/span&gt;
    &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&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;DirectoryServices&lt;/span&gt;
    {
        &lt;span style='color:blue'&gt;public&lt;/span&gt; DirectoryServices()
        {
        }

&lt;span style='color:blue'&gt;        #region&lt;/span&gt; public methods

        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; Takes an Active Directory group name and returns an array of user names that&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; belong to that single group.&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;groupName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt;If there are no groups return a null array.  If there are no users in the group, return an empty array.&lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;string&lt;/span&gt;[] GetUsersInGroup (&lt;span style='color:blue'&gt;string&lt;/span&gt; groupName)
        {
            &lt;span style='color:green'&gt;//If no Users in the group, return an empty array.&lt;/span&gt;
            &lt;span style='color:blue'&gt;string&lt;/span&gt; [] result = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:blue'&gt;string&lt;/span&gt;[0];

            &lt;span style='color:blue'&gt;try&lt;/span&gt;
            {
                &lt;span style='color:#2B91AF'&gt;DirectorySearcher&lt;/span&gt; ds = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;DirectorySearcher&lt;/span&gt;();
                ds.SearchRoot = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;DirectoryEntry&lt;/span&gt;();   &lt;span style='color:green'&gt;// start searching from local domain&lt;/span&gt;

                &lt;span style='color:blue'&gt;if&lt;/span&gt; (groupName.IndexOf(&lt;span style='color:#A31515'&gt;&amp;quot;\\&amp;quot;&lt;/span&gt;) &amp;gt; 0)
                    groupName = groupName.Substring(groupName.IndexOf(&lt;span style='color:#A31515'&gt;&amp;quot;\\&amp;quot;&lt;/span&gt;)+1); &lt;span style='color:green'&gt;//Take out the Domain &lt;/span&gt;

                ds.Filter = BuildLDAPFilter(&lt;span style='color:#A31515'&gt;&amp;quot;group&amp;quot;&lt;/span&gt;,groupName);

                &lt;span style='color:#2B91AF'&gt;SearchResultCollection&lt;/span&gt; src = ds.FindAll();
                &lt;span style='color:#2B91AF'&gt;DirectoryEntry&lt;/span&gt; objGroupEntry;

                &lt;span style='color:blue'&gt;int&lt;/span&gt; i = 0;
                &lt;span style='color:blue'&gt;if&lt;/span&gt; (src.Count == 1) &lt;span style='color:green'&gt;//Must match to a single group&lt;/span&gt;
                {
                    &lt;span style='color:blue'&gt;foreach&lt;/span&gt;(&lt;span style='color:#2B91AF'&gt;SearchResult&lt;/span&gt; objResult &lt;span style='color:blue'&gt;in&lt;/span&gt; src) &lt;span style='color:green'&gt;//for the 1st and only group&lt;/span&gt;
                    {
                        objGroupEntry = objResult.GetDirectoryEntry();
                        &lt;span style='color:blue'&gt;string&lt;/span&gt;[] members = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:blue'&gt;string&lt;/span&gt;[objGroupEntry.Properties[&lt;span style='color:#A31515'&gt;&amp;quot;member&amp;quot;&lt;/span&gt;].Count];
                        &lt;span style='color:blue'&gt;foreach&lt;/span&gt;(&lt;span style='color:blue'&gt;object&lt;/span&gt; objMember &lt;span style='color:blue'&gt;in&lt;/span&gt; objGroupEntry.Properties[&lt;span style='color:#A31515'&gt;&amp;quot;member&amp;quot;&lt;/span&gt;])
                        {
                            &lt;span style='color:blue'&gt;string&lt;/span&gt; memberDetails = objMember.ToString();
                            &lt;span style='color:green'&gt;//strip out CN= from start of string and get name up to first comma delimiter&lt;/span&gt;
                            members[i] = (memberDetails.Substring(3,memberDetails.IndexOf(&lt;span style='color:#A31515'&gt;&amp;quot;,&amp;quot;&lt;/span&gt;)-3));
                            i++;
                        }
                        result = members;
                    }
                }
                &lt;span style='color:blue'&gt;else&lt;/span&gt; &lt;span style='color:green'&gt;//If no groups return a Null Array&lt;/span&gt;
                {
                    result = &lt;span style='color:blue'&gt;null&lt;/span&gt;;
                }

                src.Dispose();
                ds.Dispose();
            }
            &lt;span style='color:blue'&gt;catch&lt;/span&gt; (System.&lt;span style='color:#2B91AF'&gt;Exception&lt;/span&gt; ex)
            {
                &lt;span style='color:green'&gt;// NOTE:the original version of this catch block logged the exception via the&lt;/span&gt;
                &lt;span style='color:green'&gt;//      Enterprise Library and then swallowed it; we'll simply re-throw it&lt;/span&gt;
                &lt;span style='color:green'&gt;//Framework.EnterpriseLibrary.Log(String.Format(&amp;quot;GetUsersInGroup(\&amp;quot;{0}\&amp;quot;)failed (Active Directory is probably unavailable); the following exception hasbeen silently ignored.\n\n{1}&amp;quot;, groupName, ex),Framework.Severity.Warning);&lt;/span&gt;
                &lt;span style='color:blue'&gt;throw&lt;/span&gt;;
            }

            &lt;span style='color:blue'&gt;return&lt;/span&gt; result;
        }


        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; Takes a user name in an Active Directory store and returns the display name for that user.&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;userName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;string&lt;/span&gt; GetDisplayName (&lt;span style='color:blue'&gt;string&lt;/span&gt; userName)
        {
            &lt;span style='color:blue'&gt;return&lt;/span&gt; GetPropertyFromUser(userName, &lt;span style='color:#A31515'&gt;&amp;quot;displayname&amp;quot;&lt;/span&gt;);
        }


        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; /// Takes a user name in an Active Directory store and returns the email address for that user.&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;userName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;string&lt;/span&gt; GetEmailAddress (&lt;span style='color:blue'&gt;string&lt;/span&gt; userName)
        {
            &lt;span style='color:blue'&gt;return&lt;/span&gt; GetPropertyFromUser(userName, &lt;span style='color:#A31515'&gt;&amp;quot;mail&amp;quot;&lt;/span&gt;);
        }

&lt;span style='color:blue'&gt;        #endregion&lt;/span&gt;

&lt;span style='color:blue'&gt;        #region&lt;/span&gt; private methods

        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; Forms a filter string for the search in LDAP Format&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;objectCategory&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;filter&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style='color:blue'&gt;private&lt;/span&gt; &lt;span style='color:blue'&gt;string&lt;/span&gt; BuildLDAPFilter(&lt;span style='color:blue'&gt;string&lt;/span&gt; objectCategory, &lt;span style='color:blue'&gt;string&lt;/span&gt; filter)
        {
            &lt;span style='color:#2B91AF'&gt;String&lt;/span&gt; result;
            result = &lt;span style='color:#2B91AF'&gt;String&lt;/span&gt;.Format(&lt;span style='color:#A31515'&gt;&amp;quot;(&amp;amp;(objectCategory={0})(name={1}))&amp;quot;&lt;/span&gt;, objectCategory, filter);
            &lt;span style='color:blue'&gt;return&lt;/span&gt; result;
        }


        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; /// Takes a user name in an Active Directory store and returns a property specified by the caller for that user.&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;userName&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt;The user to search for the given &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;b&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt;propertyName&lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/b&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;propertyName&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt;The property of the &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;b&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt;userName&lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/b&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt; to be returned.&lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt;If the user is not found returns null, if the property does not exist return empty string&lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;
        &lt;span style='color:blue'&gt;private&lt;/span&gt; &lt;span style='color:blue'&gt;string&lt;/span&gt; GetPropertyFromUser(&lt;span style='color:blue'&gt;string&lt;/span&gt; userName, &lt;span style='color:blue'&gt;string&lt;/span&gt; propertyName)
        {
            &lt;span style='color:blue'&gt;string&lt;/span&gt; result = &lt;span style='color:blue'&gt;null&lt;/span&gt;;

            &lt;span style='color:#2B91AF'&gt;DirectorySearcher&lt;/span&gt; ds = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;DirectorySearcher&lt;/span&gt;();
            ds.SearchRoot = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;DirectoryEntry&lt;/span&gt;();   &lt;span style='color:green'&gt;// start searching from local domain&lt;/span&gt;
            ds.Filter = BuildLDAPFilter(&lt;span style='color:#A31515'&gt;&amp;quot;user&amp;quot;&lt;/span&gt;,userName);
            &lt;span style='color:#2B91AF'&gt;SearchResultCollection&lt;/span&gt; src = ds.FindAll();

            &lt;span style='color:green'&gt;//TODO: Reject the search if more than 1 user returned&lt;/span&gt;
            &lt;span style='color:blue'&gt;if&lt;/span&gt; (src.Count == 1)
            {
                result = &lt;span style='color:blue'&gt;string&lt;/span&gt;.Empty;&lt;span style='color:green'&gt; //If the property does not exist return an empty string&lt;/span&gt;
                &lt;span style='color:blue'&gt;foreach&lt;/span&gt; (&lt;span style='color:#2B91AF'&gt;SearchResult&lt;/span&gt; srcResult &lt;span style='color:blue'&gt;in&lt;/span&gt; src)
                    result = srcResult.Properties[propertyName][0].ToString();
            }

            &lt;span style='color:blue'&gt;return&lt;/span&gt; result;
        }


&lt;span style='color:blue'&gt;        #endregion&lt;/span&gt;
    }
}
&lt;/pre&gt;

&lt;h2&gt;Problem&lt;/h2&gt;
&lt;p&gt;
  The problem I had on this project was that I didn't have access to Active Directory when I
  was developing off-line on my laptop. Of course, the DirectoryServices class above could be
  modified in many ways to work around this: the most obvious way would be to have it implement
  an IDirectoryServices interface which could also be implemented by a new class called
  MockDirectoryServices, with some entry in the configuration file defining which implementation
  would be used at runtime. But that would rely upon having access to the source code, and I'm
  trying to show you a technique which will work even if you only have access to the assembly.
  (Hence why I called this assembly &lt;em&gt;ThirdParty&lt;/em&gt;Security - to help us imagine that the
  source code is unavailable).
&lt;/p&gt;
&lt;p&gt;
  I can demonstrate the problem via the simple ConsoleApplication which makes use of
  ThirdPartySecurity to enumerate the members of a specific group.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;using&lt;/span&gt; System;

&lt;span style='color:blue'&gt;namespace&lt;/span&gt; ConsoleApplication
{
    &lt;span style='color:blue'&gt;class&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;Program&lt;/span&gt;
    {
        &lt;span style='color:blue'&gt;static&lt;/span&gt; &lt;span style='color:blue'&gt;void&lt;/span&gt; Main(&lt;span style='color:blue'&gt;string&lt;/span&gt;[]args)
        {
            &lt;span style='color:blue'&gt;try&lt;/span&gt;
            {
                (&lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;Program&lt;/span&gt;()).Run();
            }
            &lt;span style='color:blue'&gt;catch&lt;/span&gt; (System.&lt;span style='color:#2B91AF'&gt;Exception&lt;/span&gt; ex)
            {
                &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(ex);
            }

            &lt;span style='color:green'&gt;// ask our AppDomain what DirectoryServices-related assemblies are loaded&lt;/span&gt;
            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(&lt;span style='color:#A31515'&gt;&amp;quot;\nDirectoryServices-related assemblies loaded into the current AppDomain are:&amp;quot;&lt;/span&gt;);
            &lt;span style='color:blue'&gt;foreach&lt;/span&gt; (System.Reflection.&lt;span style='color:#2B91AF'&gt;Assembly&lt;/span&gt; assembly &lt;span style='color:blue'&gt;in&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;AppDomain&lt;/span&gt;.CurrentDomain.GetAssemblies())
            {
                &lt;span style='color:blue'&gt;if&lt;/span&gt; (assembly.GetName().Name.Contains(&lt;span style='color:#A31515'&gt;&amp;quot;DirectoryServices&amp;quot;&lt;/span&gt;))
                {
                    &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(&lt;span style='color:#A31515'&gt;&amp;quot;\t{0} (from {1})&amp;quot;&lt;/span&gt;, assembly.FullName,assembly.CodeBase);
                }
            }

            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(&lt;span style='color:#A31515'&gt;&amp;quot;\nPress ENTER to exit&amp;quot;&lt;/span&gt;);
            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.ReadLine();
        }

        &lt;span style='color:blue'&gt;void&lt;/span&gt; Run()
        {
            &lt;span style='color:green'&gt;// create an instance of the third-party DirectoryServices wrapper&lt;/span&gt;
            ThirdPartySecurity.&lt;span style='color:#2B91AF'&gt;DirectoryServices&lt;/span&gt; directoryServices = &lt;span style='color:blue'&gt;new&lt;/span&gt; ThirdPartySecurity.&lt;span style='color:#2B91AF'&gt;DirectoryServices&lt;/span&gt;();

            &lt;span style='color:green'&gt;// define which group we'll be seeking members of&lt;/span&gt;
            &lt;span style='color:blue'&gt;string&lt;/span&gt; groupName = &lt;span style='color:#A31515'&gt;&amp;quot;MYDOMAIN\\MyGroup&amp;quot;&lt;/span&gt;;
            &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(&lt;span style='color:#A31515'&gt;&amp;quot;The members of the group \&amp;quot;{0}\&amp;quot;are:&amp;quot;&lt;/span&gt;, groupName);

            &lt;span style='color:green'&gt;// ask the third-party DirectoryServices wrapper for the members of the specified group&lt;/span&gt;
            &lt;span style='color:blue'&gt;string&lt;/span&gt;[] memberNames = directoryServices.GetUsersInGroup(groupName);

            &lt;span style='color:green'&gt;// output the results&lt;/span&gt;
            &lt;span style='color:blue'&gt;foreach&lt;/span&gt; (&lt;span style='color:blue'&gt;string&lt;/span&gt; memberName &lt;span style='color:blue'&gt;in&lt;/span&gt; memberNames)
            {
                &lt;span style='color:#2B91AF'&gt;Console&lt;/span&gt;.WriteLine(&lt;span style='color:#A31515'&gt;&amp;quot;\t{0}&amp;quot;&lt;/span&gt;, memberName);
            }
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;
  Obviously ConsoleApplication has a reference to ThirdPartySecurity and ThirdPartySecurity
  has a reference to System.DirectoryServices. The reason I included code to display assemblies
  within the AppDomain containing the text 'DirectoryServices' in their name will become clear
  later on.
&lt;/p&gt;
&lt;p&gt;  
  If I run this code on my laptop, which is currently disconnected and has no access to Active
  Directory, I get the following output. I've highlighted key items within the output.
&lt;/p&gt;
&lt;pre class="console"&gt;
The members of the group "MYDOMAIN\MyGroup"are:
System.Runtime.InteropServices.COMException (0x8007054B): &lt;span style="color:Red"&gt;The specified domain e
ither does not exist or could not be contacted.&lt;/span&gt;

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entr
y, String propertyName)
   at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne
)
   at System.DirectoryServices.DirectorySearcher.FindAll()
   at ThirdPartySecurity.DirectoryServices.GetUsersInGroup(String groupName) in
C:\Users\Ian.Picknell\Documents\Blog\Strong Names\Faking a Strong Name\ThirdPart
ySecurity\DirectoryServices.cs:line 72
   at ConsoleApplication.Program.Run() in C:\Users\Ian.Picknell\Documents\Blog\S
trong Names\Faking a Strong Name\ConsoleApplication\Program.cs:line 42
   at ConsoleApplication.Program.Main(String[] args) in C:\Users\Ian.Picknell\Do
cuments\Blog\Strong Names\Faking a Strong Name\ConsoleApplication\Program.cs:lin
e 11

DirectoryServices-related assemblies loaded into the current AppDomain are:
        System.DirectoryServices, &lt;span style="color:Red"&gt;Version=2.0.0.0&lt;/span&gt;, Culture=neutral, &lt;span style="color:Red"&gt;PublicKeyTok
en=b03f5f7f11d50a3a&lt;/span&gt; (from file:///C:/Windows/assembly/GAC_MSIL/System.DirectoryS
ervices/&lt;span style="color:Red"&gt;2.0.0.0__b03f5f7f11d50a3a&lt;/span&gt;/System.DirectoryServices.dll)

Press ENTER to exit
&lt;/pre&gt;

&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;
  The solution is to use a mock implementation of System.DirectoryServices and then
  persuade ThirdPartySecurity to use that instead - despite the fact that it holds a reference
  to the strong-named &lt;em&gt;real&lt;/em&gt; System.DirectoryServices. I highlighted the version number and public
  key tokens in the output above because they'll change in a moment.
&lt;/p&gt;
&lt;p&gt;
  Let's take a look at the mocked-up System.DirectoryServices. You'll note that I've had to
  make sure that the methods exist on the same classes that they would in the real
  System.DirectoryServices. For example, when ThirdPartySecurity calls Dispose on the real
  DirectorySearcher it's actually calling the Dispose method on System.ComponentModel.Component
  because that's what the real DirectorySearcher inherits from. So our fake version does too.
  By contrast, the real PropertyCollection has no base class - it handles all the collection
  logic itself; so our mock version needs to ensure that properties like Count are available
  directly on the PropertyCollection class and are not simply inherited from the base Dictionary.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;namespace&lt;/span&gt; System.DirectoryServices
{
    &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;DirectorySearcher&lt;/span&gt; : System.ComponentModel.&lt;span style='color:#2B91AF'&gt;Component&lt;/span&gt;
    {
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;DirectoryEntry&lt;/span&gt; SearchRoot { &lt;span style='color:blue'&gt;get&lt;/span&gt;; &lt;span style='color:blue'&gt;set&lt;/span&gt;; }
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;string&lt;/span&gt; Filter { &lt;span style='color:blue'&gt;get&lt;/span&gt;; &lt;span style='color:blue'&gt;set&lt;/span&gt;; }
&amp;nbsp;
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;SearchResultCollection&lt;/span&gt; FindAll()
        {
            &lt;span style='color:#2B91AF'&gt;SearchResultCollection&lt;/span&gt; searchResultCollection = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;SearchResultCollection&lt;/span&gt;();
            &lt;span style='color:#2B91AF'&gt;SearchResult&lt;/span&gt; searchResult = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;SearchResult&lt;/span&gt;();
            searchResultCollection.Add(searchResult);
            &lt;span style='color:blue'&gt;return&lt;/span&gt; searchResultCollection;
        }
    }

    &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;DirectoryEntry&lt;/span&gt;
    {
        &lt;span style='color:blue'&gt;private&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;PropertyCollection&lt;/span&gt; _properties;

        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;PropertyCollection&lt;/span&gt; Properties
        {
            &lt;span style='color:blue'&gt;get&lt;/span&gt; { &lt;span style='color:blue'&gt;return&lt;/span&gt; _properties; }
            &lt;span style='color:blue'&gt;set&lt;/span&gt; { _properties = &lt;span style='color:blue'&gt;value&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;SearchResult&lt;/span&gt;
    {
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;DirectoryEntry&lt;/span&gt; GetDirectoryEntry()
        {
            &lt;span style='color:#2B91AF'&gt;DirectoryEntry&lt;/span&gt; directoryEntry = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;DirectoryEntry&lt;/span&gt;();
            directoryEntry.Properties = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;PropertyCollection&lt;/span&gt;();
            &lt;span style='color:#2B91AF'&gt;PropertyValueCollection&lt;/span&gt; members = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;PropertyValueCollection&lt;/span&gt;();
            ((System.Collections.&lt;span style='color:#2B91AF'&gt;IList&lt;/span&gt;)members).Add(&lt;span style='color:#A31515'&gt;@&amp;quot;CN=MYDOMAIN\ian.picknell,otherstuff&amp;quot;&lt;/span&gt;);
            ((System.Collections.&lt;span style='color:#2B91AF'&gt;IList&lt;/span&gt;)members).Add(&lt;span style='color:#A31515'&gt;@&amp;quot;CN=MYDOMAIN\jane.armstrong,otherstuff&amp;quot;&lt;/span&gt;);
            directoryEntry.Properties[&lt;span style='color:#A31515'&gt;&amp;quot;member&amp;quot;&lt;/span&gt;] = members;
            &lt;span style='color:blue'&gt;return&lt;/span&gt; directoryEntry;
        }
    }

    &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;SearchResultCollection&lt;/span&gt; : System.Collections.&lt;span style='color:#2B91AF'&gt;ArrayList&lt;/span&gt;, &lt;span style='color:#2B91AF'&gt;IDisposable&lt;/span&gt;
    {
        &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;void&lt;/span&gt; Dispose()
        {
        }
    }

    &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;PropertyCollection&lt;/span&gt; : System.Collections.Generic.&lt;span style='color:#2B91AF'&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style='color:blue'&gt;string&lt;/span&gt;, &lt;span style='color:#2B91AF'&gt;PropertyValueCollection&lt;/span&gt;&amp;gt;
    {
        &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;int&lt;/span&gt; Count
        {
            &lt;span style='color:blue'&gt;get&lt;/span&gt; { &lt;span style='color:blue'&gt;return&lt;/span&gt; &lt;span style='color:blue'&gt;base&lt;/span&gt;.Count; }
        }

        &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;PropertyValueCollection &lt;span style='color:blue'&gt;this&lt;/span&gt;[&lt;span style='color:blue'&gt;string&lt;/span&gt; key]&lt;/span&gt;
        {
            &lt;span style='color:blue'&gt;get&lt;/span&gt; { &lt;span style='color:blue'&gt;return&lt;/span&gt; &lt;span style='color:blue'&gt;base&lt;/span&gt;[key]; }
            &lt;span style='color:blue'&gt;set&lt;/span&gt; { &lt;span style='color:blue'&gt;base&lt;/span&gt;[key] = &lt;span style='color:blue'&gt;value&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;PropertyValueCollection&lt;/span&gt; : System.Collections.&lt;span style='color:#2B91AF'&gt;CollectionBase&lt;/span&gt;
    {
    }
}
&lt;/pre&gt;
&lt;p&gt;
  We need to make sure this is compiled to an assembly named System.DirectoryServices
  via the Assembly Name property on the Application tab of Project Properties. We also
  need to make sure that it has a strong name - I just assigned it a new key pair via the
  Signing tab of Project Properties.
&lt;/p&gt;
&lt;p&gt;
  Okay, so how to be persuade ThirdPartySecurity to use this mock implementation of
  System.DirectoryServices rather than the real thing?
&lt;/p&gt;

&lt;h2&gt;Magic&lt;/h2&gt;
&lt;p&gt;
  The first thing we need to do is add a configuration file for ConsoleApplication
  to redirect requests for System.DirectoryServices from version 2.0.0.0 to some other
  version - I'll choose 2.1.0.0.
&lt;/p&gt;
&lt;pre&gt;
&lt;span style='color:blue'&gt;&amp;lt;?&lt;/span&gt;&lt;span style='color:#A31515'&gt;xml&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;version&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;quot;&lt;span style='color:blue'&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;encoding&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; ?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;configuration&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;runtime&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;assemblyBinding&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;xmlns&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;quot;&lt;span style='color:blue'&gt;urn:schemas-microsoft-com:asm.v1&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;dependentAssembly&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;assemblyIdentity&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;name&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;quot;&lt;span style='color:blue'&gt;System.DirectoryServices&lt;/span&gt;&amp;quot;&lt;/span&gt;
&lt;span style='color:blue'&gt;                          &lt;/span&gt;&lt;span style='color:red'&gt;publicKeyToken&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;quot;&lt;span style='color:blue'&gt;b03f5f7f11d50a3a&lt;/span&gt;&amp;quot;&lt;/span&gt;
&lt;span style='color:blue'&gt;                          &lt;/span&gt;&lt;span style='color:red'&gt;culture&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;quot;&lt;span style='color:blue'&gt;neutral&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;        &amp;lt;&lt;/span&gt;&lt;span style='color:#A31515'&gt;bindingRedirect&lt;/span&gt;&lt;span style='color:blue'&gt; &lt;/span&gt;&lt;span style='color:red'&gt;oldVersion&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;quot;&lt;span style='color:blue'&gt;2.0.0.0&lt;/span&gt;&amp;quot;&lt;/span&gt;
&lt;span style='color:blue'&gt;                         &lt;/span&gt;&lt;span style='color:red'&gt;newVersion&lt;/span&gt;&lt;span style='color:blue'&gt;=&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;quot;&lt;span style='color:blue'&gt;2.1.0.0&lt;/span&gt;&amp;quot;&lt;span style='color:blue'&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;      &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;dependentAssembly&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;    &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;assemblyBinding&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;  &amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;runtime&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;span style='color:blue'&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#A31515'&gt;configuration&lt;/span&gt;&lt;span style='color:blue'&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
  This just uses a standard assembly re-direction. As I mentioned earlier, such re-directions only
  allow the version number to be changed - you can't change the assembly name or public key token.
&lt;/p&gt;
&lt;p&gt;
  To persuade .NET that our MockDirectoryServices is actually the real System.DirectoryServices
  simply create the appropriate folder in the GAC and drop it in there:
&lt;/p&gt;
&lt;pre class="console"&gt;
&amp;gt; MD %SystemRoot%\assembly\GAC_MSIL\System.DirectoryServices\2.1.0.0__b03f5f7f11d50a3a
&amp;gt; COPY System.DirectoryServices.dll %SystemRoot%\assembly\GAC_MSIL\System.DirectoryServices\2.1.0.0__b03f5f7f11d50a3a
&lt;/pre&gt;
&lt;p&gt;
  So we're copying &lt;em&gt;our&lt;/em&gt; System.DirectoryServices (actually generated from the MockDirectoryServices
  project), which has a version number of 1.0.0.0 (because we didn't change it) and some random
  public key token and dropping it in the folder which &lt;em&gt;should&lt;/em&gt; contain version
  2.1.0.0 of System.DirectoryServices, signed with Microsoft's key pair (which has a public key
  token of b03f5f7f11d50a3a). In other words, we're lying.
&lt;/p&gt;
&lt;p&gt;
  When we run ConsoleApplication this time, we get a much more healthy result - even with
  no Active Directory in sight. Again, I've highlighted some interesting elements in the output.
&lt;/p&gt;
&lt;pre class="console"&gt;
The members of the group "MYDOMAIN\MyGroup"are:
        MYDOMAIN\ian.picknell
        MYDOMAIN\jane.armstrong

DirectoryServices-related assemblies loaded into the current AppDomain are:
        System.DirectoryServices, &lt;span style="color:Red"&gt;Version=1.0.0.0&lt;/span&gt;, Culture=neutral, &lt;span style="color:Red"&gt;PublicKeyTok
en=7c6ae5d5059e81d9&lt;/span&gt; (from file:///C:/Windows/assembly/GAC_MSIL/System.DirectoryS
ervices/&lt;span style="color:Red"&gt;2.1.0.0__b03f5f7f11d50a3a&lt;/span&gt;/System.DirectoryServices.dll)

Press ENTER to exit
&lt;/pre&gt;
&lt;p&gt;
  You'll note that our AppDomain &lt;em&gt;knows&lt;/em&gt; that it's dealing with version 1.0.0.0
  of an assembly which has a public key token of eeab6744580125d7, which is clearly
  &lt;em&gt;not&lt;/em&gt; the version ThirdPartySecurity references. But it doesn't seem to care. It
  was loaded from a folder within the GAC where version 2.1.0.0 with a public key 
  token of b03f5f7f11d50a3a was &lt;em&gt;expected&lt;/em&gt; to exist, and that seems good enough for it.
&lt;/p&gt;
&lt;p&gt;
  So, if you ever find yourself needing to provide a mock implementation of an assembly
  which has a strong name, now you know how.
&lt;/p&gt;

&lt;h2&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/02/tampering-with-strong-named-assembly.html"&gt;Tampering with a Strong-Named Assembly&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/02/where-is-global-assembly-cache.html"&gt;Where is the Global Assembly Cache?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://ianpicknell.blogspot.com/2010/02/evading-strong-name-integrity-check.html"&gt;Evading the Strong Name Integrity Check&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7929053599129622940-883200417203160854?l=ianpicknell.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ianpicknell/~4/H3-ju2A4_k0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ianpicknell.blogspot.com/feeds/883200417203160854/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://ianpicknell.blogspot.com/2010/02/faking-strong-name.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/883200417203160854?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7929053599129622940/posts/default/883200417203160854?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ianpicknell/~3/H3-ju2A4_k0/faking-strong-name.html" title="Faking a Strong Name" /><author><name>Ian Picknell</name><uri>http://www.blogger.com/profile/11237307149515983183</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://3.bp.blogspot.com/_fkuTkJfqL8Q/SxU3TyAA9OI/AAAAAAAAAAM/ZkELyHWFs2U/S220/IMG_0352_cropped.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_fkuTkJfqL8Q/S3Xp6xFikdI/AAAAAAAAADQ/4oFwczzYUd8/s72-c/FakingAStrongName_SolutionExplorer.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://ianpicknell.blogspot.com/2010/02/faking-strong-name.html</feedburner:origLink></entry></feed>

