<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>LEX's blog</title>
    <description>Software Development</description>
    <link>http://www.blog4work.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 2.0.0.36</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.blog4work.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Oleksii Mandrychenko</dc:creator>
    <dc:title>LEX's blog</dc:title>
    <geo:lat>55.872000</geo:lat>
    <geo:long>-4.258000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/OleksiiMandrychenko" /><feedburner:info uri="oleksiimandrychenko" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>55.868184</geo:lat><geo:long>-4.250507</geo:long><image><link>http://www.blog4work.com</link><url>http://feeds.feedburner.com/~fc/OleksiiMandrychenko?bg=000000&amp;amp;fg=FFFFFF&amp;amp;anim=0</url><title>Lex's blog</title></image><item>
      <title>Generics. Reference summary.</title>
      <description>&lt;p&gt;People say generic collections offer a lot of benefits compared to the non-generic ones. This post is a short reminder to myself (mostly) as of what are those benefits.&lt;/p&gt;
&lt;h2&gt;1 Memory usage&lt;/h2&gt;
&lt;p&gt;I start with a few lines of code in C#4, all pretty basic stuff. I ran it in Debug mode and waited till debugger stopped at the last line of main method. Then I got Immediate Window (in Visual Studio) opened, loaded SOS extension and dumped all the objects' sizes. Below is the code and in comments I put the extracted sizes of objects.&lt;/p&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="n"&gt;Immediate&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt; &lt;span class="n"&gt;sos&lt;/span&gt;
&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ObjSize&lt;/span&gt;

&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="n"&gt;Code&lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;arrayList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        &lt;span class="c1"&gt;//4040 bytes&lt;/span&gt;
&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;byteList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        &lt;span class="c1"&gt;//1036 bytes&lt;/span&gt;

&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                &lt;span class="c1"&gt;//4040 bytes&lt;/span&gt;
&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;genericStack&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;//1036 bytes&lt;/span&gt;

&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                &lt;span class="c1"&gt;//4052 bytes&lt;/span&gt;
&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;genericQueue&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;//1044 bytes&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Apparently, this is all platform, CLR (pointers on 32-bit and 64-bit machines are different and different versions can use updated code), hardware etc etc dependent, but to me it's enough to see a generic collection use much less memory with value types. Overheat for storing boxed objects is quite large (nearly 4 times in this sample!).&lt;/p&gt;
&lt;h2&gt;2 Performance&lt;/h2&gt;
&lt;p&gt;I tested adding and taking 10.000.000 items into generic and non-generic collections. Here's a snippet of code and the results.&lt;/p&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
	&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

	&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
	&lt;span class="p"&gt;{&lt;/span&gt;
		&lt;span class="c1"&gt;//Init	&lt;/span&gt;
		&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
		
		&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
		&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NextBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
		
		&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;arrayList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
		&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;byteList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
		&lt;span class="c1"&gt;//...&lt;/span&gt;
			
		&lt;span class="c1"&gt;//Timed stress-load: add then take&lt;/span&gt;
		&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;arrayListTime&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TimeAction&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
		&lt;span class="p"&gt;{&lt;/span&gt;
			&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
			&lt;span class="p"&gt;{&lt;/span&gt;
				&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
				&lt;span class="n"&gt;arrayList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
			&lt;span class="p"&gt;}&lt;/span&gt;
			&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
			&lt;span class="p"&gt;{&lt;/span&gt;
				&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
				&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;arrayList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
			&lt;span class="p"&gt;}&lt;/span&gt;
		&lt;span class="p"&gt;});&lt;/span&gt;
		&lt;span class="c1"&gt;//...&lt;/span&gt;
		
		&lt;span class="c1"&gt;//Output results&lt;/span&gt;
		&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"array list: "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;arrayListTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;		&lt;br /&gt;		&lt;span class="c1"&gt;//...&lt;/span&gt;
	&lt;span class="p"&gt;}&lt;/span&gt;

	&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;TimeSpan&lt;/span&gt; &lt;span class="nf"&gt;TimeAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
	&lt;span class="p"&gt;{&lt;/span&gt;
		&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
		&lt;span class="n"&gt;sw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
		&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
		&lt;span class="n"&gt;sw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Elapsed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And the output is&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="p"&gt;-----------------------------&lt;/span&gt;
&lt;span class="p"&gt;-----------------------------&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 	&lt;span class="m"&gt;2.2440829&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;
&lt;span class="n"&gt;generic&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 	&lt;span class="m"&gt;0.2694271&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;
&lt;span class="p"&gt;-----------------------------&lt;/span&gt;
&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 		&lt;span class="m"&gt;2.0472536&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;
&lt;span class="n"&gt;generic&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 	&lt;span class="m"&gt;0.3369304&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;
&lt;span class="p"&gt;-----------------------------&lt;/span&gt;
&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 		&lt;span class="m"&gt;1.9683970&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;
&lt;span class="n"&gt;generic&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 	&lt;span class="m"&gt;0.3751191&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;
&lt;span class="p"&gt;-----------------------------&lt;/span&gt;
&lt;span class="p"&gt;-----------------------------&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It can be clearly seen that generics outperform non-generic collections. The time gain happens because generic collection doesn't spend time on boxing/unboxing and subsequent copy of the value to the value-type location.&lt;/p&gt;
&lt;h2&gt;3 Clean code&lt;/h2&gt;
&lt;p&gt;Consider a situation where one developer thinks he works with fruits, but somebody else has made an error and used an incorrect type.&lt;/p&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Apple&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;());&lt;br /&gt;&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
&lt;span class="c1"&gt;//you cannot peel a dog &lt;/span&gt;
&lt;span class="c1"&gt;//but guess when you learn this?&lt;/span&gt;
&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Peel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;br /&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;4 Variance&lt;/h2&gt;
&lt;p&gt;Generic classes are invariant in .NET2 - .NET4 inclusive. However in .NET 4 delegates and interface got support for one-directional variance (via either &lt;em&gt;in&lt;/em&gt; or &lt;em&gt;out&lt;/em&gt; keywords). Because it's a big topic I shall stop here and refer the reader to thoughts on &lt;a href="http://stackoverflow.com/q/2208043/706456 "&gt;stackoverflow&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/dd799517.aspx"&gt;msdn&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;5 Limitations&lt;/h2&gt;
&lt;p&gt;Generics support only classes, structs,interfaces, delegates and methods. It's not possible to parametrize events, constructors, properties, indexers etc.&lt;/p&gt;
&lt;p&gt;Performance gain is not noticeable for &lt;em&gt;reference type&lt;/em&gt;'s collections (as boxing/unboxing/copying does occur) and for &lt;em&gt;single&lt;/em&gt; parametrized item (as it's just too quick to make an effect).&lt;/p&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HiSnIcP8DG11bCSfqCId3FfJRUc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HiSnIcP8DG11bCSfqCId3FfJRUc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HiSnIcP8DG11bCSfqCId3FfJRUc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HiSnIcP8DG11bCSfqCId3FfJRUc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=0aF23jGT6kQ:iLpD6quit40:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/0aF23jGT6kQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/0aF23jGT6kQ/post.aspx</link>
      <comments>http://www.blog4work.com/post/2012/01/31/Generics-Reference-summary.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=f0fe4163-cc64-41b6-9c76-8c79140de11f</guid>
      <pubDate>Tue, 31 Jan 2012 22:59:00 +0000</pubDate>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=f0fe4163-cc64-41b6-9c76-8c79140de11f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=f0fe4163-cc64-41b6-9c76-8c79140de11f</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2012/01/31/Generics-Reference-summary.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=f0fe4163-cc64-41b6-9c76-8c79140de11f</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=f0fe4163-cc64-41b6-9c76-8c79140de11f</feedburner:origLink></item>
    <item>
      <title>CLR Internals &gt; AppDomain</title>
      <description>&lt;p&gt;Consider very simple code&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="m"&gt;1&lt;/span&gt;	&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="m"&gt;2&lt;/span&gt;	&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="m"&gt;3&lt;/span&gt;		&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="m"&gt;4&lt;/span&gt;		&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="m"&gt;5&lt;/span&gt;			&lt;span class="n"&gt;AppDomain&lt;/span&gt; &lt;span class="n"&gt;newDomain&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AppDomain&lt;/span&gt;
