<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Gunnar Peipman's ASP.NET blog</title><link>http://weblogs.asp.net/gunnarpeipman/default.aspx</link><description>ASP.NET, C#, SharePoint, SQL Server and general software development topics.</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/gunnarpeipman" /><feedburner:info uri="gunnarpeipman" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>ASP.NET Web API: Query string based content formatting</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/mmYZ6h9Q_vc/asp-net-web-api-query-string-based-content-formatting.aspx</link><pubDate>Mon, 23 Apr 2012 07:24:09 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8403337</guid><dc:creator>DigiMortal</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8403337</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/04/23/asp-net-web-api-query-string-based-content-formatting.aspx#comments</comments><description>&lt;p&gt;My previous post about &lt;a href="http://www.asp.net/web-api"&gt;Web API&lt;/a&gt; content negotiation showed &lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2012/04/20/asp-net-web-api-extending-content-negotiation-with-new-formats.aspx"&gt;how to add support for new content formats&lt;/a&gt;. As our API may have consumers who prefer query for data using GET requests we have to offer something for these dudes too. In this post I will show you how to make life easier for our Web API consumers by using query string mappings. &lt;/p&gt;  &lt;p&gt;I will use media type mapping and formatter from my previous posting &lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2012/04/20/asp-net-web-api-extending-content-negotiation-with-new-formats.aspx"&gt;Extending content negotiation with new formats&lt;/a&gt;. We have to modify code a little bit because we need also single vCard download. &lt;/p&gt;  &lt;h3&gt;Media type formatter&lt;/h3&gt;  &lt;p&gt;Here is my media type formatter for &lt;a href="http://en.wikipedia.org/wiki/VCard"&gt;vCard&lt;/a&gt;. It supports vCard format for single and multiple results. Multiple results are given to write method as IEnumerable&amp;lt;ContactModel&amp;gt;. &lt;/p&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;hr size="1" /&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;vCardMediaTypeFormatter&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#2b91af"&gt;MediaTypeFormatter&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; vCardMediaTypeFormatter()&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SupportedMediaTypes.Clear();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SupportedMediaTypes.Add(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;MediaTypeHeaderValue&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;text/x-vcard&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;));&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; CanWriteType(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Type&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; type)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; type == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;IEnumerable&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;gt;) ||&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type == &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Task&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; OnWriteToStreamAsync(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Type&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; type, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; value, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Stream&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; stream, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;HttpContentHeaders&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; contentHeaders, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;FormatterContext&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; formatterContext, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TransportContext&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; transportContext)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Task&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Factory.StartNew(() =&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (type == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteVCard((&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;)value, stream);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteVCard((&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;IEnumerable&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;gt;)value, stream);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; WriteVCard(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; model, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Stream&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; stream)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; buffer = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendLine(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;BEGIN:VCARD&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendLine(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;VERSION:2.1&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendFormat(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;N:{0};{1}\r\n&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, model.LastName, model.FirstName);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendFormat(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;FN:{0} {1}\r\n&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, model.FirstName, model.LastName);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendLine(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;END:VCARD&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; writer = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;StreamWriter&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(stream))&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.Write(buffer);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; WriteVCard(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;IEnumerable&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;gt; contactModels, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Stream&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; stream)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; enumerator = contactModels.GetEnumerator();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;while&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (enumerator.MoveNext())&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteVCard(enumerator.Current, stream);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;hr size="1" /&gt;  &lt;h3&gt;Query string mapping&lt;/h3&gt;  &lt;p&gt;Now let’s say to our web application that contacts API support vCard also with GET requests. QueryStringMapping class will help us out. We just add correctly initialized query string mapping to vCard media type formatter.&lt;/p&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;hr size="1" /&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;font color="#000000"&gt; vcard = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;vCardMediaTypeFormatter&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;vcard.MediaTypeMappings.Add(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;VCardMediaTypeMapping&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;());&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;vcard.MediaTypeMappings.Add(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;QueryStringMapping&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;format&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;vcard&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;text/x-vcard&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;));&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;&lt;font style="font-size: 10pt"&gt;GlobalConfiguration&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;.Configuration.Formatters.Add(vcard);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt;&lt;/div&gt;  &lt;p&gt;One thing to notice – we made no changes to our API to add support for vCards and query string mappings. Our API provides only functionality and it doesn’t make any decision about output formatting.&lt;/p&gt;  &lt;h3&gt;Testing query string&lt;/h3&gt;  &lt;p&gt;Now it’s time to test our query string mapping. We don’t mess with AJAX-requests anymore because we can conveniently use out browser. If I want to download contact that has ID value 11 over Web API I have to use the following query string:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;http://my-app/api/contacts/11/?format=vcard&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I will also open IE developer tools to monitor traffic. This is what was returned to browser:&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Single vCard response" border="0" alt="Single vCard response" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-vcard-response-single_7A18849C.png" width="542" height="170" /&gt;&lt;/p&gt;  &lt;p&gt;But now something weird happens – browser asks if we want to open vCard we just requested. Let’s say yes. Here is what you should see on the screen:&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="vCard opened on desktop" border="0" alt="vCard opened on desktop" src="http://weblogs.asp.net/blogs/gunnarpeipman/vcard-on-desktop_2B37BF3D.png" width="540" height="444" /&gt;&lt;/p&gt;  &lt;p&gt;This is good example about how we can use our API in “mixed” mode. We can exchange data between systems but we can also let user to handle some results directly. &lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;Our API can be consumed by different AJAX-clients but now we also made our API easier to use for guys who can easily make GET-requests. By example, PHP guys can use fopen() to make GET-request to our API controller. As we saw we can also use those GET-requests to let end users handle formatted downloads. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8403337" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NumYvIY5mNiYS-c1H8Ja4NEZDdM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NumYvIY5mNiYS-c1H8Ja4NEZDdM/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/NumYvIY5mNiYS-c1H8Ja4NEZDdM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NumYvIY5mNiYS-c1H8Ja4NEZDdM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/mmYZ6h9Q_vc" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/ASP.NET/default.aspx">ASP.NET</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/04/23/asp-net-web-api-query-string-based-content-formatting.aspx</feedburner:origLink></item><item><title>ASP.NET Web API: Extending content negotiation with new formats</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/1g62pIT4Fek/asp-net-web-api-extending-content-negotiation-with-new-formats.aspx</link><pubDate>Fri, 20 Apr 2012 09:11:36 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8398491</guid><dc:creator>DigiMortal</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8398491</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/04/20/asp-net-web-api-extending-content-negotiation-with-new-formats.aspx#comments</comments><description>&lt;p&gt;My &lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2012/04/19/asp-net-web-api-how-content-negotiation-works.aspx"&gt;last post about ASP.NET Web API content negotiation support&lt;/a&gt; gave you basic idea about what content negotiation is and how it works out-of-box. In this post I will show you how to extend &lt;a href="http://www.asp.net/web-api"&gt;Web API&lt;/a&gt; content negotiation support and make Web API to output contact data in &lt;a href="http://en.wikipedia.org/wiki/VCard"&gt;vCard&lt;/a&gt; format.&lt;/p&gt;  &lt;p&gt;In the end of &lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2012/04/19/asp-net-web-api-how-content-negotiation-works.aspx"&gt;my previous post&lt;/a&gt; we asked data in vCard format from Web API and got answer as JSON. No errors, just answer in the format that Web API was able to provide. In this posting we will add support for vCard data and I will introduce you some more concepts related to Web API. Our focus is on getting data back in vCard format.&lt;/p&gt;  &lt;h3&gt;Web API controller&lt;/h3&gt;  &lt;p&gt;One new thing in &lt;a href="http://www.asp.net/mvc/mvc4"&gt;ASP.NET MVC 4&lt;/a&gt; is new controller type that supports Web API. The new type is called &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller(v=vs.108).aspx"&gt;ApiController&lt;/a&gt; and it doesn’t use ActionResults. ActionResults are targeted to wider content output. ApiController works with our model types and therefore it is targeted to API type communication. If it still sounds like mystery to you then take Web API controller as MVC based data service.&lt;/p&gt;  &lt;p&gt;With Web API controller I use simple model for contacts:&lt;/p&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;hr size="1" /&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Id { &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; FirstName { &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; LastName { &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt;&lt;/div&gt;  &lt;p&gt;And here is my Web API controller for contacts:&lt;/p&gt;  &lt;hr size="1" /&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactsController&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#2b91af"&gt;ApiController&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;IEnumerable&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;gt; Get()&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SampleDataProvider&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Contacts;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Get(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; id)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SampleDataProvider&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Contacts.FirstOrDefault(c =&amp;gt; c.Id == id);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Post(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; contact)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SampleDataProvider&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Save(contact);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Put(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; contact)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SampleDataProvider&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Save(contact);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Delete(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; id)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SampleDataProvider&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Delete(id);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt;&lt;/div&gt;  &lt;p&gt;For this posting this controller is enough. Extension point for content formats is not hidden in Web API controllers. What it means? Well, without affecting Web API controllers we can add support for different content formats over time.&lt;/p&gt;  &lt;h3&gt;Media type classes&lt;/h3&gt;  &lt;p&gt;To add vCard support to our Web API we have to use classes that can convert our contact model to vCard and that introduce this format to content negotiation mechanism. I don’t start dissecting internals of content negotiation deeper because it deserver separate posting. In this posting we will build up two media type classes that do the work we need.&lt;/p&gt;  &lt;h3&gt;MediaTypeMapping class&lt;/h3&gt;  &lt;p&gt;Our first class is media type mapper. This class extends MediaTypeMapping – the base class for all media type mappers. In this class we say that vCard format is supported 100% if client accepts this format.&lt;/p&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;hr size="1" /&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;VCardMediaTypeMapping&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#2b91af"&gt;MediaTypeMapping&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; VCardMediaTypeMapping() : &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;text/x-vcard&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; { }          &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; OnTryMatchMediaType(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;HttpResponseMessage&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; response)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (response.RequestMessage.Headers.Accept.Count(m =&amp;gt; m.MediaType == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;text/x-vcard&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;) &amp;gt; 0)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; 1.0;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; 0.0;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; OnTryMatchMediaType(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;HttpRequestMessage&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; request)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;throw&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;NotImplementedException&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt;&lt;/div&gt;  &lt;p&gt;Our next class is media type formatter.&lt;/p&gt;  &lt;h3&gt;MediaTypeFormatter class&lt;/h3&gt;  &lt;p&gt;MediaTypeFormatter is base class for all media type formatters. Media type formatters take object and convert it to format they support. In our case we need media type formatter that takes our contact model and outputs vCard.&lt;/p&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;hr size="1" /&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;vCardMediaTypeFormatter&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#2b91af"&gt;MediaTypeFormatter&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; vCardMediaTypeFormatter()&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SupportedMediaTypes.Clear();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SupportedMediaTypes.Add(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;MediaTypeHeaderValue&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;text/x-vcard&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;));&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; CanWriteType(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Type&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; type)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (type == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;IEnumerable&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;gt;));&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Task&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; OnWriteToStreamAsync(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Type&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; type, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; value, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Stream&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; stream, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;HttpContentHeaders&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; contentHeaders, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;FormatterContext&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; formatterContext, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TransportContext&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; transportContext)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Task&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Factory.StartNew(() =&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WriteVCard((&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;IEnumerable&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;gt;)value, stream);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; WriteVCard(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;IEnumerable&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ContactModel&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;gt; contactModels, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Stream&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; stream)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; enumerator = contactModels.GetEnumerator();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;while&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (enumerator.MoveNext())&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; contactModel = enumerator.Current;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; buffer = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendLine(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;BEGIN:VCARD&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendLine(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;VERSION:2.1&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendFormat(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;N:{0};{1}\r\n&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, contactModel.LastName, contactModel.FirstName);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendFormat(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;FN:{0} {1}\r\n&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, contactModel.FirstName, contactModel.LastName);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.AppendLine(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;END:VCARD&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; writer = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;StreamWriter&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(stream))&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; writer.Write(buffer);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt;&lt;/div&gt;  &lt;p&gt;One thing to notice is CanWriteType() method. Don’t expect that this method is only called to find out if your model types are supported. This method is also called with generic types where your model types appear. By example, support for IEnumerable&amp;lt;ContactModel&amp;gt; is checked before writing out list of contacts. Why ask about collections? The point is simple – there may be types that cannot be listed by just adding converted objects to output stream. &lt;/p&gt;  &lt;h3&gt;Introducing new media type to web application&lt;/h3&gt;  &lt;p&gt;Before testing our application we must introduce to web application that we have support for new media type. This is the point where we put all pieces together and this is why we don’t have to modify our Web API controllers when we add new media formats to our application. Add the following code block to Application_Start method in Global.asax file.&lt;/p&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;hr size="1" /&gt;     &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;font color="#000000"&gt; vcard = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;vCardMediaTypeFormatter&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;vcard.MediaTypeMappings.Add(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;VCardMediaTypeMapping&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;());&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;&lt;font style="font-size: 10pt"&gt;GlobalConfiguration&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;.Configuration.Formatters.Add(vcard);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt; &lt;/div&gt;  &lt;p&gt;What we are doing here is simple. We create new instance of our vCard formatter and add mapping to it that sais that this formatter is able to output vCard. After that we add our formatter to global formatters collection so content negotiation system is able to use it.&lt;/p&gt;  &lt;h3&gt;Testing our application&lt;/h3&gt;  &lt;p&gt;Now it’s time to test our application. I’m using same application as in &lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2012/04/19/asp-net-web-api-how-content-negotiation-works.aspx"&gt;my previous example&lt;/a&gt; where we got the following result when asking vCard from Web API:&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Default response to request for unknown format" border="0" alt="Default response to request for unknown format" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-default-request_28D06C7F.png" width="542" height="225" /&gt;    &lt;br /&gt;&lt;em&gt;Last time we got data back in JSON format. We asked vCard that is not supported OOB.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Now let’s try again and let’s see what is the type of returned content and how it looks:&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Response content type is now vCard" border="0" alt="Response content type is now vCard" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-vcard-request_6E74F69D.png" width="542" height="232" /&gt;    &lt;br /&gt;&lt;em&gt;Content type of response is this time vCard.&lt;/em&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Response is valid vCard now" border="0" alt="Response is valid vCard now" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-vcard-response_3B38BD34.png" width="542" height="222" /&gt;    &lt;br /&gt;&lt;em&gt;Response body is now formatted as vCard.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Okay, here it is – list of contacts as vCard items.&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;Extending Web API content negotiation with support for new media types gives us the way to support clients better and provide them with richer output formats support. Web API controllers are good for building Web API-s and they are very natural to use. Support for content formats is introduced on application global settings level and we don’t have to modify our Web API controllers when new media formatter is added to system. When developing our web based API we put focus on internals of this API and functionalities it provides. Output formatters are implemented separately and used by Web API through content negotiation mechanism.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8398491" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4pMFnE1q1dnC9_xn7tjvEufzHhc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4pMFnE1q1dnC9_xn7tjvEufzHhc/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/4pMFnE1q1dnC9_xn7tjvEufzHhc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4pMFnE1q1dnC9_xn7tjvEufzHhc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/1g62pIT4Fek" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/ASP.NET/default.aspx">ASP.NET</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/04/20/asp-net-web-api-extending-content-negotiation-with-new-formats.aspx</feedburner:origLink></item><item><title>ASP.NET Web API: How content negotiation works?</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/wIQkznJag9k/asp-net-web-api-how-content-negotiation-works.aspx</link><pubDate>Thu, 19 Apr 2012 10:12:50 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8396607</guid><dc:creator>DigiMortal</dc:creator><slash:comments>9</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8396607</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/04/19/asp-net-web-api-how-content-negotiation-works.aspx#comments</comments><description>&lt;p&gt;One cool new feature that ASP.NET &lt;a href="http://www.asp.net/web-api"&gt;Web API&lt;/a&gt; introduces is support for &lt;a href="http://en.wikipedia.org/wiki/Content_negotiation"&gt;content negotiation&lt;/a&gt;. Content negotiation is mechanism that allows web server to serve content in different format using same URL. In this posting I will show you how to use ASP.NET Web API to serve content in JSON and XML formats.&lt;/p&gt;  &lt;h3&gt;How content negotiation works&lt;/h3&gt;  &lt;p&gt;Content negotiation takes place when browser or some other HTTP-client tells server what content formats it accepts. HTTP-client uses Accept header to list all formats it can read. Accept: */* means that client is okay with every content format that server is able to provide. By example, one HTTP-client may accept content in JSON and the other in XML.&lt;/p&gt;  &lt;p&gt;Two possible things can happen as a result of negotiation. Client and server agree with format or they don’t. In latter case server gives content out in its default format and it is up to client to get something done with this answer (log an error, by example). &lt;/p&gt;  &lt;h3&gt;Web API and content negotiation&lt;/h3&gt;  &lt;p&gt;In this posting we will focus on basic content negotiation support offered by ASP.NET Web API. I will show you how to extend Web API content negotiation in later postings. First we take a look how things work out-of-box and then we try to make things work like we want. We will play with built-in features in this posting.&lt;/p&gt;  &lt;p&gt;Let’s suppose we have simple database with contact data and we want to use this database from some other system or from some browser-based AJAX-application. On contact data form I have button that helps me making AJAX-requests to Web API.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ASP.NET Web API test application" border="0" alt="ASP.NET Web API test application" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-testapp_3076F3E5.png" width="540" height="483" /&gt;&lt;/p&gt;  &lt;p&gt;Here is the code behind Get Data button:&lt;/p&gt;  &lt;pre style="line-height: normal; font-family: ; background: white; color: "&gt;&lt;hr size="1" /&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 9.8pt"&gt;$.ajax({
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; type: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;'GET'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font color="#000000"&gt;,&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; url: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;&amp;quot;api/contacts/&amp;quot;&lt;/font&gt;&lt;/span&gt;
&lt;font color="#000000"&gt;});&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;hr size="1" /&gt;&lt;/pre&gt;