&lt;span class="m"&gt;6&lt;/span&gt;				&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateDomain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MyDomain_1"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="m"&gt;7&lt;/span&gt;  		&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="m"&gt;8&lt;/span&gt;	&lt;span class="p"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; How many domains are there at line 7, given this code run as a managed console application?&lt;/p&gt;
&lt;p&gt;Think about it before continuing reading.&lt;/p&gt;
&lt;p&gt;Without additional searching of the Internet or digging clever books it is easy enough to check what's happening. CLR has had several debuggers that allow developers to to debug the code on the edge of managed and unmanaged code. One of these debuggers is Son of Strike (&lt;a href="http://msdn.microsoft.com/en-us/library/bb190764.aspx"&gt;SOS&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Let's get our hands dirty. I put a break point at line 7 and start debugging in Visual Studio. Once the breakpoint is hit, I load SOS from the Immediate Window in Visual Studio. There are usually some troubles with just loading the debugger extension, so consider &lt;a href="https://blogs.msdn.com/b/zainnab/archive/2010/09/30/the-immediate-window-running-windbg-and-sos-son-of-strike-commands-vstiptool0097.aspx?Redirected=true"&gt;this post&lt;/a&gt; to troubleshoot SOS.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;.load sos&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This will hopefully load SOS and now let's run the command to get all AppDomains:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;!DumpDomain&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The output on my machine was&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;&lt;span style="font-size: xx-small;"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;System Domain:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 59da1478&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;LowFrequencyHeap:&amp;nbsp;&amp;nbsp; 59da1784&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;HighFrequencyHeap:&amp;nbsp; 59da17d0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;StubHeap:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 59da181c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Stage:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPEN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; None&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Shared Domain:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 59da1140&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;LowFrequencyHeap:&amp;nbsp;&amp;nbsp; 59da1784&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;HighFrequencyHeap:&amp;nbsp; 59da17d0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;StubHeap:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 59da181c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Stage:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPEN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; None&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Assembly:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00240a20 [C:\Windows\Microsoft.Net\assembly\GAC_32\...\mscorlib.dll]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;ClassLoader:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00240ac0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; Module Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;589e1000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\Windows\Microsoft.Net\assembly\GAC_32\...\mscorlib.dll&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Domain 1:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 001f19f0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;LowFrequencyHeap:&amp;nbsp;&amp;nbsp; 001f1d6c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;HighFrequencyHeap:&amp;nbsp; 001f1db8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;StubHeap:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 001f1e04&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Stage:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPEN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;SecurityDescriptor: 001f3168&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Test.exe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Assembly:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00240a20 [C:\Windows\Microsoft.Net\assembly\GAC_32\...mscorlib.dll]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;ClassLoader:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00240ac0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;SecurityDescriptor: 0023b5a8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; Module Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;589e1000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\Windows\Microsoft.Net\assembly\GAC_32\...mscorlib.dll&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Assembly:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0024b048 [C:\Projects\Private\Test\bin\Debug\Test.exe]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;ClassLoader:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0024b0e8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;SecurityDescriptor: 0024c0e0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; Module Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;003c2e9c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\Projects\Private\Test\bin\Debug\Test.exe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Domain 2:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0024f730&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;LowFrequencyHeap:&amp;nbsp;&amp;nbsp; 0024faac&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;HighFrequencyHeap:&amp;nbsp; 0024faf8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;StubHeap:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0024fb44&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Stage:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPEN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;SecurityDescriptor: 00252c28&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyDomain_1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Assembly:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00240a20 [C:\Windows\Microsoft.Net\assembly\GAC_32\...mscorlib.dll]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;ClassLoader:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00240ac0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;SecurityDescriptor: 002542c8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;&amp;nbsp; Module Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;589e1000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\Windows\Microsoft.Net\assembly\GAC_32\...mscorlib.dll&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; so as you can see 4 domains will get created. Namely: system, shared, one default user domain and the last one that the user code additionally creates (lines 5-6). I found really nice &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163791.aspx#S1"&gt;article&lt;/a&gt; describing what happens when CLR starts and how CLR bootstrapper loads domains.&lt;/p&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7Lu7SUjC4eVJXsXyJvU8qntw9Xs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7Lu7SUjC4eVJXsXyJvU8qntw9Xs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7Lu7SUjC4eVJXsXyJvU8qntw9Xs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7Lu7SUjC4eVJXsXyJvU8qntw9Xs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=oIy8WshoDjs:4tkiNc97Kyk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/oIy8WshoDjs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/oIy8WshoDjs/post.aspx</link>
      <comments>http://www.blog4work.com/post/2012/01/27/CLR-Internals-gt;-AppDomain.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=6a0f951c-c0dd-4be8-8597-3aa7ddd969b4</guid>
      <pubDate>Fri, 27 Jan 2012 13:39:00 +0000</pubDate>
      <category>.NET</category>
      <category>Architecture</category>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=6a0f951c-c0dd-4be8-8597-3aa7ddd969b4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=6a0f951c-c0dd-4be8-8597-3aa7ddd969b4</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2012/01/27/CLR-Internals-gt;-AppDomain.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=6a0f951c-c0dd-4be8-8597-3aa7ddd969b4</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=6a0f951c-c0dd-4be8-8597-3aa7ddd969b4</feedburner:origLink></item>
    <item>
      <title>Basic implementation of StringBuilder and why it is required</title>
      <description>&lt;p&gt;This is one of the typical interview questions: &lt;em&gt;when do I need to use a StringBuilder and how a simple implementation would look like&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;The problem with a System.String type is that it is actually an &lt;strong&gt;immutable reference type&lt;/strong&gt; although it seems to behave like mutable value type. Immutability means that for any write operation performed with the same string, a new object is mandatory created. For example, s1 = s1 + s2 will not modify s1, but will create a new object with a concatenated s1 and s2 and drops the reference to the old s1 to garbage collector. This is required to support long strings (&amp;lt; 2GB in .NET 4), save time and space complexity and maybe (which would be a pure guess) it was easier to follow a successful example of Java strings.&lt;/p&gt;
&lt;p&gt;StringBuilder class has internal access to the string object and is useful for any string manipulations, especially numerous. Internally, StringBuilder uses string object, and since .NET 4 it uses a char array. This class does not create copies of string objects but rather acts as if it works with one mutable string&lt;/p&gt;
&lt;p&gt;Because StringBuilder implements a Builder design pattern any state-changing operation should return the object itself (&lt;em&gt;this&lt;/em&gt;). ToString() method acts as a Build() method and as it is defined in the System.Object, there is no need to include ToString() in the contract.&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="n"&gt;ISimpleStringBuilder&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
	&lt;span class="n"&gt;ISimpleStringBuilder&lt;/span&gt; &lt;span class="nf"&gt;Append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
	&lt;span class="n"&gt;ISimpleStringBuilder&lt;/span&gt; &lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
	&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Lenght&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
	&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Capacity&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A very simple implementation of the builder class may look like this&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SimpleStringBuilder&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ISimpleStringBuilder&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;_internalBuffer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ISimpleStringBuilder&lt;/span&gt; &lt;span class="nf"&gt;Append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToCharArray&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;//check if space is available for additional data&lt;/span&gt;
        &lt;span class="n"&gt;InternalEnsureCapacity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_internalBuffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Lenght&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;Lenght&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//use only non-null ('\0') characters&lt;/span&gt;
        &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Lenght&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Lenght&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_internalBuffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;    
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This code is of course very basic, inefficient, not thread-safe, doesn't make any input validation etc. It does however  demonstrates the idea behind StringBuilder class.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.blog4work.com/file.axd?file=2012%2f1%2fSimpleStringBuilder.zip"&gt;SimpleStringBuilder.zip (75.77 kb) [Downloads: 14]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/oleksii-mdr/SimpleStringBuilder"&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f9%2fgit1.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-XUumxnrtlM9Ll9Oxmq20fljLfo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-XUumxnrtlM9Ll9Oxmq20fljLfo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-XUumxnrtlM9Ll9Oxmq20fljLfo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-XUumxnrtlM9Ll9Oxmq20fljLfo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=ze7cDPliItU:_fu7RgfEjm8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/ze7cDPliItU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/ze7cDPliItU/post.aspx</link>
      <comments>http://www.blog4work.com/post/2012/01/01/Basic-implementation-of-StringBuilder-and-why-it-is-required.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=8c2470ab-3e33-49ed-9a48-e4ee7842dcff</guid>
      <pubDate>Sun, 01 Jan 2012 16:51:00 +0000</pubDate>
      <category>.NET</category>
      <category>Interview questions</category>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=8c2470ab-3e33-49ed-9a48-e4ee7842dcff</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=8c2470ab-3e33-49ed-9a48-e4ee7842dcff</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2012/01/01/Basic-implementation-of-StringBuilder-and-why-it-is-required.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=8c2470ab-3e33-49ed-9a48-e4ee7842dcff</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=8c2470ab-3e33-49ed-9a48-e4ee7842dcff</feedburner:origLink></item>
    <item>
      <title>Sample WCF contract callback</title>
      <description>&lt;p&gt;I was trying to create a simple project based on WCF where a service can notify clients about something (as oposed to the standard scenarios where a client asks a service to perform some operation). The simplest way to do so is to use callbacks. I have made up a very simple solution to demonstrate this concept. A sample solution has two interfaces: one for the usual service contract and another one for the client callback.&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="na"&gt;[ServiceContract(CallbackContract = typeof(IContractCallback))]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="n"&gt;IContract&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="na"&gt;    [OperationContract]&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="na"&gt;[ServiceContract]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="n"&gt;IContractCallback&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="na"&gt;    [OperationContract]&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnFooCallback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A very basic implementation of these contract can look like this&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WcfService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IContract&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//Do work...            &lt;/span&gt;
        &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;callback&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OperationContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;
                        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetCallbackChannel&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IContractCallback&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
        &lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OnFooCallback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContractCallback&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IContractCallback&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnFooCallback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is how this small app looks&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f9%2fserver1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f9%2fclient.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Using the callback contract can be straight-forward, however there are some limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only &lt;em&gt;NetTcpBinding&lt;/em&gt;, &lt;em&gt;NetNamedPipeBinding&lt;/em&gt; and &lt;em&gt;WSDualHttpBinding&lt;/em&gt; bindings are supported&lt;/li&gt;