&lt;p&gt;This code just asks data from Web API and returns some data. When we click the button we get the following response:&lt;/p&gt;

&lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Content negotiation: Response type is application/json" border="0" alt="Content negotiation: Response type is application/json" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-default-request_20F3E216.png" width="542" height="226" /&gt;&lt;/p&gt;

&lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Content negotiation: JSON response" border="0" alt="Content negotiation: JSON response" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-default-response_5FE562B1.png" width="542" height="218" /&gt;&lt;/p&gt;

&lt;p&gt;Now let’s change the code behind button and let’s specify that we want data back in XML:&lt;/p&gt;

&lt;hr size="1" /&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 9.8pt"&gt;$.ajax({&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;
    &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; beforeSend: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; (req) {
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; req.setRequestHeader(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;&amp;quot;Accept&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;&amp;quot;text/xml&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;);
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; },

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;'GET'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font color="#000000"&gt;,
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; url: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;&amp;quot;api/contacts/&amp;quot;&lt;/font&gt;&lt;/span&gt;

    &lt;br /&gt;&lt;font color="#000000"&gt;});&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;

&lt;hr size="1" /&gt;

&lt;p&gt;Browser sends now Accept header with value text/xml. The answer from server is here:&lt;/p&gt;

&lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Content negotiation: Response is XML" border="0" alt="Content negotiation: Response is XML" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-xml-request_13AD5903.png" width="542" height="222" /&gt;&lt;/p&gt;

&lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Content negotiation: Response data as XML" border="0" alt="Content negotiation: Response data as XML" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-xml-response_3283CCE1.png" width="542" height="216" /&gt;&lt;/p&gt;

&lt;p&gt;Okay, we got data in JSON and XML and both of these formats are widely accepted by tools on different platforms. &lt;/p&gt;

&lt;h3&gt;What if client and server doesn’t agree?&lt;/h3&gt;

&lt;p&gt;Now let’s try out what happens when we ask something that Web API doesn’t support out-of-box. Perfect fit for contacts should be vCard:&lt;/p&gt;

&lt;hr size="1" /&gt; &lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 9.8pt"&gt;$.ajax({&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;
    &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; beforeSend: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; (req) {
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; req.setRequestHeader(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;&amp;quot;Accept&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;&amp;quot;text/x-vcard&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;);
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; },

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; type: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;'GET'&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font color="#000000"&gt;,
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; url: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;&amp;quot;api/contacts/&amp;quot;&lt;/font&gt;&lt;/span&gt;

    &lt;br /&gt;&lt;font color="#000000"&gt;});&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; 

&lt;hr size="1" /&gt;

&lt;p&gt;The result is here:&lt;/p&gt;



&lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Content negotiation: Response type is application/json" border="0" alt="Content negotiation: Response type is application/json" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-default-request_0351E14A.png" width="542" height="226" /&gt;&lt;/p&gt;

&lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Content negotiation: JSON response" border="0" alt="Content negotiation: JSON response" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-conneg-default-response_7030B49D.png" width="542" height="218" /&gt;&lt;/p&gt;

&lt;p&gt;What we got is same JSON we saw in our first experiment. Web API was not able to convert response to vCard and instead of failing or throwing nasty exceptions it gave us our default answer – JSON. &lt;/p&gt;

&lt;h3&gt;
  &lt;p&gt;Conclusion&lt;/p&gt;
&lt;/h3&gt;