&lt;li&gt;One callback contract per service contract is allowed&lt;/li&gt;
&lt;li&gt;Client must keep the connection open the whole time &lt;/li&gt;
&lt;li&gt;Service must use &lt;em&gt;reentrant&lt;/em&gt; or &lt;em&gt;multiple&lt;/em&gt; concurrency mode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This project can be downloaded using the link below or from the github.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.blog4work.com/file.axd?file=2011%2f9%2fCallbackService.zip"&gt;CallbackService.zip (17.49 kb) [Downloads: 121]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/oleksii-mdr/CallbackService"&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f9%2fgit1.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yoAvtZvAgt7tJp2uTn-ySEFuVqA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yoAvtZvAgt7tJp2uTn-ySEFuVqA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yoAvtZvAgt7tJp2uTn-ySEFuVqA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yoAvtZvAgt7tJp2uTn-ySEFuVqA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=T5hh7hjOm54:hs3KPT2Ahew:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/T5hh7hjOm54" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/T5hh7hjOm54/post.aspx</link>
      <comments>http://www.blog4work.com/post/2011/09/24/Sample-WCF-contract-callback.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=c5eea1dd-b34c-4515-b2cc-a001f7d31e6a</guid>
      <pubDate>Sat, 24 Sep 2011 14:41:00 +0000</pubDate>
      <category>.NET</category>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=c5eea1dd-b34c-4515-b2cc-a001f7d31e6a</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=c5eea1dd-b34c-4515-b2cc-a001f7d31e6a</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2011/09/24/Sample-WCF-contract-callback.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=c5eea1dd-b34c-4515-b2cc-a001f7d31e6a</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=c5eea1dd-b34c-4515-b2cc-a001f7d31e6a</feedburner:origLink></item>
    <item>
      <title>WCF Client to Close or Abort</title>
      <description>&lt;p&gt;Any service oriented architecture, including WCF, follows a convention where a client implements a &lt;a href="http://www.dofactory.com/Patterns/PatternProxy.aspx"&gt;proxy pattern&lt;/a&gt;. Proxy allows the client to abstract from the concrete implementations and locations of the service. Client often creates stubs that work well in the compile time, whereas in runtime stubs are resolved and actual calls are made to the service.&lt;/p&gt;
&lt;h3&gt;Closing WCF client&lt;/h3&gt;
&lt;p&gt;A client has an inherited responsibility of gracefully closing the connection. It is always recommended to close the proxy client. If the binding between a client and a service is transport-layer sessionful, then closing a proxy is essential to tear down the connection between both parties. Service has a payload threshold defined for concurrent connections. If the number of concurrent connections goes above this threshold &lt;em&gt;linearly&lt;/em&gt; then the overall service performance &lt;em&gt;exponentially&lt;/em&gt; decreases. This is why it is crucial to dispose of the connection as soon as possible. Closing the proxy also notifies the service instance that it is no longer in use and may be collected by GC. If the client does not close a connection, it is still automatically torn down by WCF timeouts (found in the configuration files).&lt;/p&gt;
&lt;h3&gt;Aborting WCF client&lt;/h3&gt;
&lt;p&gt;In the situation where there is a fault in the service-client interaction, the objects on both ends are potentially totally broken. Thus using a proxy after the exception is not advised. Given the WCF binding use transport sessions, the client after a fault would not even be able to close it (if there was no transport layer session then the client could use or close the proxy, but this is not recommended as the configuration of sessions could change). So after a fault has happened the only safe operation is to abort a proxy.&lt;/p&gt;
&lt;h3&gt;Coding&lt;/h3&gt;
&lt;p&gt;Close (and Abort on fault) needs to be called for all the client calls, therefore these methods can be moved to a proxy itself&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Client1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ClientBase&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IContract1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;IContract1&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;DoWork&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoWork&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;catch&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;			
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tL-dswCbh00cwrAYYJurPemZT9c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tL-dswCbh00cwrAYYJurPemZT9c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tL-dswCbh00cwrAYYJurPemZT9c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tL-dswCbh00cwrAYYJurPemZT9c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=x7VfadM0hCQ:6u58AZsm668:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/x7VfadM0hCQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/x7VfadM0hCQ/post.aspx</link>
      <comments>http://www.blog4work.com/post/2011/09/01/WCF-Client-to-Close-or-Abort.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=cc69a51c-4367-4251-aae4-04ca22863759</guid>
      <pubDate>Thu, 01 Sep 2011 11:36:00 +0000</pubDate>
      <category>.NET</category>
      <category>Architecture</category>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=cc69a51c-4367-4251-aae4-04ca22863759</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=cc69a51c-4367-4251-aae4-04ca22863759</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2011/09/01/WCF-Client-to-Close-or-Abort.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=cc69a51c-4367-4251-aae4-04ca22863759</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=cc69a51c-4367-4251-aae4-04ca22863759</feedburner:origLink></item>
    <item>
      <title>How to host many WCF services in one Windows Service</title>
      <description>&lt;p&gt;It is well known that WCF service can be hosted as a self-hosted application, IIS web service or a Windows service. This post is dedicated to the Windows service hosting and it goes through some advanced techniques on how to host many WCF services in one windows service.&lt;/p&gt;
&lt;p&gt;So, here I have got three projects: multiple WCF services project, a client and a Windows service installer. Let us start with the WCF services. This project has three service interfaces and correspondently three service implementations.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f6%2fstruct1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Sample interface looks like this:&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="na"&gt;[ServiceContract]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="n"&gt;IService1&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="na"&gt;    [OperationContract]&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;DoAction1&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And its implementation is very simple&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Service1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WindowsManagedService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IService1&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Service1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Service1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;DoAction1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Action 1"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These are the interfaces in WCF service project&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f6%2finterfaces.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Class diagram for the services that implement those interfaces&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f6%2fimpl.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;You must have noticed that there are a few other types like &lt;em&gt;IWindowsManagedService&lt;/em&gt; and &lt;em&gt;WindowsManagedService&lt;/em&gt; - this is basically a bridge that allows WCF services to be hosted within Windows service.&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="n"&gt;IWindowsManagedService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WindowsManagedService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IWindowsManagedService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;ServiceHost&lt;/span&gt; &lt;span class="n"&gt;serviceHost&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nf"&gt;WindowsManagedService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="n"&gt;serviceType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;serviceHost&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ServiceHost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serviceType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;serviceHost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;serviceHost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Next, let&amp;rsquo;s take a quick look into the host project. This project contains a configuration file for the WCF services. It also has one installer class which is picked up by &lt;a href="http://msdn.microsoft.com/en-us/library/50614e95%28v=VS.100%29.aspx"&gt;installutil&lt;/a&gt;. But the main type here is &lt;em&gt;WindowsManagedServices&lt;/em&gt; which uses reflection to find WCF services that can be hosted in one Windows service&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WindowsManagedServices&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ServiceBase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IWindowsManagedService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;WindowsManagedServices&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IWindowsManagedService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

        &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;assembly&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetAssembly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IWindowsManagedService&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetTypes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsAbstract&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IWindowsManagedService&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;IsAssignableFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;serviceObject&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IWindowsManagedService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;Activator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serviceObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnStop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then, I used &lt;em&gt;installutil&lt;/em&gt; to install the windows service and here is what I end up with&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 Windows Service WCFServices&lt;/li&gt;
&lt;li&gt;3 WCF services &lt;br /&gt;&lt;em&gt;http://localhost:8083/WCFServices/IService1&lt;/em&gt;&lt;br /&gt;&lt;em&gt;http://localhost:8083/WCFServices/IService2&lt;/em&gt;&lt;br /&gt;&lt;em&gt;http://localhost:8083/WCFServices/IService3&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lastly, a sample client to this application&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;IService1&lt;/span&gt; &lt;span class="n"&gt;client1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Service1Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;IService2&lt;/span&gt; &lt;span class="n"&gt;client2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Service2Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;IService3&lt;/span&gt; &lt;span class="n"&gt;client3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Service3Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Client 1 says: "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;client1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoAction1&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Client 2 says: "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;client2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoAction2&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Client 3 says: "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;client3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoAction3&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadLine&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f6%2foutput1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The whole project can be downloaded using the link below. Unzip it, run the solution file and hit F5 in Visual Studio 2010. It should start two projects: services and the client.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.blog4work.com/file.axd?file=2012%2f1%2fWCFServiceHosting.zip"&gt;WCFServiceHosting.zip (46.48 kb) [Downloads: 30]&lt;/a&gt; [UPDATED after discovery of the client's port mismatch)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/oleksii-mdr/WCFServiceHosting"&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f9%2fgit1.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/53V0MXzZ63tnIuyziTIypNmjT5M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/53V0MXzZ63tnIuyziTIypNmjT5M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/53V0MXzZ63tnIuyziTIypNmjT5M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/53V0MXzZ63tnIuyziTIypNmjT5M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=cC2GEYXkJDk:juv2lEBbKns:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/cC2GEYXkJDk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/cC2GEYXkJDk/post.aspx</link>
      <comments>http://www.blog4work.com/post/2011/06/25/How-to-host-many-WCF-services-in-one-Windows-Service.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=3f9c2985-f063-447f-84ab-8261ee842cac</guid>
      <pubDate>Sat, 25 Jun 2011 20:31:00 +0000</pubDate>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=3f9c2985-f063-447f-84ab-8261ee842cac</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=3f9c2985-f063-447f-84ab-8261ee842cac</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2011/06/25/How-to-host-many-WCF-services-in-one-Windows-Service.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=3f9c2985-f063-447f-84ab-8261ee842cac</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=3f9c2985-f063-447f-84ab-8261ee842cac</feedburner:origLink></item>
    <item>
      <title>Why Thread.Sleep(1) takes more time?</title>
      <description>&lt;p&gt;I want to make a thread sleep for 1 ms on a Windows OS, but when I use &lt;em&gt;Thread.Sleep(1)&lt;/em&gt; it usually takes more time, for example 10 &amp;ndash; 20ms. This happens because desktop and server Windows are &lt;strong&gt;not&lt;/strong&gt; &lt;a href="http://en.wikipedia.org/wiki/Real-time_operating_system"&gt;real-time operating systems&lt;/a&gt; (Windows Compact Editions is). My laptop has one CPU and two cores, thus I have a very small number of independent execution units.&lt;/p&gt;
&lt;p&gt;From the other hand there is a number of processes and many more threads. Each thread requires some processor time, that is assigned internally by the Windows scheduler. So Windows blocks all the threads but gives a certain amount of CPU time to the few selected threads, then it &lt;a href="http://msdn.microsoft.com/en-us/library/ms682105%28v=vs.85%29.aspx"&gt;switches the context&lt;/a&gt; to the other threads. OS tries to switch the context as less as possible and stay in one context as long as possible, because switching itself doesn't do any practical payload, but still consumes the resources.&lt;/p&gt;
&lt;p&gt;When I call &lt;em&gt;Thread.Sleep&lt;/em&gt;, no matter how small it is, I kill the whole time span that Windows has assigned to the thread. It is clear that there are no reasons to wait for a sleeping thread. This is why the context can be safely switched straight away. It can take a few ms when the Windows returns the context control to the current thread next time and this is why I usually cannot sleep for small time span.&lt;/p&gt;
&lt;p&gt;If I still need to sleep a very small amount of time, I can do processor &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.spinwait.aspx"&gt;spinning&lt;/a&gt;, e.g. &lt;em&gt;System.Collections.Concurrent&lt;/em&gt; namespace uses spinning for &lt;a href="http://en.wikipedia.org/wiki/Non-blocking_algorithm"&gt;non-blocking&lt;/a&gt; collections' updates.&lt;/p&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zlFoWvL75CM2a3AbQmpWR9VsPgs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zlFoWvL75CM2a3AbQmpWR9VsPgs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zlFoWvL75CM2a3AbQmpWR9VsPgs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zlFoWvL75CM2a3AbQmpWR9VsPgs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=lgHV5QGV2xc:TAy490b61xg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/lgHV5QGV2xc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/lgHV5QGV2xc/post.aspx</link>
      <comments>http://www.blog4work.com/post/2011/06/07/Why-ThreadSleep(1)-takes-more-time.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=d40e2a67-4355-4fa9-9220-b9de1b211793</guid>
      <pubDate>Tue, 07 Jun 2011 14:28:00 +0000</pubDate>
      <category>.NET</category>
      <category>Architecture</category>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=d40e2a67-4355-4fa9-9220-b9de1b211793</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=d40e2a67-4355-4fa9-9220-b9de1b211793</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2011/06/07/Why-ThreadSleep(1)-takes-more-time.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=d40e2a67-4355-4fa9-9220-b9de1b211793</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=d40e2a67-4355-4fa9-9220-b9de1b211793</feedburner:origLink></item>
    <item>
      <title>Basic security for ASP.NET applications</title>
      <description>&lt;h2&gt;Part 3&lt;/h2&gt;