&lt;p&gt;Built-in content negotiation helps us server same content in different formats to different clients. Clients have to say what format they expect and as long as Web API is able to convert results to this format the client gets content in format it asked it. Providing more than one content format with our API is only good – it makes other developers way easier to use our API with tools they have and this way our API finds more serious users easily.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8396607" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-xiIN_eyFS-NbCwXV8bHIfY9sP8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-xiIN_eyFS-NbCwXV8bHIfY9sP8/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/-xiIN_eyFS-NbCwXV8bHIfY9sP8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-xiIN_eyFS-NbCwXV8bHIfY9sP8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/wIQkznJag9k" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/ASP.NET/default.aspx">ASP.NET</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/04/19/asp-net-web-api-how-content-negotiation-works.aspx</feedburner:origLink></item><item><title>ASP.NET MVC 4: Short syntax for script and style bundling</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/xo8gm8tJSeY/asp-net-mvc-4-short-syntax-for-script-and-style-bundling.aspx</link><pubDate>Sat, 17 Mar 2012 11:43:06 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8352263</guid><dc:creator>DigiMortal</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8352263</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/03/17/asp-net-mvc-4-short-syntax-for-script-and-style-bundling.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.asp.net/mvc/mvc4"&gt;ASP.NET MVC 4&lt;/a&gt; introduces new methods for style and scripts bundling. I found something brilliant there I want to introduce you. In this posting I will show you how easy it is to include whole folder with stylesheets or JavaScripts to your page.&lt;/p&gt;  &lt;p&gt;I’m using ASP.NET MVC 4 Internet Site template for this example. When we open layout pages located in shared views folder we can see something like this in layout file header:&lt;/p&gt;  &lt;hr size="1" /&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;link&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;href&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;~&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;/&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;Content/css&amp;quot;)&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;link&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;href&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;~&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;/&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;Content/themes/base/css&amp;quot;)&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;            &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;script&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;src&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;~&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;/&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;Scripts/js&amp;quot;)&amp;quot;&amp;gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;script&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt;&lt;/div&gt;  &lt;p&gt;Let’s take the last line and modify it so it looks like this:&lt;/p&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;hr size="1" /&gt;     &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;script&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;src&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;/Scripts/js&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;script&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt; &lt;/div&gt;  &lt;p&gt;After saving the layout page let’s run browser and see what is coming in over network.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ASP.NET MVC 4: Request to scripts folder is legal" border="0" alt="ASP.NET MVC 4: Request to scripts folder is legal" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-mvc-4-script-folder-capture_21DC9ED9.png" width="506" height="179" /&gt;&lt;/p&gt;  &lt;p&gt;As you can see the request to folder ended up with result code 200 which means that request was successful. 327.2KB was received and it is not mark-up size for error page or directory index. Here is the body of response:&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ASP.NET MVC 4: Request to script folder ends with bundled script" border="0" alt="ASP.NET MVC 4: Request to script folder ends with bundled script" src="http://weblogs.asp.net/blogs/gunnarpeipman/aspnet-mvc-4-script-folder-combined_6E34327A.png" width="542" height="227" /&gt;&lt;/p&gt;  &lt;p&gt;I scrolled down to point where one script ends and another one starts when I made the screenshot above. All scripts delivered with ASP.NET MVC project templates start with this green note. So now we can be sure that the request to scripts folder ended up with bundled script and not with something else.&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;Script and styles bundling uses currently by default long syntax where bundling is done through Bundling class. We can still avoid those long lines and use extremely short syntax for script and styles bundling – we just write usual script or link tag and give folder URL as source. ASP.NET MVC 4 is smart enough to combine styles or scripts when request like this comes in.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8352263" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QY4HT_9amPbn0pfiQ5zFwM7Uz8c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QY4HT_9amPbn0pfiQ5zFwM7Uz8c/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/QY4HT_9amPbn0pfiQ5zFwM7Uz8c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QY4HT_9amPbn0pfiQ5zFwM7Uz8c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/xo8gm8tJSeY" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+development/default.aspx">Web development</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/MVC/default.aspx">MVC</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/03/17/asp-net-mvc-4-short-syntax-for-script-and-style-bundling.aspx</feedburner:origLink></item><item><title>Windows 8 Metro development–are they serious?</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/kWtZ1YmVjO0/windows-8-metro-development-are-they-serious.aspx</link><pubDate>Sun, 11 Mar 2012 20:27:51 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8340803</guid><dc:creator>DigiMortal</dc:creator><slash:comments>20</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8340803</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/03/11/windows-8-metro-development-are-they-serious.aspx#comments</comments><description>&lt;p&gt;When &lt;a href="http://windows.microsoft.com/en-US/windows-8/consumer-preview"&gt;Windows 8 Consumer Preview&lt;/a&gt; came out I downloaded it same day and installed on virtual machine. Of course, I also installed new Visual Studio 11 beta on it. Then I started playing with metro applications and I am very confused and a little bit disappointed about how broken and limited everything will be on WinRT right now. Here are some of my thoughts.&lt;/p&gt;  &lt;h3&gt;Metro apps are extremely buggy&lt;/h3&gt;  &lt;p&gt;Over years I have seen no such a pile of bugs in Microsoft product that should be Release Candidate (RC). Windows 7 beta and RC were brilliant. They worked like charm and after couple of weeks with beta I started using it as my main operating system. Okay, there were some small crashed and BSOD-s but still it was extremely stable.&lt;/p&gt;  &lt;p&gt;Now Windows 8 is different. Everything else seems to work almost normally but when we start with Metro then everything falls down. Some of my findings are here:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Suddenly with reason I was not able to identify videos doesn’t play normally in Metro applications. Audio stream is played normally but picture is black. If I run Windows Media Player – this is usual Windows application – on same machine and try to watch videos then everything works fine.&lt;/li&gt;    &lt;li&gt;Problem with video playback exists also on IE10. It doesn’t matter if I run it from desktop or from new start screen. It worked before for some days and then problems started. By the way – Build application fails exactly same way.&lt;/li&gt;    &lt;li&gt;Couple of days more and IE10 doesn’t open from new start screen anymore. It opens for a moment and then shuts down. Best it can do is to stay open and show blue starting screen but nothing more.&lt;/li&gt;    &lt;li&gt;Other Metro apps almost like work. Sometimes they crash, sometimes they are extremely slow and doesn’t react to new mouse gestures. My virtual machine has enough resources to run Windows 8 normally.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I have no good idea what is going on behind curtains or why Microsoft released so buggy version of Windows 8 but considering that they have time about four months to develop + one month to test and debug Windows 8, I am not very sure how bright will be its launch. I mean third-parties need also time to build their apps and test them on stable versions. Thinking this way I am not very sure how competition with Apple iPads will look like or what will be the result.&lt;/p&gt;  &lt;h3&gt;WinRT API-s: Another bad surprise&lt;/h3&gt;  &lt;p&gt;Now, let’s go and try to build something useful for my business. Let’s build Metro application that communicates with web services. Is it possible to make something work that uses web services built on previous versions of ASP.NET? Is it possible to use NTLM? Is it possible to use SSL with basic authentication? No, guys, forget it for now. Here are some of my really bad findings:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Support for ASP.NET web services is completely broken if you need some more advanced features like authentication.&lt;/li&gt;    &lt;li&gt;NTLM authentication doesn’t work. What is more annoying is one blog post I read where one of Microsoft dudes told about Windows authentication in Metro something like this: we don’t plan to support it but if people ask then there will be some support for Windows authentication. Okay, guys, you just made head shot to SharePoint, Office 365 and Dynamix CRM. &lt;/li&gt;    &lt;li&gt;I reconfigured my web services so they use basic authentication. And guess what – again same errors about how communication on socket level fails. When I enabled anonymous access to web services then suddenly I was able to communicate with them. And with me, of course, the whole world.&lt;/li&gt;    &lt;li&gt;There is no way to reference libraries built on working versions of .NET. If you have libraries that do something useful then you have to create special Metro version of them. So you end up with two parallel code-bases that do exactly the same thing. Yes, you are just human being and therefore the worst machine to handle duplications but this is the way how you must live with your Metro applications right now.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I’m not very sure why Windows 8 and Metro development is such a bad mess. I don’t know why it is impossible to build secure business applications on Metro. I really hope that Microsoft is in hurry with many developments on Windows 8 and Consumer Preview was just one unhappy nightly build that was pushed to market. If things are not going way better for a time when stable version is made public then first and most important battle for market is lost for Microsoft.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8340803" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Tq30h1D7G6_6lVtEIeAa1RTF7CA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Tq30h1D7G6_6lVtEIeAa1RTF7CA/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/Tq30h1D7G6_6lVtEIeAa1RTF7CA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Tq30h1D7G6_6lVtEIeAa1RTF7CA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/kWtZ1YmVjO0" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Windows/default.aspx">Windows</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/03/11/windows-8-metro-development-are-they-serious.aspx</feedburner:origLink></item><item><title>Creating gadget-like blocks for Windows Home Server 2011 web add-in user interface</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/vZZBOPT0FRs/creating-gadget-like-blocks-for-windows-home-server-2011-web-add-in-user-interface.aspx</link><pubDate>Sat, 25 Feb 2012 10:59:31 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8313246</guid><dc:creator>DigiMortal</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8313246</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/02/25/creating-gadget-like-blocks-for-windows-home-server-2011-web-add-in-user-interface.aspx#comments</comments><description>&lt;p&gt;To keep user interface of your Windows Home Server 2011 (WHS) web add-in similar to other parts of UI you may need styled blocks like shown on WHS web interface home page. In this post I will show you HTML mark-up and CSS you need to create your own gadget block.&lt;/p&gt;  &lt;h3&gt;Example of gadget-like block&lt;/h3&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="WHS YouTube help block" border="0" alt="WHS YouTube help block" align="right" src="http://weblogs.asp.net/blogs/gunnarpeipman/whsyoutube-help-gadget_5F7C0E50.png" width="301" height="210" /&gt;Here is the example of custom gadget-like block from the UI of my &lt;a href="http://whsyoutube.codeplex.com/"&gt;WHS YouTube Downloader&lt;/a&gt;. There is no out-of-box control or some other UI component you can use on different pages that renders you simple area to show some custom content.&lt;/p&gt;  &lt;p&gt;I extracted mark-up and styles of gadget and made my own fixes to make block look nice. Although I’m not very happy because of massive use of tables my solution still works and it is simple to use.&lt;/p&gt;  &lt;h3&gt;Mark-up for gadget-like block&lt;/h3&gt;  &lt;p&gt;Here is the HTML mark-up for gadget-like block.&lt;/p&gt;  &lt;hr size="1" /&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 9.8pt"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetBoxBase Homepage-GadgetBox My-Sidebar&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;table&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetTable&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tbody&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetTopRow&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetTLCell&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetTMCell single-line&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;a&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;title&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Title link description&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Title&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;a&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetTRCell&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tbody&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;table&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;table&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetTable&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tbody&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetMiddleRow&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetMLCell&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetMCell&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;My-Gadget-Content&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Content here        &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetMRCell&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tbody&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;table&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;table&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetTable&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tbody&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetBottomRow&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetBLCell&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;/&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetBMCell&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;Homepage-GadgetBRCell&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;/&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tbody&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;table&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;div&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 9.8pt" color="#0000ff"&gt;&amp;gt;        &lt;hr size="1" /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;  &lt;p&gt;You can wrap this box to some base user control and output all container mark-up around inherited controls when render method is called.&lt;/p&gt;  &lt;h3&gt;Fixing styles&lt;/h3&gt;  &lt;p&gt;To get the gadget-like block to be rendered correctly we need some additional styles. Looking at source of WHS home page we can see that all gadgets organize their own content containers styling. Here are styles I use for gadget-like block shown above.&lt;/p&gt;  &lt;hr size="1" /&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 9.8pt"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;style&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff"&gt;&lt;span style="color: "&gt;=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;.youTubeDownloaderButton&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;background-color&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;rgb(220,227,168)&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;border&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;1px&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;solid&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;green&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;color&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;black&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;        &lt;br /&gt;}&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;.My-Gadget-Content&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;margin-top&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;12px&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;margin-right&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;12px&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;margin-bottom&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;0px&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;margin-left&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;12px&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&amp;#160;&amp;#160; &lt;br /&gt;}         &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;.My-Gadget-Content&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;li&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;margin-left&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;: &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;-20px&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;        &lt;br /&gt;}         &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;tr.Homepage-GadgetTopRow&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;cursor&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;default&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&amp;#160;&amp;#160; &lt;br /&gt;}         &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;.My-Sidebar&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;float&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;right&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;width&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;300px&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font color="#000000"&gt;;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;}         &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;style&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 9.8pt" color="#0000ff"&gt;&amp;gt;        &lt;hr size="1" /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;  &lt;p&gt;You can create your own CSS file for style fixes like this and provide with your add-in installer.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8313246" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WJMF9YsoBaM49oV1zoD290B3BnM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WJMF9YsoBaM49oV1zoD290B3BnM/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/WJMF9YsoBaM49oV1zoD290B3BnM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WJMF9YsoBaM49oV1zoD290B3BnM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/vZZBOPT0FRs" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Windows+Home+Server/default.aspx">Windows Home Server</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/02/25/creating-gadget-like-blocks-for-windows-home-server-2011-web-add-in-user-interface.aspx</feedburner:origLink></item><item><title>Writing simple named pipes server in C#</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/_HSI3EV6lK0/writing-simple-named-pipes-server-in-c.aspx</link><pubDate>Fri, 24 Feb 2012 11:04:17 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8310969</guid><dc:creator>DigiMortal</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8310969</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/02/24/writing-simple-named-pipes-server-in-c.aspx#comments</comments><description>&lt;p&gt;I solved a little problem last night when playing with named pipes. I created named pipe that writes all output to file. Named pipe is opened for all users in machine. In this posting I will show you simple class that works as pipe server.&lt;/p&gt;  &lt;p&gt;In .NET Framework languages we can use &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx"&gt;System.IO.Pipes&lt;/a&gt; namespace classes to work with named pipes. Here is my simple pipe server that writes all client output to file.&lt;/p&gt;  &lt;hr size="1" /&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#2b91af"&gt;MyPipeServer&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Run()&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; sid = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SecurityIdentifier&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;WellKnownSidType&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.WorldSid, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; rule = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;PipeAccessRule&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(sid, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;PipeAccessRights&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.ReadWrite,           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;AccessControlType&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Allow);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; sec = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;PipeSecurity&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sec.AddAccessRule(rule);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;NamedPipeServerStream&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; pipeServer = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;NamedPipeServerStream             &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;testpipe&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;PipeDirection&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.InOut, 100,            &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PipeTransmissionMode&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Byte, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;PipeOptions&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.None, 0, 0, sec))&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pipeServer.WaitForConnection();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; read = 0;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; bytes = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;byte&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;[4096];&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; file=&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;File&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Open(@&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;c:\tmp\myfile.dat&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;FileMode&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Create))&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;while&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; ((read = pipeServer.Read(bytes, 0, bytes.Length)) &amp;gt; 0)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write(bytes, 0, read);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Flush();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt; &lt;/div&gt;  &lt;p&gt;Real-life pipe scenarios are usually more complex but this simple class is good to get things running like they should be. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8310969" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-Dk7ib2wYtE6ezMH0wtEujqkfmY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-Dk7ib2wYtE6ezMH0wtEujqkfmY/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/-Dk7ib2wYtE6ezMH0wtEujqkfmY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-Dk7ib2wYtE6ezMH0wtEujqkfmY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/_HSI3EV6lK0" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/02/24/writing-simple-named-pipes-server-in-c.aspx</feedburner:origLink></item><item><title>Setting up Windows Home Server 2011 development environment</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/IANphvNtN7Q/setting-up-windows-home-server-2011-development-environment.aspx</link><pubDate>Thu, 23 Feb 2012 10:46:29 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8308041</guid><dc:creator>DigiMortal</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8308041</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/02/23/setting-up-windows-home-server-2011-development-environment.aspx#comments</comments><description>&lt;p&gt;For &lt;a href="http://windows.microsoft.com/en-US/windows/products/windows-home-server"&gt;Windows Home Server 2011&lt;/a&gt; (WHS) there are new API-s available you can use to extend WHS web and desktop interfaces. Actually there is no Windows Home Server SDK anymore – now we have common &lt;a href="http://msdn.microsoft.com/en-us/library/gg513988.aspx"&gt;Windows Server Solutions (WSS) SDK&lt;/a&gt; that works also for &lt;a href="http://www.microsoft.com/en-us/server-cloud/windows-small-business-server/default.aspx"&gt;Windows Small Business Server&lt;/a&gt;, &lt;a href="http://www.microsoft.com/en-us/server-cloud/windows-server/storage-server.aspx"&gt;Windows Storage Server&lt;/a&gt; and &lt;a href="http://www.microsoft.com/windows/multipoint/default.aspx"&gt;Windows MultiPoint Server&lt;/a&gt;. In this posting I will show you how to create development environment for Windows Home Server 2011.&lt;/p&gt;  &lt;h3&gt;Step by step guide&lt;/h3&gt;  &lt;p&gt;To set up development environment for WHS follow the steps given below.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Create new virtual machine for WHS2011.&lt;/strong&gt; You can use whatever virtualization solution you like (Hyper-V, VMWare Player, VirtualBox). Make sure to give at least 160GB HDD and 2GB of RAM to WHS2011 image. This is needed only during installation. You can later change the size of virtual HDD and then resize it to smaller size.      &lt;br /&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Install WHS2011&lt;/strong&gt;. Nothing special here, just follow the installation steps (next-next-next).      &lt;br /&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Configure WHS2011. &lt;/strong&gt;Configure RDC access to WHS2011. It faster and way better than those slow and weird sized windows that virtualization software offers you.       &lt;br /&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Install Visual Studio 2010.&lt;/strong&gt; Install VS2010 with SP1. Also make sure to apply all important updates to WHS2011 and VS2010.      &lt;br /&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Download and install WSS SDK.&lt;/strong&gt; Now download and install &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=11140"&gt;Windows Server Solutions SDK&lt;/a&gt;.       &lt;br /&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Create project templates folder for VS2011.&lt;/strong&gt; Open Windows Explorer and move to folder C:\Users\&amp;lt;MY USERNAME&amp;gt;\Documents\Visual Studio 2010\Templates\ProjectTemplates\Visual C#. Create subfolder names as Windows Server Solution.      &lt;br /&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Copy WSS templates.&lt;/strong&gt; Move to folder C:\Program Files (x86)\Microsoft SDKs\Windows Server Solutions\6.1\Templates and copy all subfolders to your VS2010 templates directory you created before.      &lt;br /&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Check if templates are there.&lt;/strong&gt; Run VS2010 and open new project dialog. See if all WSS templates are there.      &lt;br /&gt;      &lt;br /&gt;&lt;a href="http://weblogs.asp.net/blogs/gunnarpeipman/wss-vs2010-projects_4A06E679.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Windows Server Solutions templates" border="0" alt="Windows Server Solutions templates" src="http://weblogs.asp.net/blogs/gunnarpeipman/wss-vs2010-projects_thumb_21880465.png" width="500" height="285" /&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;If you did everything right then you should see Windows Server Solutions folder in new project dialog of VS2010. RWW is folder for web add-ins. I’m not sure why the name like this but you can change it if you wish.&lt;/p&gt;  &lt;p&gt;That’s it. Now we have virtual machine for Windows Home Server development. You can find more information from &lt;a href="http://msdn.microsoft.com/en-us/library/gg513988.aspx"&gt;Windows Server Solutions SDK site&lt;/a&gt; and from &lt;a href="http://www.wegotserved.com/"&gt;We Got Served&lt;/a&gt; – site dedicated to Windows Home Server. To get one not-so-easy example take a look at my &lt;a href="http://whsyoutube.codeplex.com/"&gt;WHS YouTube Downloader&lt;/a&gt; – it is open-source project hosted in Codeplex. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8308041" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SznOlmRLBWW72pnZfGA8ExzUieA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SznOlmRLBWW72pnZfGA8ExzUieA/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/SznOlmRLBWW72pnZfGA8ExzUieA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SznOlmRLBWW72pnZfGA8ExzUieA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/IANphvNtN7Q" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Windows+Home+Server/default.aspx">Windows Home Server</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/02/23/setting-up-windows-home-server-2011-development-environment.aspx</feedburner:origLink></item><item><title>Just released: WHS YouTube Downloader beta</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/9ZxVpcbqTNE/just-released-whs-youtube-downloader-beta.aspx</link><pubDate>Wed, 22 Feb 2012 08:03:52 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8304810</guid><dc:creator>DigiMortal</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8304810</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/02/22/just-released-whs-youtube-downloader-beta.aspx#comments</comments><description>&lt;p&gt;I just released to Codeplex the first beta of my Windows Home Server 2011 web add-in called &lt;a href="http://whsyoutube.codeplex.com/"&gt;WHS YouTube Downloader&lt;/a&gt;. Log in to WHS web interface, add YouTube videos to download queue, do something useful while home server downloads videos and watch them later when downloads are done. Sounds easy? Well, okay, it is easy!&lt;/p&gt;  &lt;h2&gt;Features&lt;/h2&gt;  &lt;p&gt;Currently there are implemented following features:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;web add-in has form integrated to WHS web interface (yes, it’s done using official tools, no hacks), &lt;/li&gt;    &lt;li&gt;there is home page gadget that shows contents of download queue, &lt;/li&gt;    &lt;li&gt;users can choose shared media library where videos are saved, &lt;/li&gt;    &lt;li&gt;users can select video format before file download, &lt;/li&gt;    &lt;li&gt;download progress is shown on downloader page, &lt;/li&gt;    &lt;li&gt;file downloads are parallel. &lt;/li&gt; &lt;/ul&gt;  &lt;p align="center"&gt;&lt;a href="http://weblogs.asp.net/blogs/gunnarpeipman/whsyoutube-beta_04058420.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WHS YouTube Downloader" border="0" alt="WHS YouTube Downloader" src="http://weblogs.asp.net/blogs/gunnarpeipman/whsyoutube-beta_thumb_493DDB49.png" width="542" height="270" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;em&gt;Click on image to see it at original size.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Some limitations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;only shared media libraries of Windows Home Server are supported as download folders, &lt;/li&gt;    &lt;li&gt;currently all communication between web interface and downloader service host uses port &lt;strong&gt;8732&lt;/strong&gt;, so make sure this port is not used by any other program or service, &lt;/li&gt;    &lt;li&gt;files can be saved in formats that YouTube offers – there is no transcoder that converts between file formats. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I plan to release first stable version during next two weeks. Meanwhile I appreciate all testing feedback and feature requests. And, of course, I will update product documentation to better support home users who are not IT gurus. :)&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8304810" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ybh0C2QacmUp-uCLbt4ZroFgcZE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ybh0C2QacmUp-uCLbt4ZroFgcZE/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/ybh0C2QacmUp-uCLbt4ZroFgcZE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ybh0C2QacmUp-uCLbt4ZroFgcZE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/9ZxVpcbqTNE" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Software/default.aspx">Software</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Windows+Home+Server/default.aspx">Windows Home Server</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/02/22/just-released-whs-youtube-downloader-beta.aspx</feedburner:origLink></item><item><title>Windows Home Server needs new licensing scheme</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/wdKBQoZV0_c/windows-home-server-needs-new-licensing-scheme.aspx</link><pubDate>Tue, 17 Jan 2012 15:04:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8260462</guid><dc:creator>DigiMortal</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8260462</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/01/17/windows-home-server-needs-new-licensing-scheme.aspx#comments</comments><description>&lt;p&gt;Fast development of technology and quickly spreading fast internet with new devices and technology open new ways for us to connect our homes with other family members. Windows Home Server is product that needs heavy refresh and one thing that Windows Home Server team must take seriously is changing current very limited licensing scheme. Here is the overview of situation and what needs to be done to get better licensing that fits for families better today.&lt;/p&gt;  &lt;h3&gt;Family is connected now&lt;/h3&gt;  &lt;p&gt;One main point that is changed over time: &lt;strong&gt;our houses are connected better than before.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;By example, my brother has some computers at home, my cousin has some computers at home, my girlfriend parents have some computers at home etc. Homes have good connections now and more people are able to stay connected with my home. People I’m talking about are also called my family. &lt;/p&gt;  &lt;p&gt;For some people in family all this computer stuff is complex and they need something simple to share their media with others and to see what others have put online. This is perfect scenario for Windows Home Server. &lt;/p&gt;  &lt;p&gt;Why should we all have separated accounts to keep and share same media we all like? Why should we exchange files over chat clients? Why we should use public services that may come and go? We usually don’t share many aspects of our lives with public space. This is where we want one central for family – something that is easy for everyone to use.&lt;/p&gt;  &lt;h3&gt;Better and cheaper hardware&lt;/h3&gt;  &lt;p&gt;The other thing is hardware – it is getting more and more powerful. I have 2TB of mirrored disk space available in my home server. It’s huge space for me and I can extend it. If I discard mirroring then my home server may have up to 8TB of free space. Believe me, it’s huge task for me and my family to get this 2TB of space filled with something valuable. &lt;/p&gt;  &lt;p&gt;I am sure that during next couple of years way more storage will be available to buy for same price. Also other hardware is getting cheaper and cheaper. And also web connections getting better and better. It means that we have more and more devices in our homes that we want to connect.&lt;/p&gt;  &lt;h3&gt;Big picture&lt;/h3&gt;  &lt;p&gt;This is where we are standing now:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;we have good internet connections at our homes,&lt;/li&gt;    &lt;li&gt;we are able to but powerful hardware that we are not able to fully use with only small subset of our family,&lt;/li&gt;    &lt;li&gt;kids and their parents know way more about computers than before,&lt;/li&gt;    &lt;li&gt;we have different devices we use to browse the web and communicate with each other,&lt;/li&gt;    &lt;li&gt;still family IT-guy is usually almost the only one who manages devices of more than one home,&lt;/li&gt;    &lt;li&gt;families produce way more multimedia than before and members of family want to share their media between each other,&lt;/li&gt;    &lt;li&gt;it is also good to take control over backups and maintenance of all family computers so also other homes that form my family have their computer safe and updated.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As you can see, situation is changed.&lt;/p&gt;  &lt;h3&gt;New licensing model&lt;/h3&gt;  &lt;p&gt;New licensing model for Windows Home Server should be package based like it is for Windows Server. Base package should be 10 licenses as it is right now. But there must be option to buy more licenses. Five license packs should be fine. It it is possible to buy one license at time it is also okay. It may even be better because then we can but exactly the number of licenses we need.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8260462" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iztM4gTyAxkauD8SCHm2YdulaP0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iztM4gTyAxkauD8SCHm2YdulaP0/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/iztM4gTyAxkauD8SCHm2YdulaP0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iztM4gTyAxkauD8SCHm2YdulaP0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/wdKBQoZV0_c" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Windows+Home+Server/default.aspx">Windows Home Server</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/01/17/windows-home-server-needs-new-licensing-scheme.aspx</feedburner:origLink></item><item><title>Creating dynamic pivot reports on SQL Server</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/LByf0a5YOB4/creating-dynamic-pivot-reports-on-sql-server.aspx</link><pubDate>Mon, 02 Jan 2012 10:08:54 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8207905</guid><dc:creator>DigiMortal</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8207905</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2012/01/02/creating-dynamic-pivot-reports-on-sql-server.aspx#comments</comments><description>&lt;p&gt;In one of my current projects I have some pivot reports that show count of issues in different states. Grouping depends on report. States are dynamic – admins can define new states and save them to states table. This means that I cannot hardcode names of states to queries. Instead I need dynamic pivots. In this posting I will show you how to write reporting procedures that offer dynamic pivoting capabilities.&lt;/p&gt;  &lt;p&gt;The trick here is to create dynamic list of all possible states and use this list in dynamically generated pivot query. Here is fragment of my database, names of tables should be self-describing.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="MSSQL pivot reports: Tables" border="0" alt="MSSQL pivot reports: Tables" src="http://weblogs.asp.net/blogs/gunnarpeipman/mssql-pivot-tables_1A6E5989.png" width="368" height="208" /&gt;&lt;/p&gt;  &lt;p&gt;Here’s the query:&lt;/p&gt;  &lt;hr size="1" /&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 9.8pt"&gt;CREATE&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;PROCEDURE&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;XSP_REPORT_REQUESTS_BY_CATEGORY&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;BEGIN&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;        &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;DECLARE&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;@PivotColumnHeaders&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;VARCHAR&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;MAX&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;SELECT&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;@PivotColumnHeaders&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;COALESCE&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;@PivotColumnHeaders&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;+&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;',['&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;+&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;cast&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;STATUS_NAME&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;as&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;varchar&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;+&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;']'&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;,&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;'['&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;+&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;cast&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;STATUS_NAME&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;as&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;varchar&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;)+&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;']'&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;FROM&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;DOC_STATUSES&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;        &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;DECLARE&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;@PivotTableSQL&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;NVARCHAR&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;MAX&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;@PivotTableSQL&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;N' &lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;SELECT &lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;FROM&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;(SELECT &lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160; dc.CATEGORY_NAME AS [Category],&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160; ds.STATUS_NAME As name,&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160; req.ID as ID&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;FROM&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160; REQUESTS_FOR_PROPOSAL req&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160; INNER JOIN DOC_STATUSES ds ON&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; req.STATUS_ID = ds.ID         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;INNER JOIN DOC_CATEGORIES dc ON&lt;/font&gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;req.CATEGORY_ID = dc.ID&lt;/font&gt;&lt;/span&gt;       &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;) AS Source&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;PIVOT( &lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160; COUNT(ID)&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160; FOR name IN ('&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;+&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;@PivotColumnHeaders&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;+&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;')&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;) AS PIVOTTBL'&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;        &lt;br /&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;EXECUTE&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008080"&gt;@PivotTableSQL&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;&lt;/span&gt;      &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 9.8pt"&gt;&lt;font color="#000000"&gt;        &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 9.8pt" color="#0000ff"&gt;END       &lt;hr size="1" /&gt; &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;  &lt;p&gt;Output of this reporting procedure is table like this:&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="MSSQL pivot report: Results" border="0" alt="MSSQL pivot report: Results" src="http://weblogs.asp.net/blogs/gunnarpeipman/mssql-pivot-results_2048FD22.png" width="459" height="104" /&gt;&lt;/p&gt;  &lt;p&gt;I don’t like this dynamic SQL in stored procedure because it can be hard to debug. But this far this solution works fine for me and I can always use views to get more complex querying logic out from reporting procedures.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8207905" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fvfjY0ScCXwQwa9iFtO415Xu1Nw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fvfjY0ScCXwQwa9iFtO415Xu1Nw/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/fvfjY0ScCXwQwa9iFtO415Xu1Nw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fvfjY0ScCXwQwa9iFtO415Xu1Nw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/LByf0a5YOB4" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Databases/default.aspx">Databases</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2012/01/02/creating-dynamic-pivot-reports-on-sql-server.aspx</feedburner:origLink></item><item><title>ASP.NET MVC: Helper method to display date ranges</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/eluzNVjsIyE/asp-net-mvc-helper-method-to-display-date-ranges.aspx</link><pubDate>Sat, 31 Dec 2011 10:53:34 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8200037</guid><dc:creator>DigiMortal</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8200037</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2011/12/31/asp-net-mvc-helper-method-to-display-date-ranges.aspx#comments</comments><description>&lt;p&gt;I have events web site where I want to show events start and end time to visitors. I wrote simple extension method called DisplayTimeRange() to display event time range on user-friendly manner. My goal is to show times as 01.01.2012 10:00 – 14:00 and 01.01.2012 15:00 – 01.03.2012 18:00. It’s practically displaying time ranges is shortest possible way. In this posting I will show you how to do it using extension method.&lt;/p&gt;  &lt;p&gt;For events that happen only on one date I want output like this:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="DisplayDateRange(): Event covers only one date" border="0" alt="DisplayDateRange(): Event covers only one date" src="http://weblogs.asp.net/blogs/gunnarpeipman/displaydaterange-short_750433B7.png" width="520" height="29" /&gt;&lt;/p&gt;  &lt;p&gt;For events that cover more than one date I want output like this:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="DisplayDateRange(): Event covers more than one date" border="0" alt="DisplayDateRange(): Event covers more than one date" src="http://weblogs.asp.net/blogs/gunnarpeipman/displaydaterange-long_1AF9E40E.png" width="520" height="29" /&gt;&lt;/p&gt;  &lt;p&gt;Here is my extension method for HtmlHelper. I called it DisplayDateRange and currently it generates output like shown above (styling depends on you).&lt;/p&gt;  &lt;hr size="1" /&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;MvcHtmlString&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; DisplayDateRange(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;HtmlHelper&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; helper, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; from, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; to)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; buffer = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(100);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; buffer.Append(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;@&amp;quot;&amp;lt;div class=&amp;quot;&amp;quot;dateRange&amp;quot;&amp;quot;&amp;gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; buffer.Append(from.ToShortDateString());&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; buffer.Append(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot; &amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; buffer.Append(from.ToShortTimeString());&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; buffer.Append(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot; - &amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (from.Date == to.Date)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.Append(to.ToShortTimeString());&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.Append(to.ToShortDateString());&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.Append(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot; &amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; buffer.Append(to.ToShortTimeString());&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; buffer.Append(&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;MvcHtmlString&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(buffer.ToString());&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 10pt" color="#000000"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;    &lt;hr size="1" /&gt; &lt;/div&gt;  &lt;p&gt;This extension method can be easily extended also to nullable DateTime types if you need it.&lt;/p&gt;  &lt;p&gt;DateTime formatting may seem not so perfect but it was the only way how to avoid weird long date and time outputs with seconds (we really don’t need seconds here). If you have good idea about how to format dates shorter in code then feel free to drop me a comment here.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8200037" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5pGFBJy3zpaC0BF_ujoQai-jhyk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5pGFBJy3zpaC0BF_ujoQai-jhyk/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/5pGFBJy3zpaC0BF_ujoQai-jhyk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5pGFBJy3zpaC0BF_ujoQai-jhyk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/eluzNVjsIyE" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/MVC/default.aspx">MVC</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2011/12/31/asp-net-mvc-helper-method-to-display-date-ranges.aspx</feedburner:origLink></item><item><title>Windows Azure error: An unsupported response was received. The response header 'MSDeploy.Response' was '' but 'v1' was expected.</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/lXD3E4zRKTc/windows-azure-error-an-unsupported-response-was-received-the-response-header-msdeploy-response-was-but-v1-was-expected.aspx</link><pubDate>Sat, 31 Dec 2011 10:20:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8199964</guid><dc:creator>DigiMortal</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8199964</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2011/12/31/windows-azure-error-an-unsupported-response-was-received-the-response-header-msdeploy-response-was-but-v1-was-expected.aspx#comments</comments><description>&lt;P&gt;You may get the following error when deploying your web application from Visual Studio to Windows Azure using WebDeploy:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Remote agent &lt;/STRONG&gt;&lt;STRONG&gt;could not be contacted.&amp;nbsp;Make sure the remote agent service is installed and started on the target computer. &lt;BR&gt;&lt;BR&gt;An unsupported response was received. The response header 'MSDeploy.Response' was '' but 'v1' was expected. &lt;BR&gt;The request was aborted: The request was canceled. &lt;BR&gt;COM object that has been separated from its underlying RCW cannot be used.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;If you monitor your HTTPS traffic you can find out that response to WebDeploy request was error 401 (not authenticated). Although I don’t know what is the exact source of this error there is simple solution: close Visual Studio and then run it again. Now you should be able to deploy your application.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8199964" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Bip2eOxHLEGBFMznChGmVhc4dTQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bip2eOxHLEGBFMznChGmVhc4dTQ/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/Bip2eOxHLEGBFMznChGmVhc4dTQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bip2eOxHLEGBFMznChGmVhc4dTQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/lXD3E4zRKTc" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Azure/default.aspx">Azure</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2011/12/31/windows-azure-error-an-unsupported-response-was-received-the-response-header-msdeploy-response-was-but-v1-was-expected.aspx</feedburner:origLink></item><item><title>The selected database contains foreign keys that create a cycle</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/aj8eBdZjF9w/the-selected-database-contains-foreign-keys-that-create-a-cycle.aspx</link><pubDate>Fri, 30 Dec 2011 09:41:17 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8195987</guid><dc:creator>DigiMortal</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8195987</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2011/12/30/the-selected-database-contains-foreign-keys-that-create-a-cycle.aspx#comments</comments><description>&lt;p&gt;You may get the following error when creating data scripts with MSSQL 2008: &lt;strong&gt;The selected database contains foreign keys that create a cycle. Publishing data only is not supported for databases with cyclical foreign key relationships&lt;/strong&gt;. This problem is caused by self-referencing tables and it is given even if you don’t export data from one of such tables. Here is simple and very dirty solution.&lt;/p&gt;  &lt;p&gt;If some of tables in the list of exported tables has circular references or some of these tables refers to table with circular references then this error occurs. As a very dirty workaround you can temporarily remove circular foreign keys and create them later again. Not very nice solution but works for me.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8195987" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lUj0LdVe1y8HxEGp2-EjPCP9r4A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lUj0LdVe1y8HxEGp2-EjPCP9r4A/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/lUj0LdVe1y8HxEGp2-EjPCP9r4A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lUj0LdVe1y8HxEGp2-EjPCP9r4A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/aj8eBdZjF9w" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Databases/default.aspx">Databases</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2011/12/30/the-selected-database-contains-foreign-keys-that-create-a-cycle.aspx</feedburner:origLink></item><item><title>Deploying independent web applications to Windows Azure using single web role</title><link>http://feedproxy.google.com/~r/gunnarpeipman/~3/f2WdmwthMjs/deploying-independent-web-applications-to-windows-azure-using-single-web-role.aspx</link><pubDate>Thu, 29 Dec 2011 18:57:17 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:8192412</guid><dc:creator>DigiMortal</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=8192412</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2011/12/29/deploying-independent-web-applications-to-windows-azure-using-single-web-role.aspx#comments</comments><description>&lt;p&gt;I found very good blog post by Andy Cross’ Blog where he describes &lt;a href="http://blog.bareweb.eu/2011/01/azure-running-multiple-web-sites-in-a-single-webrole/"&gt;how to deploy multiple web sites in a single Windows Azure web role&lt;/a&gt;. I like the idea but there are some things that should be understood and done differently if you plan to use same web role for totally different web applications that you want to run on your Windows Azure instance. In this posting I will show you how to deploy independent web applications to Windows Azure instance using single web role.&lt;/p&gt;  &lt;h3&gt;Problems with independent sites&lt;/h3&gt;  &lt;p&gt;If your sites are in same solution or they are related to each other then use the solution than Andy Cross provides. But if you want to run different sites on same Windows Azure instance you have some things to consider first:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Adding different sites to same solution is not good idea because sites can belong to different projects maintained by different people. &lt;/li&gt;    &lt;li&gt;Usually code is kept in source code repository and you don’t want to have files of one project in folder of other. &lt;/li&gt;    &lt;li&gt;You don’t always want to build all sites together and then publish them to cloud again. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Having these considerations in mind we can go step further from Andy’s solution.&lt;/p&gt;  &lt;h4&gt;Using special deployment project for same server sites&lt;/h4&gt;  &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 5px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="Windows Azure: File structure for independent sites deployment" border="0" alt="Windows Azure: File structure for independent sites deployment" align="right" src="http://weblogs.asp.net/blogs/gunnarpeipman/azure-instance-deployment-folders_69D553D1.png" width="175" height="146" /&gt;My solution is simple. I create new Windows Azure project on Visual Studio 2010 and add one WebRole to this solution. I call it DummyRole because it does practically nothing. You can use this project to redirect browser from your &amp;lt;something&amp;gt;.cloudapp.net address to default site.&lt;/p&gt;  &lt;p&gt;Image on right shows my folder structure:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;AzurePublishing&lt;/strong&gt; – this is solution folder, &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;DummyRole&lt;/strong&gt; – this is dummy web role mentioned before (I was not able to modify cloud project so it doesn’t have reference to some project in solution), &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;MsdnAzureDeploy&lt;/strong&gt; – this folder contains cloud deployment project, &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;packages&lt;/strong&gt; – this is created by Visual Studio, I left it there, &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Publish&lt;/strong&gt; – root folder for web applications that are deployed with web role, &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;www.example.com –&lt;/strong&gt; publishing folders for web sites you want to deploy to server. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Every web site has its own folder under Publish folder and you can use Visual Studio web application publishing to publish web site files to correct subfolders.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 10px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Windows Azure: My deployment project" border="0" alt="Windows Azure: My deployment project" align="right" src="http://weblogs.asp.net/blogs/gunnarpeipman/azure-instance-deployment-solution_42C76804.png" width="294" height="257" /&gt;Now it’s time to modify our deployment package contents. You can see here web role called Redirect (this is the dummy one) and service configuration files. There are no publishing folder visible because cloud projects doesn’t support custom folders. &lt;/p&gt;  &lt;p&gt;Expecting that your cloud project is set up correctly and you can deploy dummy site with no problems, we can take the next step and modify our service definition.&lt;/p&gt;  &lt;p&gt;We have to add our publishing folders to service definition manually. Each web application folder is separate site in our case.&lt;/p&gt;  &lt;p&gt;Here is the example content for service definition file:&lt;/p&gt;  &lt;hr size="1" /&gt;  &lt;div style="font-family: ; background: white; color: "&gt;   &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;lt;?&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;xml&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;version&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;1.0&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;encoding&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;utf-8&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;?&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;ServiceDefinition&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;MsdnAzureDeploy&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;xmlns&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;WebRole&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Redirect&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;vmsize&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Small&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Sites&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Site&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Web&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Bindings&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Binding&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Endpoint1&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;endpointName&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Endpoint1&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt; /&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Bindings&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Site&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Site&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Ex1&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;physicalDirectory&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;..\Publish\www.example1.com&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Bindings&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Binding&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Endpoint1&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;endpointName&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Endpoint1&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;hostHeader&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;www.example1.com&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt; /&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Bindings&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Site&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Site&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Ex2&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;physicalDirectory&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;..\Publish\www.example2.com&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Bindings&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Binding&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Endpoint1&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;endpointName&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Endpoint1&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;            &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;hostHeader&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;www.example2.com&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt; /&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Bindings&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Site&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Sites&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Endpoints&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;InputEndpoint&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Endpoint1&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;protocol&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;http&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;port&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;80&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt; /&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Endpoints&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Imports&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Import&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;moduleName&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;Diagnostics&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt; /&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Import&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;moduleName&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;RemoteAccess&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt; /&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Import&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;moduleName&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;RemoteForwarder&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt; /&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;Imports&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;WebRole&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size: 10pt"&gt;&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 10pt"&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;ServiceDefinition&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 10pt" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;hr size="1" /&gt;  &lt;p&gt;Some things to note:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;our end-point is port 80 (HTTP)&lt;/li&gt;    &lt;li&gt;dummy web app has no host header specified and it is accessible from &amp;lt;something&amp;gt;.cloudapp.net,&lt;/li&gt;    &lt;li&gt;our two example web applications have host headers specified and during deployment IIS will be automatically configured so addresses point to correct applications (you have to make CNAME records in your domain keeper site),&lt;/li&gt;    &lt;li&gt;publishing folders location are relative to deployment project folder.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Make sure you have all paths correctly specified and try to deploy your cloud solution to Windows Azure. If your deployment succeeds then try to access your sites by URL-s you gave in service definition file and make sure everything works normally.&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;Although multiple web roles on same server are not supported by Windows Azure we can gather our sites under same web role and publish them all together. The solution shown here is not perfect but it works. Be careful with deployments and make sure your deployment packages contain always the versions that are allowed to be published. Also make your deployments to test instance first, test everything and then put your test instance to production.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8192412" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZkgNs_5hG00_IcexxRWHrWELJBs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZkgNs_5hG00_IcexxRWHrWELJBs/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/ZkgNs_5hG00_IcexxRWHrWELJBs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZkgNs_5hG00_IcexxRWHrWELJBs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/gunnarpeipman/~4/f2WdmwthMjs" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Azure/default.aspx">Azure</category><feedburner:origLink>http://weblogs.asp.net/gunnarpeipman/archive/2011/12/29/deploying-independent-web-applications-to-windows-azure-using-single-web-role.aspx</feedburner:origLink></item></channel></rss>