&lt;h5&gt;&lt;a href="http://blog4work.com/post/2011/05/10/Basic-security-for-ASPNET-applications.aspx"&gt;See Part 1&lt;/a&gt; (debug, error pages, back-ups, config encryption)&lt;/h5&gt;
&lt;h5&gt;&lt;a href="http://blog4work.com/post/2011/05/17/Basic-security-for-ASPNET-applications.aspx"&gt;See Part 2&lt;/a&gt; (passwords, sensitive data, updates and patches, basic authentication)&lt;/h5&gt;
&lt;p&gt;This part concentrates on the user&amp;rsquo;s privacy, authentication, authorization and validation.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Privacy is extremely important for web application, where all the data transfer is public. It is a tall order to make private data actually private. Developers shall always assume that the web is:         
&lt;ul&gt;
&lt;li&gt;Unreliable - packets get lost, delayed, received in messed-up order etc.&lt;/li&gt;
&lt;li&gt;Insecure - packets travel via different countries and potentially are recorded&lt;/li&gt;
&lt;li&gt;Cacheable - any GET requests are possibly cached by servers and routers,&amp;nbsp; thus only public data can&amp;nbsp; be requested via unprotected channel &lt;/li&gt;
&lt;li&gt;Subject to various attacks (spoofing, denial-of-service, cross-site, man-in-the-middle and many others)&lt;/li&gt;
&lt;/ul&gt;
Therefore private data must be protected via encryption using only standard time-proved algorithms of layered security such as &lt;a href="http://www.google.com/search?q=secure+asp.net+with+SSL"&gt;TLS (SSL)&lt;/a&gt;, &lt;a href="http://sourceforge.net/projects/sharpssh/"&gt;SSH&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/ff649249.aspx"&gt;IPsec&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/ff647076.aspx"&gt;Kerberos&lt;/a&gt; and others. This includes communication between client, web server, data storage, and any combination of those. Encryption certificate must be issued by a valid authority and have a valid expiry date. Sertificates shall not use compromised hash algorithms (&lt;a href="http://www.google.com/search?q=compromised+hash+MD5"&gt;MD5&lt;/a&gt;, &lt;a href="http://www.google.com/search?q=compromised+hash+SHA-1"&gt;SHA-1&lt;/a&gt;). Access to private keys (if used) must be strictly controlled and audited (&lt;a href="http://www.thetechherald.com/article.php/201029/5921/VeriSign-working-to-mitigate-Stuxnet-digital-signature-theft"&gt;fail&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Authentication serves the purpose to verify that you are who you claim you are. Communication between client and server must be encrypted to prevent hijacking of user name/password/security token. Encryption must include the loging page, the authentication POST destination, and the landing page. Audit of all login attempts shall be persisted to a safe protected place. Athentication can be delegated to one of the &lt;a href="http://en.wikipedia.org/wiki/OpenID#OpenID_Providers"&gt;OpenID providers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Authorization is a process of checking if the user, process, context have permissions to perform the requested action. There are various approaches to implement authorization in a web application. Authorization always occurs on the server side and shall operate in a &lt;a href="http://www.informationweek.com/news/212701670"&gt;whitelist&lt;/a&gt; mode - &lt;em&gt;deny&lt;/em&gt; all operations unless &lt;em&gt;allow&lt;/em&gt; is explicitly specified. Database users shall have a very limited amount of privileges and must not have privileges to drop a table or database. Never use a system account, such as &lt;em&gt;sa&lt;/em&gt; for MS SQL server.&lt;/li&gt;
&lt;li&gt;Validation for the whole web application shall be central, any income document shall get validated on the server side, e.g. XML schema verified before any processing.&amp;nbsp; Server side validation is mandatory, whereas client side one is a nice optional feature to have. Failed validation shall be logged and monitored by the system administrator.&amp;nbsp; HTTP verbs that modify the state (POST, PUT, PATCH, and DELETE) must be treated with additional caution. Here is a validation &lt;a href="http://msdn.microsoft.com/en-us/library/ff649015.aspx"&gt;guidelines&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h6&gt;This post could not have been published without the help of &lt;a href="http://www.certsandprogs.com"&gt;Niall Merrigan&lt;/a&gt;&lt;/h6&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QlyyFckVpU49aNPcvctzTPnCT9k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QlyyFckVpU49aNPcvctzTPnCT9k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QlyyFckVpU49aNPcvctzTPnCT9k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QlyyFckVpU49aNPcvctzTPnCT9k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=brxUw2bHSjk:jk2aPTS-fcU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/brxUw2bHSjk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/brxUw2bHSjk/post.aspx</link>
      <comments>http://www.blog4work.com/post/2011/06/07/Basic-security-for-ASPNET-applications.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=d9acf7f9-b611-4be8-8be9-2d6fa88471d2</guid>
      <pubDate>Tue, 07 Jun 2011 11:07:00 +0000</pubDate>
      <category>.NET</category>
      <category>Security</category>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=d9acf7f9-b611-4be8-8be9-2d6fa88471d2</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=d9acf7f9-b611-4be8-8be9-2d6fa88471d2</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2011/06/07/Basic-security-for-ASPNET-applications.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=d9acf7f9-b611-4be8-8be9-2d6fa88471d2</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=d9acf7f9-b611-4be8-8be9-2d6fa88471d2</feedburner:origLink></item>
    <item>
      <title>Basic security for ASP.NET applications</title>
      <description>&lt;h2&gt;Part 2&lt;/h2&gt;
&lt;h5&gt;&lt;a href="http://blog4work.com/post/2011/05/10/Basic-security-for-ASPNET-applications.aspx"&gt;See Part 1&lt;/a&gt; (debug, error pages, back-ups, config encryption)&lt;/h5&gt;
&lt;p&gt;I am continuing the series of posts about ASP.NET security and will do a little bit of basic hacking at the end today.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Most of the web applications use passwords. These passwords must not be store as is. Rather consider generating hash code or using one-way encryption. If the database is stolen (like &lt;a href="http://www.guardian.co.uk/technology/blog/2011/apr/29/playstation-network-hackers-credit-cards"&gt;recent incident&lt;/a&gt; with Sony), users passwords cannot be decrypted and thus cannot be used to get access to other systems. It&amp;rsquo;s is a well-known fact, people do not have many different passwords to access different resources&lt;/li&gt;
&lt;li&gt;Credit cards' information is extremely sensitive data, generally it is better to avoid storing such data at all. Otherwise it is a whole new topic and totally paranoid approach to the security (which frankly goes beyond my limited knowledge)&lt;/li&gt;
&lt;li&gt;Production servers must have recent updates and patches, any new security hole is quickly shared and attack scripts are freely distributed. Such scripts are used to perform repeated anonymous attacks&lt;/li&gt;
&lt;li&gt;Do not use "stupid" encryption (see below) &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Modern ASP.NET usually works over plain HTTP where it is possible to use &lt;a href="http://msdn.microsoft.com/en-us/library/ee817643.aspx"&gt;Basic authentication&lt;/a&gt;. Basic authentication sends username and password in a virtually unencrypted way &amp;ndash; &lt;a href="http://en.wikipedia.org/wiki/Base64"&gt;Base64&lt;/a&gt; encoded. To demonstrate its vulnerability I set up a simple ASP.NET MVC application and turned off default &lt;a href="http://msdn.microsoft.com/en-us/library/ee817643.aspx"&gt;Forms authentication&lt;/a&gt;. Then, I quickly googled a Basic authentication sample. First &lt;a href="http://stackoverflow.com/questions/1606991/asp-net-mvc-http-authentication-prompt/1607546#1607546"&gt;link&lt;/a&gt; and I have a controller method that use Basic authentication. This is how GUI looks to the user&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f5%2fa1.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Seems quite secure, so I type in my user name and super-strong long password&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f5%2fa2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Then I hit log in and catch the traffic using &lt;a href="https://www.fiddler2.com/fiddler2/"&gt;Fiddler&lt;/a&gt;. Let's see the request headers.&lt;/p&gt;
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;GET http://localhost:6105/secure HTTP/1.1
Host: localhost:6105
Authorization: Basic QWxpY2U6Skgsd21udmwqNjczMDVAOzt3alVXRVVO&lt;br /&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;All is good, but the user name and the password is encoded in the Authorization header. One don't need to be a magician to get the user name and the password. This functionality has been in Fiddler for a long time.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f5%2fa3.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;And with &lt;a href="http://stackoverflow.com/questions/1606991/asp-net-mvc-http-authentication-prompt/1607546#1607546"&gt;a few lines&lt;/a&gt; of code I do the same in C#&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f5%2fa4.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;So make sure you don't use Basic authentication over plain HTTP, and better disable it in IIS.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.blog4work.com/image.axd?picture=2011%2f5%2fa5.png" alt="" /&gt;&lt;/p&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D4C4A5yY1hDY9C2UVjSeC4VHdUQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D4C4A5yY1hDY9C2UVjSeC4VHdUQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/D4C4A5yY1hDY9C2UVjSeC4VHdUQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D4C4A5yY1hDY9C2UVjSeC4VHdUQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=wN1XE-Xg8u0:EvHDeYqEED8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/wN1XE-Xg8u0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/wN1XE-Xg8u0/post.aspx</link>
      <comments>http://www.blog4work.com/post/2011/05/17/Basic-security-for-ASPNET-applications.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=a5e362e3-7c08-4de8-b54e-cc05b6ecfa63</guid>
      <pubDate>Tue, 17 May 2011 16:03:00 +0000</pubDate>
      <category>.NET</category>
      <category>Security</category>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=a5e362e3-7c08-4de8-b54e-cc05b6ecfa63</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=a5e362e3-7c08-4de8-b54e-cc05b6ecfa63</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2011/05/17/Basic-security-for-ASPNET-applications.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=a5e362e3-7c08-4de8-b54e-cc05b6ecfa63</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=a5e362e3-7c08-4de8-b54e-cc05b6ecfa63</feedburner:origLink></item>
    <item>
      <title>Basic security for ASP.NET applications</title>
      <description>&lt;h2&gt;Part 1&lt;/h2&gt;
&lt;p&gt;Security of itself is a huge topic. Every developer must know how to deal with the most widespread attacks. There are a few tips of how to write and deploy web applications that will make the attack on it less likely to succeed.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Never leave &lt;a href="http://msdn.microsoft.com/en-us/library/e8z01xdh%28v=VS.100%29.aspx"&gt;debug enabled&lt;/a&gt; on a production web site. It greatly affects performance and allows people to see debug information that helps to find a penetration points
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;system.web&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;compilation&lt;/span&gt; &lt;strong&gt;&lt;span class="na"&gt;debug=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;/strong&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;                    
    &lt;span class="nt"&gt;&amp;lt;/system.web&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt; Enable &lt;a href="http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx"&gt;error pages&lt;/a&gt;. Include 404 (resource not found), 500 (internal error) and general error pages. Never display actual error to the user. This information directly exposes the weaknesses of the code. Do exception logging first and use static HTML pages to display errors
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;system.web&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;customErrors&lt;/span&gt; &lt;span class="na"&gt;defaultRedirect=&lt;/span&gt;&lt;span class="s"&gt;"Error.html"&lt;/span&gt; &lt;strong&gt;&lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;"RemoteOnly"&lt;/span&gt;&lt;/strong&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;error&lt;/span&gt; &lt;span class="na"&gt;statusCode=&lt;/span&gt;&lt;span class="s"&gt;"500"&lt;/span&gt; &lt;span class="na"&gt;redirect=&lt;/span&gt;&lt;span class="s"&gt;"InternalError.html"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;error&lt;/span&gt; &lt;span class="na"&gt;statusCode=&lt;/span&gt;&lt;span class="s"&gt;"404"&lt;/span&gt; &lt;span class="na"&gt;redirect=&lt;/span&gt;&lt;span class="s"&gt;"NotFound.html"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/customErrors&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/system.web&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Do not leave back-ups on the web server. They can be easily downloaded.&lt;/li&gt;
&lt;li&gt;As mentioned in [3], things can be downloaded (in contrast to served). Therefore be ready that web.config can be downloaded as it is on the site. Always &lt;a href="http://msdn.microsoft.com/en-us/library/ff647398.aspx"&gt;encrypt&lt;/a&gt; sensitive information, like connection strings and application properties. Do not store user names and passwords in the web.config. This is how my connection strings section looked like before encryption (real values instead of ***)
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;connectionStrings&amp;gt;&lt;/span&gt;
	&lt;span class="nt"&gt;&amp;lt;clear&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;	
	&lt;span class="nt"&gt;&amp;lt;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"connName"&lt;/span&gt; &lt;span class="na"&gt;connectionString=&lt;/span&gt;&lt;span class="s"&gt;"server=***;database=***;
        uid=***;pwd=***"&lt;/span&gt; &lt;span class="na"&gt;providerName=&lt;/span&gt;&lt;span class="s"&gt;"***"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;		
&lt;span class="nt"&gt;&amp;lt;/connectionStrings&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
And here is its actual look right now (user name and pwd are there, go ahead and try extracting that)
&lt;div class="hlcode"&gt;
&lt;div class="syntax"&gt;
&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;connectionStrings&lt;/span&gt; &lt;span class="na"&gt;configProtectionProvider=&lt;/span&gt;&lt;span class="s"&gt;"RsaProtectedConfigurationProvider"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;EncryptedData&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/04/xmlenc#Element"&lt;/span&gt;
  &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/04/xmlenc#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;EncryptionMethod&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/04/xmlenc#tripledes-cbc"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;KeyInfo&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
	&lt;span class="nt"&gt;&amp;lt;EncryptedKey&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/04/xmlenc#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
	  &lt;span class="nt"&gt;&amp;lt;EncryptionMethod&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/04/xmlenc#rsa-1_5"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
	  &lt;span class="nt"&gt;&amp;lt;KeyInfo&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
		&lt;span class="nt"&gt;&amp;lt;KeyName&amp;gt;&lt;/span&gt;Rsa Key&lt;span class="nt"&gt;&amp;lt;/KeyName&amp;gt;&lt;/span&gt;
	  &lt;span class="nt"&gt;&amp;lt;/KeyInfo&amp;gt;&lt;/span&gt;
	  &lt;span class="nt"&gt;&amp;lt;CipherData&amp;gt;&lt;/span&gt;
		&lt;span class="nt"&gt;&amp;lt;CipherValue&amp;gt;&lt;/span&gt;c+7C9X2b2mCtOTk/kUc4+oWnJnQDQiGmTUUV7l/w0YZox/g1mFXadzmR
		WrO6M0rl5v18P5rZlG5Im0JpGKv4jB2TSXc7hedH89TFAWDkNm0t2s1kzY2JcPgJ1d1Gd
		bEYGKgsR04NyONKO/mboIF2YdzkPNdEQuQq3+I=&lt;span class="nt"&gt;&amp;lt;/CipherValue&amp;gt;&lt;/span&gt;
	  &lt;span class="nt"&gt;&amp;lt;/CipherData&amp;gt;&lt;/span&gt;
	&lt;span class="nt"&gt;&amp;lt;/EncryptedKey&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/KeyInfo&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;CipherData&amp;gt;&lt;/span&gt;
	&lt;span class="nt"&gt;&amp;lt;CipherValue&amp;gt;&lt;/span&gt;MOOSknVjny5JIa+yEoSNCS44OVWovoU5RQb7hD0MXCQfBAL2AJp8R8JCuGAEFZSO
	Ms4/4Law0Pmjjkl+TsCBfy4P5UdZMVITtmpAQK5PcQx+sArCm5EcZ1TuIsrbhh8Y1jZKJjyYYsoZ1
	lx+Y2Hhw8nNsuX9t/k8bPXmdfkFAKjP7o9qkC2inASsOGyiKfOFpKpqD9A7c6Kxf/9vV0y5LbuqKF
	VcIrEGQrqXsih9T81yKLnfNxyNTyz5i3mUyvuIgw6LUkUkGY4/NhEhb8bpdPsflzSLdNlmnnwBJZf
	SAiYsL9XpjA==&lt;span class="nt"&gt;&amp;lt;/CipherValue&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/CipherData&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/EncryptedData&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/connectionStrings&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p style="margin-top:15px;"&gt;&lt;em&gt;If you enjoyed this post, make sure you &lt;a style="background:none;padding-right:0px;" href="http://feeds.feedburner.com/OleksiiMandrychenko"&gt;subscribe to my RSS feed&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/E5NrPp3zxfTzjiohnhEnbS6vGHU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E5NrPp3zxfTzjiohnhEnbS6vGHU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/E5NrPp3zxfTzjiohnhEnbS6vGHU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E5NrPp3zxfTzjiohnhEnbS6vGHU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?a=aSUAxNLBhPc:rDCQNh9Ca04:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OleksiiMandrychenko?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OleksiiMandrychenko/~4/aSUAxNLBhPc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/OleksiiMandrychenko/~3/aSUAxNLBhPc/post.aspx</link>
      <comments>http://www.blog4work.com/post/2011/05/10/Basic-security-for-ASPNET-applications.aspx#comment</comments>
      <guid isPermaLink="false">http://www.blog4work.com/post.aspx?id=ff944db7-1ace-4349-a8b4-0057bde80c6d</guid>
      <pubDate>Tue, 10 May 2011 10:15:00 +0000</pubDate>
      <category>.NET</category>
      <category>Architecture</category>
      <category>Security</category>
      <dc:publisher>oleksii</dc:publisher>
      <pingback:server>http://www.blog4work.com/pingback.axd</pingback:server>
      <pingback:target>http://www.blog4work.com/post.aspx?id=ff944db7-1ace-4349-a8b4-0057bde80c6d</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.blog4work.com/trackback.axd?id=ff944db7-1ace-4349-a8b4-0057bde80c6d</trackback:ping>
      <wfw:comment>http://www.blog4work.com/post/2011/05/10/Basic-security-for-ASPNET-applications.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.blog4work.com/syndication.axd?post=ff944db7-1ace-4349-a8b4-0057bde80c6d</wfw:commentRss>
    <feedburner:origLink>http://www.blog4work.com/post.aspx?id=ff944db7-1ace-4349-a8b4-0057bde80c6d</feedburner:origLink></item>
  </channel>
</rss>

