<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Gunnar Peipman's ASP.NET blog : Web Services</title><link>http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+Services/default.aspx</link><description>Tags: Web Services</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Developing Delicious applications</title><link>http://weblogs.asp.net/gunnarpeipman/archive/2009/08/15/developing-delicious-applications.aspx</link><pubDate>Sat, 15 Aug 2009 11:51:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7170168</guid><dc:creator>DigiMortal</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=7170168</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2009/08/15/developing-delicious-applications.aspx#comments</comments><description>&lt;p&gt;I am developing a little piece of software that interacts with &lt;a href="http://delicious.com/"&gt;Delicious&lt;/a&gt; through HTTP API. Using &lt;a href="http://delicious.com/help/api"&gt;Delicious API&lt;/a&gt; puts you one responsibility – use their service carefully. Don’t flood it and don’t stress it some other way. In this posting I will show you how to get bookmarks from Delicious and how to use their service without stressing it pointlessly.&lt;/p&gt;  &lt;p&gt;Why Delicious? Because I keep &lt;a href="http://delicious.com/gpeipman"&gt;my bookmarks&lt;/a&gt; there. If you are interested in my selection you can always check out what new bookmarks I have. I try to add new bookmarks as often as I find something useful.&lt;/p&gt;  &lt;h3&gt;Connecting to Delicious&lt;/h3&gt;  &lt;p&gt;I am using very simple custom class to query my bookmarks at Delicious. My class connects to Delicious using my username and password. As my class is still very yound it has some not so nice things – like hardcoded UrlPrefix. But it is okay for now.&lt;/p&gt;  &lt;hr size="1" /&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DeliciousClient&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; _userName;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; _password;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; UrlPrefix = &lt;span style="color: #a31515"&gt;&amp;quot;https://api.del.icio.us/v1/&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; DeliciousClient(&lt;span style="color: blue"&gt;string&lt;/span&gt; userName, &lt;span style="color: blue"&gt;string&lt;/span&gt; password)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _userName = userName;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _password = password;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Bookmark&lt;/span&gt;&amp;gt; GetBookmarks(&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; fromDate,       &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;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; toDate)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; url = &lt;span style="color: #a31515"&gt;&amp;quot;posts/all?&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; url += &lt;span style="color: #a31515"&gt;&amp;quot;fromdt=&amp;quot;&lt;/span&gt;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; url += fromDate.Date.ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyy-MM-ddThh:mm:ssZ&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; url += &lt;span style="color: #a31515"&gt;&amp;quot;&amp;amp;todt=&amp;quot;&lt;/span&gt;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; url += toDate.Date.ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyy-MM-ddThh:mm:ssZ&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; result = RequestData(url);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;     &lt;br /&gt;&lt;/p&gt;    &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;     &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Parse XML and return list of bookmarks&lt;/span&gt;&lt;/p&gt;   &lt;/div&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; RequestData(&lt;span style="color: blue"&gt;string&lt;/span&gt; uri)&lt;/p&gt;    &lt;p style="margin: 0px"&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; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; client = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; credential = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NetworkCredential&lt;/span&gt;(_userName,       &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; _password);       &lt;br /&gt;      &lt;br /&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; client.Credentials = credential;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; url = UrlPrefix + uri;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; result = client.DownloadData(url);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Encoding&lt;/span&gt;.Default.GetString(result);&lt;/p&gt;    &lt;p style="margin: 0px"&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; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;hr size="1" /&gt; &lt;/div&gt;  &lt;p&gt;Using this code I am able to connect to Delicious and run my queries to get data. But if I connect to often then Delicious handles my requests as flooding and stops access for hours. With little efforts we are able to avoid it.&lt;/p&gt;  &lt;h3&gt;Caching queries&lt;/h3&gt;  &lt;p&gt;To avoid real connections to Delicious we can cache query results for us. Just perform there steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Put break-point somewhere where you are able to get pure XML response (RequestData method is good candidate).&lt;/li&gt;    &lt;li&gt;Connect to Delicious through your code.&lt;/li&gt;    &lt;li&gt;When break-point is hit copy the XML result to clipboard.&lt;/li&gt;    &lt;li&gt;Stop your program.&lt;/li&gt;    &lt;li&gt;Create new XML-file called DeliciousResponse.xml to bin\Debug folder.&lt;/li&gt;    &lt;li&gt;Paste XML to this file and save it.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Now a little trick. We have Debug and Release configurations available out-of-box in Visual Studio. Let’s use them now. Debug configuration defines DEBUG constant for preprocessor. We can therefore write a code that is executed if DEBUG is there. &lt;/p&gt;  &lt;p&gt;If DEBUG is defined we will read data from XML-file we created previously. The code is here for GetBookmarks method.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;hr size="1" /&gt;     &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Bookmark&lt;/span&gt;&amp;gt; GetBookmarks(&lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; fromDate,       &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; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; toDate)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; url = &lt;span style="color: #a31515"&gt;&amp;quot;posts/all?&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; url += &lt;span style="color: #a31515"&gt;&amp;quot;fromdt=&amp;quot;&lt;/span&gt;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; url += fromDate.Date.ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyy-MM-ddThh:mm:ssZ&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; url += &lt;span style="color: #a31515"&gt;&amp;quot;&amp;amp;todt=&amp;quot;&lt;/span&gt;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; url += toDate.Date.ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyy-MM-ddThh:mm:ssZ&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; result;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#if&lt;/span&gt; DEBUG&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; reader = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.OpenRead      &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; (&lt;span style="color: #a31515"&gt;&amp;quot;DeliciousResponse.xml&amp;quot;&lt;/span&gt;)))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; result = reader.ReadToEnd();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;&amp;#160;&amp;#160;&amp;#160; result = RequestData(url);&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;#endif&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;     &lt;br /&gt;&lt;/p&gt;    &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;     &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;&amp;#160;&amp;#160;&amp;#160; // Parse XML and return list of bookmarks&lt;/span&gt;&lt;/p&gt;   &lt;/div&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;hr size="1" /&gt; &lt;/div&gt;  &lt;p&gt;Now you can run your code using Debug configuration and avoid requests to Delicious. If you need real data and communication with Delicious you can switch your project to Release configuration. I think it is very simple and powerful solution for now (of course, I will change my mind when requirements to my software change).&lt;/p&gt;  &lt;p&gt;That’s it. If you write something cool for Delicious then let also community to know about it.&lt;/p&gt;

&lt;hr size="1" /&gt;

&lt;table border="0" cellpadding="0" cellspacing="2" width="100%"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f08%2f15%2fdeveloping-delicious-applications.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f08%2f15%2fdeveloping-delicious-applications.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://pimpthisblog.com/Developing-Delicious-applications"&gt;&lt;img alt="pimp it" src="http://pimpthisblog.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F08%2F15%2Fdeveloping-delicious-applications.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://progg.ru/Developing-Delicious-applications-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F08%2F15%2Fdeveloping-delicious-applications.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://www.9efish.com/Developing-Delicious-applications"&gt;&lt;img alt="顶" src="http://www.9efish.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F08%2F15%2Fdeveloping-delicious-applications.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="right"&gt;
&lt;a rev="vote-for" href="http://dotnetshoutout.com/Developing-Delicious-applications"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F08%2F15%2Fdeveloping-delicious-applications.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://webdevvote.com:80/vote/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f08%2f15%2fdeveloping-delicious-applications.aspx"&gt;&lt;img src="http://webdevvote.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f08%2f15%2fdeveloping-delicious-applications.aspx" border="0" alt="vote it on WebDevVote.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7170168" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Social+webs/default.aspx">Social webs</category></item><item><title>List of Microsoft training kits</title><link>http://weblogs.asp.net/gunnarpeipman/archive/2009/06/04/list-of-microsoft-training-kits.aspx</link><pubDate>Thu, 04 Jun 2009 17:59:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7108218</guid><dc:creator>DigiMortal</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=7108218</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2009/06/04/list-of-microsoft-training-kits.aspx#comments</comments><description>&lt;p&gt;Microsoft training kits are pretty good things to explore when you start learning some new technology. Here are links to some training kits I found to be interesting and useful. Some of these live also in my laptop and when I have free moments I explore them to learn more about these technologies. So, the list of training kits is here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=355c80e9-fde0-4812-98b5-8a03f5874e96&amp;amp;displaylang=en" target="_blank"&gt;.NET Framework 3.5 Enhancements Training Kit&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=8BDAA836-0BBA-4393-94DB-6C3C4A0C98A1&amp;amp;displaylang=en" target="_blank"&gt;Visual Studio 2008 and .NET Framework 3.5 Training Kit&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=E9C68E1B-1E0E-4299-B498-6AB3CA72A6D7&amp;amp;displaylang=en" target="_blank"&gt;SQL Server 2008 Developer Training Kit&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=752CB725-969B-4732-A383-ED5740F02E93&amp;amp;displaylang=en" target="_blank"&gt;Visual Studio 2010 and .NET Framework 4 Training Kit - May Preview&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1E0BE0B2-910A-4676-9F3A-41E4D9C0FC08&amp;amp;displaylang=en" target="_blank"&gt;ASP.NET MVC Training Kit&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=673DC932-626A-4E59-9DCA-16D685600A51&amp;amp;displaylang=en" target="_blank"&gt;Office SharePoint Server 2007 Training&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=7BB3A2A3-6A9F-49F4-84E8-FF3FB71046DF&amp;amp;displaylang=en" target="_blank"&gt;Office SharePoint Server 2007 Training (Standalone Edition)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=5B10F061-41D4-48CE-85CB-01D46772240D&amp;amp;displaylang=en" target="_blank"&gt;Office SharePoint Designer 2007 Training Standalone Edition&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=6A429664-A911-4AD3-9856-F1B0AE7A136E&amp;amp;displaylang=en" target="_blank"&gt;Office SharePoint Designer 2007 Training Portal Edition&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloadS/details.aspx?familyid=C3E315FA-94E2-4028-99CB-904369F177C0&amp;amp;displaylang=en" target="_blank"&gt;Identity Developer Training Kit (May 2009)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=413E88F8-5966-4A83-B309-53B7B77EDF78&amp;amp;displaylang=en" target="_blank"&gt;Azure Services Training Kit - April Update&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=C8498C9B-A85A-4AFA-90C0-593D0E4850CB&amp;amp;displaylang=en" target="_blank"&gt;PHP on Windows Training Kit (April 2009)&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If there are cool training kits that are not in this list then please let me know. :)&lt;/p&gt;

&lt;hr size="1" /&gt;

&lt;table border="0" cellpadding="0" cellspacing="2" width="100%"&gt;
&lt;tr&gt;
&lt;td&gt; 
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f06%2f04%2flist-of-microsoft-training-kits.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f06%2f04%2flist-of-microsoft-training-kits.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://pimpthisblog.com/List-of-Microsoft-training-kits-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="pimp it" src="http://pimpthisblog.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F06%2F04%2Flist-of-microsoft-training-kits.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://progg.ru/List-of-Microsoft-training-kits-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F06%2F04%2Flist-of-microsoft-training-kits.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="right"&gt;
&lt;a rev="vote-for" href="http://dotnetshoutout.com/List-of-Microsoft-training-kits-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F06%2F04%2Flist-of-microsoft-training-kits.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7108218" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/PHP/default.aspx">PHP</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/SharePoint/default.aspx">SharePoint</category><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/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+development/default.aspx">Web development</category></item><item><title>Creating DTOs using AutoMapper</title><link>http://weblogs.asp.net/gunnarpeipman/archive/2009/03/01/creating-dtos-using-automapper.aspx</link><pubDate>Sun, 01 Mar 2009 18:00:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6932195</guid><dc:creator>DigiMortal</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=6932195</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2009/03/01/creating-dtos-using-automapper.aspx#comments</comments><description>&lt;p&gt;There is one small and nice object to object mapper called &lt;a href="http://www.codeplex.com/AutoMapper"&gt;AutoMapper&lt;/a&gt;. I gave it a little try and I found it very useful. Specially if you have web service and you are using DTOs to move data between client and server. Good news is that AutoMapper is able to perform these mappings and you don't have to write more code than couple of lines. Let’s see example.&lt;/p&gt;  &lt;p&gt;Suppose you have following classes: Order, OrderLine, Customer and OrderDto. OrderDto is DTO we are using to send order data to client. I have really simple classes for example purposes, so don’t try to find any good practices here.&lt;/p&gt;  &lt;hr size="1" /&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Party&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; DisplayName { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; OrderNo { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; OrderDate { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;&amp;gt; OrderLines { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Party&lt;/span&gt; Customer { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;decimal&lt;/span&gt; GetTotal()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; query = &lt;span style="color: blue"&gt;from&lt;/span&gt; line &lt;span style="color: blue"&gt;in&lt;/span&gt; OrderLines&lt;/p&gt;    &lt;p style="margin: 0px"&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; &lt;span style="color: blue"&gt;select&lt;/span&gt; line;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; query.Sum&amp;lt;&lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;&amp;gt;(a =&amp;gt; a.Sum);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; LineItem { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;decimal&lt;/span&gt; Sum { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderDTO&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; CustomerDisplayName { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; OrderNo { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; OrderDate { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;decimal&lt;/span&gt; Total { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderDTO&lt;/span&gt; Create(&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; order)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; dto = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderDTO&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dto.CustomerDisplayName = order.Customer.DisplayName;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dto.OrderDate = order.OrderDate;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dto.OrderNo = order.OrderNo;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dto.Total = order.GetTotal();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; dto;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;hr size="1" /&gt; &lt;/div&gt;  &lt;p&gt;DTO creation and initialization is done in OrderDTO.Create() method. The code here is short if we compare it to real life DTOs. And usually we write this code manually. Here is the code that creates order and asks order DTO from OrderDTO class.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;hr size="1" /&gt;     &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ClassicDTOExample()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; party = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Party&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; party.DisplayName = &lt;span style="color: #a31515"&gt;&amp;quot;Smith, John&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; order = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.Customer = party;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderNo = &lt;span style="color: #a31515"&gt;&amp;quot;102&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderLines = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderLines.Add(      &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; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;() { LineItem = &lt;span style="color: #a31515"&gt;&amp;quot;Tea&amp;quot;&lt;/span&gt;, Sum = 10 }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderLines.Add(      &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; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;() { LineItem = &lt;span style="color: #a31515"&gt;&amp;quot;Coffee&amp;quot;&lt;/span&gt;, Sum = 15 }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderLines.Add(      &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; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;() { LineItem = &lt;span style="color: #a31515"&gt;&amp;quot;Juice&amp;quot;&lt;/span&gt;, Sum = 5 }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; dto = &lt;span style="color: #2b91af"&gt;OrderDTO&lt;/span&gt;.Create(order);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;hr size="1" /&gt; &lt;/div&gt;  &lt;p&gt;Now let’s see how AutoMapper works. All we have to is to define mappings and use names of class members so auto mapping can take place. We need to modify OrderDTO class and remove Create() method. Our example code also changes a little bit.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;hr size="1" /&gt;     &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderDTO&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; CustomerDisplayName { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; OrderNo { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; OrderDate { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;decimal&lt;/span&gt; Total { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AutoMapperDTOExample()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; party = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Party&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; party.DisplayName = &lt;span style="color: #a31515"&gt;&amp;quot;Smith, John&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; order = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.Customer = party;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderNo = &lt;span style="color: #a31515"&gt;&amp;quot;102&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderLines = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderLines.Add(      &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; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;() { LineItem = &lt;span style="color: #a31515"&gt;&amp;quot;Tea&amp;quot;&lt;/span&gt;, Sum = 10 }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderLines.Add(      &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; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;() { LineItem = &lt;span style="color: #a31515"&gt;&amp;quot;Coffee&amp;quot;&lt;/span&gt;, Sum = 15 }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; order.OrderLines.Add(      &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; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;OrderLine&lt;/span&gt;() { LineItem = &lt;span style="color: #a31515"&gt;&amp;quot;Juice&amp;quot;&lt;/span&gt;, Sum = 5 }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Mapper&lt;/span&gt;.CreateMap&amp;lt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;OrderDTO&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; dto = &lt;span style="color: #2b91af"&gt;Mapper&lt;/span&gt;.Map&amp;lt;&lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;OrderDTO&lt;/span&gt;&amp;gt;(order);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;hr size="1" /&gt; &lt;/div&gt;  &lt;p&gt;As you can see we have now one method less to test and worry about. Pay attention to DTO member names – I chose names so that AutoMapper can understand what members of order and OrderDTO match. If I look what is inside order DTO created by AutoMapper I see something like this in my locals window.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="" border="0" alt="" src="http://weblogs.asp.net/blogs/gunnarpeipman/automapperlocals_2B6D40C2.png" width="530" height="155" /&gt; &lt;/p&gt;  &lt;p&gt;The most interesting here is OrderDTO member Total. If you look at code above you can see that Order class has method GetTotal(). The value of GetTotal() was automatically mapped to Total property of OrderDTO class.&lt;/p&gt;  &lt;p&gt;Although AutoMapper is pretty new and I’m not sure how good it is for using in production code I am sure that another tool for everydays work is coming.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6932195" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+Services/default.aspx">Web Services</category><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/Software/default.aspx">Software</category></item><item><title>DTO - not only for web services</title><link>http://weblogs.asp.net/gunnarpeipman/archive/2008/07/18/dto-not-only-for-web-services.aspx</link><pubDate>Fri, 18 Jul 2008 05:47:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6413959</guid><dc:creator>DigiMortal</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=6413959</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2008/07/18/dto-not-only-for-web-services.aspx#comments</comments><description>&lt;p&gt;Usually developers think that DTO (&lt;a title="Data Transfer Object" href="http://martinfowler.com/eaaCatalog/dataTransferObject.html"&gt;Data Transfer Object&lt;/a&gt;) is something related to web services where data serialization is required to move data from one point of network to another. It is clear that in most cases there is no point to move complex data structures over network when client side needs this data in pretty simple form. That's why DTOs are created - they are simple, easily serializable and there is no data that client side doesn't need. But there are also other DTOs you may find useful. &lt;/p&gt;  &lt;h3&gt;User Interface DTOs&lt;/h3&gt;  &lt;p&gt;User Interface (UI) may also need some DTOs. By example, data bound controls try usually to save bounded data to their ViewState. But what happens when data source is list on some objects and not DataTable as we can usually see from beginner tutorials? DataTable is serializable and therefore it is easy to save DataTable to ViewState. But objects are often not marked as serializable and binding them to data bound controls may cause exceptions.&lt;/p&gt;  &lt;p&gt;This problem can be solved using DTOs. We can create DTOs as flat objects that are serializable. They doesn't contain any child objects - only properties with their values. We can wrap source data to DTOs and bind list of these DTOs to our data bound controls.&lt;/p&gt;  &lt;h3&gt;Search criteria DTOs&lt;/h3&gt;  &lt;p&gt;In one of our current project we are using some DTOs to define search criterias. These DTOs are also flat ones because they store only ID-s of search conditions, string tokens and dates. There is one main search DTO and some internal search DTOs. This far we are happy with this solution because if we design those DTOs carefully they are very easy and convenient to use in client code.&lt;/p&gt;  &lt;h3&gt;Search sitemap DTOs&lt;/h3&gt;  &lt;p&gt;ASP.NET Futures has support for &lt;a title="ASP.NET Search Sitemaps - something for SEO" href="http://weblogs.asp.net/gunnarpeipman/archive/2008/05/13/asp-net-search-sitemaps-something-for-seo.aspx"&gt;search engine sitemaps&lt;/a&gt; (follow this reference to take a look at the code examples). To let it create a search engine sitemap for products you must define class for products that has specific attributes required by sitemap generating system. This object is also simple DTO because it has no complex attributes.&lt;/p&gt;  &lt;p&gt;I am sure that there are many more DTOs, these three were just examples of some additional DTOs besides DTOs we are using with web services. Okay, and as a last word - DTO is design pattern refered also to as Value Object in Sun.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6413959" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+Services/default.aspx">Web Services</category><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/Design+Patterns/default.aspx">Design Patterns</category></item><item><title>Using WCF Services with PHP</title><link>http://weblogs.asp.net/gunnarpeipman/archive/2007/09/17/using-wcf-services-with-php.aspx</link><pubDate>Mon, 17 Sep 2007 08:32:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3893694</guid><dc:creator>DigiMortal</dc:creator><slash:comments>41</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=3893694</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2007/09/17/using-wcf-services-with-php.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;I recently wrote two postings on the subject of WCF services: WCF Services – Let's Get Started and WCF and Unit Tests. One could see that creating and testing services was not complicated at all. Let's go on and take some steps nearer to the real world – our service is used by SOAP clients running on different platforms.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I conducted my first experiment with PHP. PHP is widely used in the world of the Web and in all likelihood there will dawn a day when DT is asked just for such an integration. As PHP4 development and support is soon going to be discontinued, I didn't bother with an example using PHP4 SOAP tools. PHP5 is on the market and it comes with a quick and stable SOAP library. The performance is many times better than in case of similar widgets written for PHP4.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I have Apache and PHP5 running on Windows and for SOAP support I have to use an extension named php_soap.dll. Thus, I have to remove the comment mark in front of the appropriate php.ini line and restart Apache.&lt;/P&gt;
&lt;P align=center mce_keep="true"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/math-service.png" border=0 mce_src="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/math-service.png"&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;As an example I will present a PHP code calling the service's Add() method and writing the result on the screen. An example of WCF code can be found in our blog, in the posting &lt;STRONG&gt;&lt;A class="" title="WCF Services – Let's Get Started" href="http://weblogs.asp.net/gunnarpeipman/archive/2007/09/12/wcf-lets-get-started.aspx" mce_href="http://weblogs.asp.net/gunnarpeipman/archive/2007/09/12/wcf-lets-get-started.aspx"&gt;WCF Services – Let's Get Started&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;HR SIZE=1&gt;
&lt;PRE&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;?php&lt;/SPAN&gt;&lt;BR&gt;&lt;A href="http://www.php.net/header"&gt;&lt;SPAN style="COLOR: #000066"&gt;header&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #006600"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;'Content-Type: text/plain'&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #006600"&gt;)&lt;/SPAN&gt;;

&lt;A href="http://www.php.net/echo"&gt;&lt;SPAN style="COLOR: #000066"&gt;echo&lt;/SPAN&gt;&lt;/A&gt; &lt;SPAN style="COLOR: #ff0000"&gt;"WCF Test&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #000099"&gt;\r&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #000099"&gt;\n&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #000099"&gt;\r&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #000099"&gt;\n&lt;/SPAN&gt;"&lt;/SPAN&gt;;

&lt;SPAN style="COLOR: #0000ff"&gt;$client&lt;/SPAN&gt; = &lt;SPAN style="FONT-WEIGHT: bold; COLOR: #000000"&gt;new&lt;/SPAN&gt; SoapClient&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #006600"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;'http://gamma/wcftest/MathService.svc?wsdl'&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #006600"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;$obj&lt;/SPAN&gt;-&amp;gt;&lt;SPAN style="COLOR: #006600"&gt;x&lt;/SPAN&gt; = &lt;SPAN style="COLOR: #cc66cc"&gt;2&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #cc66cc"&gt;5&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;$obj&lt;/SPAN&gt;-&amp;gt;&lt;SPAN style="COLOR: #006600"&gt;y&lt;/SPAN&gt; = &lt;SPAN style="COLOR: #cc66cc"&gt;3&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #cc66cc"&gt;5&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;$retval&lt;/SPAN&gt; = &lt;SPAN style="COLOR: #0000ff"&gt;$client&lt;/SPAN&gt;-&amp;gt;&lt;SPAN style="COLOR: #006600"&gt;Add&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #006600"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;$obj&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #006600"&gt;)&lt;/SPAN&gt;;

&lt;A href="http://www.php.net/echo"&gt;&lt;SPAN style="COLOR: #000066"&gt;echo&lt;/SPAN&gt;&lt;/A&gt; &lt;SPAN style="COLOR: #ff0000"&gt;"2.5 + 3.5 = "&lt;/SPAN&gt; . &lt;SPAN style="COLOR: #0000ff"&gt;$retval&lt;/SPAN&gt;-&amp;gt;&lt;SPAN style="COLOR: #006600"&gt;AddResult&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: #000000"&gt;?&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;HR SIZE=1&gt;

&lt;P mce_keep="true"&gt;If nothing went wrong, the result should be something like this:&lt;/P&gt;&lt;CODE&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCF Test
&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.5 + 3.5 = 6&lt;/PRE&gt;&lt;/CODE&gt;
&lt;P mce_keep="true"&gt;As you can see, using WCF services in PHP is very simple. The SOAP library provided along with PHP5 does a great deal of the work "behind the curtains", leaving us with an easily readable brief code.&lt;/P&gt;

&lt;hr size="1" /&gt;

&lt;table border="0" cellpadding="0" cellspacing="2" width="100%"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f17%2fusing-wcf-services-with-php.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f17%2fusing-wcf-services-with-php.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a href="http://webdevvote.com:80/vote/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f17%2fusing-wcf-services-with-php.aspx"&gt;&lt;img src="http://webdevvote.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f17%2fusing-wcf-services-with-php.aspx" border="0" alt="vote it on WebDevVote.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://pimpthisblog.com/Using-WCF-Services-with-PHP-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="pimp it" src="http://pimpthisblog.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2007%2F09%2F17%2Fusing-wcf-services-with-php.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://progg.ru/Using-WCF-Services-with-PHP-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2007%2F09%2F17%2Fusing-wcf-services-with-php.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="right"&gt;
&lt;a rev="vote-for" href="http://dotnetshoutout.com/Using-WCF-Services-with-PHP-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2007%2F09%2F17%2Fusing-wcf-services-with-php.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3893694" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+Services/default.aspx">Web Services</category><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/PHP/default.aspx">PHP</category></item><item><title>WCF and Unit Tests</title><link>http://weblogs.asp.net/gunnarpeipman/archive/2007/09/13/wcf-unit-tests.aspx</link><pubDate>Wed, 12 Sep 2007 22:03:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3840278</guid><dc:creator>DigiMortal</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=3840278</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2007/09/13/wcf-unit-tests.aspx#comments</comments><description>&lt;P&gt;Good practices demand tests for every new thing you have been able to get running. Otherwise&amp;nbsp;our TDD chief&amp;nbsp;is glum and moody during smoke breaks. So, to maintain the ever cheerful and busy climate in our office, this posting is going to discuss testing.&lt;/P&gt;
&lt;P&gt;After installing WCF and getting it to work I also installed everything required for unit tests. It means I installed NUnit and TestDriven.Net and added a tests project to the project mentioned in the previous posting discussing WCF. I created an ordinary DLL library project for the tests, so it could be used with versions of Visual Studio that do not have built-in tests.&lt;/P&gt;
&lt;P&gt;To use NUnit with a testing project you have to add a reference to nunit.framework.dll located under Program Files in the NUnit bin directory. This completes all preparations and we can continue with the tests.&lt;/P&gt;
&lt;H3&gt;New Methods for the Service&lt;/H3&gt;
&lt;P&gt;To have more things to test I added a couple of new methods to the service. Nothing complicated, just subtraction, multiplication and division, to cover all the four basic operations. Thus, we have to change the service contract and service class. The changes are as follows.&lt;/P&gt;
&lt;HR SIZE=1&gt;
&lt;PRE&gt;&lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;ServiceContract&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;interface&lt;/SPAN&gt; IMathService&lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;OperationContract&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Add&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;OperationContract&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Subtract&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;OperationContract&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Divide&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;OperationContract&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Multiply&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;

&lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt; MathService : IMathService&lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Add&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;return&lt;/SPAN&gt; x + y;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Subtract&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;return&lt;/SPAN&gt; x - y;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Multiply&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;return&lt;/SPAN&gt; x * y;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Divide&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;return&lt;/SPAN&gt; x / y;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;HR SIZE=1&gt;

&lt;H3&gt;Unit Tests&lt;/H3&gt;
&lt;P&gt;For testing I created a class named MathServiceTest. We also have to add a Service Reference to the project and provide it with the URL to the MathService service. When the service is in place we can continue with the tests class.&lt;/P&gt;
&lt;P&gt;To prevent creating and closing the service connection at every step we will connect to the service at the beginning of testing and disconnect after completing the tests.&lt;/P&gt;
&lt;HR SIZE=1&gt;
&lt;PRE&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Collections&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Generic&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;ServiceModel&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Text&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; NUnit.&lt;SPAN style="COLOR: #000000"&gt;Framework&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; WCFTestTests.&lt;SPAN style="COLOR: #000000"&gt;gamma&lt;/SPAN&gt;;

&lt;SPAN style="COLOR: #0600ff"&gt;namespace&lt;/SPAN&gt; WCFTestTests&lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;TestFixture&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt; MathServiceTest&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;private&lt;/SPAN&gt; MathServiceClient client;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;TestFixtureSetUp&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0600ff"&gt;void&lt;/SPAN&gt; Initialize&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;this&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;client&lt;/SPAN&gt; = &lt;A href="http://www.google.com/search?q=new+msdn.microsoft.com" mce_href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;&lt;SPAN style="COLOR: #008000"&gt;new&lt;/SPAN&gt;&lt;/A&gt; MathServiceClient&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;this&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;client&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Open&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;TestFixtureTearDown&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0600ff"&gt;void&lt;/SPAN&gt; TearDown&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;if&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0600ff"&gt;this&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;client&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;State&lt;/SPAN&gt; != CommunicationState.&lt;SPAN style="COLOR: #000000"&gt;Closed&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;this&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;client&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Close&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;HR SIZE=1&gt;

&lt;P&gt;Next, we will add testing methods for all methods of the service.&lt;/P&gt;
&lt;HR SIZE=1&gt;
&lt;PRE&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Collections&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Generic&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;ServiceModel&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Text&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; NUnit.&lt;SPAN style="COLOR: #000000"&gt;Framework&lt;/SPAN&gt;;&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; WCFTestTests.&lt;SPAN style="COLOR: #000000"&gt;gamma&lt;/SPAN&gt;;

&lt;SPAN style="COLOR: #0600ff"&gt;namespace&lt;/SPAN&gt; WCFTestTests&lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;TestFixture&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt; MathServiceTest&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;private&lt;/SPAN&gt; MathServiceClient client;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;TestFixtureSetUp&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0600ff"&gt;void&lt;/SPAN&gt; Initialize&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;this&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;client&lt;/SPAN&gt; = &lt;A href="http://www.google.com/search?q=new+msdn.microsoft.com" mce_href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;&lt;SPAN style="COLOR: #008000"&gt;new&lt;/SPAN&gt;&lt;/A&gt; MathServiceClient&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;this&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;client&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Open&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;TestFixtureTearDown&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0600ff"&gt;void&lt;/SPAN&gt; TearDown&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;if&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0600ff"&gt;this&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;client&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;State&lt;/SPAN&gt; != CommunicationState.&lt;SPAN style="COLOR: #000000"&gt;Closed&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;this&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;client&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Close&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;Test&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0600ff"&gt;void&lt;/SPAN&gt; AddTest&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Assert.&lt;SPAN style="COLOR: #000000"&gt;AreEqual&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;5&lt;/SPAN&gt;, client.&lt;SPAN style="COLOR: #000000"&gt;Add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;2&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #ff0000"&gt;3&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;Test&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0600ff"&gt;void&lt;/SPAN&gt; SubtractTest&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Assert.&lt;SPAN style="COLOR: #000000"&gt;AreEqual&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;3&lt;/SPAN&gt;, client.&lt;SPAN style="COLOR: #000000"&gt;Subtract&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;8&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #ff0000"&gt;5&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;Test&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0600ff"&gt;void&lt;/SPAN&gt; MultiplyTest&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Assert.&lt;SPAN style="COLOR: #000000"&gt;AreEqual&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;12&lt;/SPAN&gt;, client.&lt;SPAN style="COLOR: #000000"&gt;Multiply&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;2&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #ff0000"&gt;6&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;Test&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0600ff"&gt;void&lt;/SPAN&gt; DivideTest&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Assert.&lt;SPAN style="COLOR: #000000"&gt;AreEqual&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;4&lt;/SPAN&gt;, client.&lt;SPAN style="COLOR: #000000"&gt;Divide&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;12&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #ff0000"&gt;3&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;
&lt;/PRE&gt;
&lt;HR SIZE=1&gt;

&lt;P&gt;Let's start the NUnit GUI and run the test.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/wcf-nunit-1.png"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/wcf-nunit-1.png" border=0&gt;&lt;/A&gt;&lt;BR&gt;&lt;EM&gt;Press the right mouse button on the tests project, select Test With from the menu &lt;BR&gt;and then NUnit from the submenu. The NUnit GUI opens.&lt;/EM&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/wcf-nunit-2.png"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/wcf-nunit-2.png" border=0&gt;&lt;/A&gt;&lt;BR&gt;&lt;EM&gt;NUnit GUI displays all classes containing tests, and tests included in the classes. &lt;BR&gt;Tests can be run within a specific class, if required.&lt;/EM&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/wcf-nunit-3.png"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/wcf-nunit-3.png" border=0&gt;&lt;/A&gt;&lt;BR&gt;&lt;EM&gt;It seems I got lucky – all tests have succeeded!&lt;/EM&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;If nothing went wrong all tests are displayed in green. It means we can safely say the service code works correctly. It went well with me this time, I hope you are as lucky or even luckier than I.&lt;/P&gt;
&lt;H3&gt;Coverage Test&lt;/H3&gt;
&lt;P mce_keep="true"&gt;At first, I didn't want to touch the Coverage Test at this time. When I started it, however, I noticed something that should be mentioned here, to widen the reader's horizons.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Let's start the coverage test. It's located in the same menu as the NUnit GUI. TestDriven.Net comes with NCover that enables us to run coverage tests. TestDriven.Net completes the coverage test automatically. You only have to select the appropriate item from the menu, and the results are displayed in a window.&lt;/P&gt;
&lt;P align=center mce_keep="true"&gt;&lt;A href="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/wcf-ncover.png"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/wcf-ncover.png" border=0&gt;&lt;/A&gt;&lt;BR&gt;&lt;EM&gt;Coverage test failed – code exists that is never run for our project, &lt;BR&gt;unless we change the code.&lt;/EM&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;As we can see the coverage test fails. Methods exist that are never used. These methods have been generated by the service's proxy generator and they are the four overloads of the proxy constructor.&lt;/P&gt;
&lt;P mce_keep="true"&gt;If required, we can remove these constructors from the service's proxy, but refreshing the service causes these constructors to be automatically regenerated. If anybody knows how to prevent it, a comment would be welcome.&lt;/P&gt;
&lt;H3&gt;Summary&lt;/H3&gt;
&lt;P mce_keep="true"&gt;To sum it up, I can say that testing WCF services is not complicated as long as the services are simple. The development environment with all necessary tools can be created quickly and one can begin working almost at once. In addition to Unit Tests testDriven.Net also provides our development environment with Coverage Tests.&lt;/P&gt;
&lt;P mce_keep="true"&gt;As I am dealing with a more complicated SOAP project at the moment, I am quietly contemplating the most effective way of testing the SOAP layer architecture after getting it in place. Anyway, it will certainly give me material for a couple of longer postings.&lt;/P&gt;

&lt;hr size="1" /&gt;

&lt;table border="0" cellpadding="0" cellspacing="2" width="100%"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f13%2fwcf-unit-tests.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f13%2fwcf-unit-tests.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a href="http://webdevvote.com:80/vote/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f13%2fwcf-unit-tests.aspx"&gt;&lt;img src="http://webdevvote.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f13%2fwcf-unit-tests.aspx" border="0" alt="vote it on WebDevVote.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://pimpthisblog.com/WCF-and-Unit-Tests-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="pimp it" src="http://pimpthisblog.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2007%2F09%2F13%2Fwcf-unit-tests.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://progg.ru/WCF-and-Unit-Tests-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2007%2F09%2F13%2Fwcf-unit-tests.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="right"&gt;
&lt;a rev="vote-for" href="http://dotnetshoutout.com/WCF-and-Unit-Tests-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2007%2F09%2F13%2Fwcf-unit-tests.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3840278" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>WCF Services – Let's Get Started</title><link>http://weblogs.asp.net/gunnarpeipman/archive/2007/09/12/wcf-lets-get-started.aspx</link><pubDate>Wed, 12 Sep 2007 16:31:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3837891</guid><dc:creator>DigiMortal</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=3837891</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2007/09/12/wcf-lets-get-started.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;In connection with testing &lt;A class="" title="Windows Communication Framework" href="http://wcf.netfx3.com/" mce_href="http://wcf.netfx3.com/"&gt;WCF&lt;/A&gt; services I had to get the services to work under IIS on my development computer. The default WCF services library created by Visual Studio does not automatically include &lt;A class="" title="Internet Information Server" href="http://www.iis.net/" mce_href="http://www.iis.net/"&gt;IIS&lt;/A&gt; support. There were other small glitches that I was able to overcome nicely, in spite of everything.&lt;/P&gt;
&lt;H3&gt;Server&lt;/H3&gt;
&lt;P mce_keep="true"&gt;For starters I created a simple service that adds two figures together. What a classic, isn't it? When creating the service, I selected WCF Service Library as the project type. The service file named MathService.cs appears as follows.&lt;/P&gt;
&lt;HR SIZE=1&gt;
&lt;CODE&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;; &lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Collections&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Generic&lt;/SPAN&gt;; &lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Text&lt;/SPAN&gt;; &lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;ServiceModel&lt;/SPAN&gt;; &lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Runtime&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Serialization&lt;/SPAN&gt;;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #0600ff"&gt;namespace&lt;/SPAN&gt; WCFTest &lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;ServiceContract&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;interface&lt;/SPAN&gt; IMathService &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;OperationContract&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Add&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt; MathService : IMathService &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; Add&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; x, &lt;SPAN style="COLOR: #ff0000"&gt;double&lt;/SPAN&gt; y&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;return&lt;/SPAN&gt; x + y; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt; &lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;/CODE&gt;
&lt;HR SIZE=1&gt;

&lt;P mce_keep="true"&gt;IIS was the next issue. Mapping the project directory under IIS turned out to be pretty pointless as under IIS all application binaries are searched from the /bin directory but on compilation the files are created in the /bin/Debug directory instead. As workaround I wrote some post-build commands for the WCF service project, copying all necessary files to IIS directories as required. Of course, the IIS directory has to be defined as an IIS application.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Next I dealt with the service configuration.&lt;/P&gt;
&lt;HR SIZE=1&gt;
&lt;PRE&gt;&lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;&lt;/SPAN&gt;?xml &lt;SPAN style="COLOR: #000066"&gt;version&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"1.0"&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;?&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;configuration&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt; 
&lt;BR&gt;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;system.web&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;compilation&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000066"&gt;debug&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"false"&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;/&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;authentication&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000066"&gt;mode&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"Windows"&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;/&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;/system.web&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;    &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;system.serviceModel&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;services&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;service&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000066"&gt;name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"WCFTest.MathService"&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000066"&gt;behaviorConfiguration&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"MathServiceBehavior"&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;endpoint&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000066"&gt;address&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;""&lt;/SPAN&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #009900"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000066"&gt;binding&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"basicHttpBinding"&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: #000066"&gt;contract&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"WCFTest.IMathService"&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;/&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;endpoint&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000066"&gt;contract&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"IMetadataExchange"&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: #000066"&gt;binding&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"mexHttpBinding"&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000066"&gt;address&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"mex"&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;/&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;/service&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;/services&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;behaviors&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;servicebehaviors&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;behavior&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000066"&gt;name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"MathServiceBehavior"&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;servicedebug&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000066"&gt;includeExceptionDetailInFaults&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"False"&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;servicemetadata&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000066"&gt;httpGetEnabled&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"true"&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;/behavior&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;/servicebehaviors&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;/behaviors&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt; 
    &lt;BR&gt;&amp;nbsp; &lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;/system.serviceModel&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt; 
&lt;BR&gt;&lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;lt;/configuration&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;HR SIZE=1&gt;&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;And now the most exciting part – how to make the service visible under IIS. Creating a file with the service's name and svc extension is sufficient. In my case MathService.svc. The content of the file is simple – it is used to set the name of the service class.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #009900"&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/SPAN&gt;%@ServiceHost &lt;SPAN style="COLOR: #000066"&gt;language&lt;/SPAN&gt;=c# &lt;SPAN style="COLOR: #000066"&gt;Debug&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"true"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000066"&gt;Service&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #ff0000"&gt;"WCFTest.MathService"&lt;/SPAN&gt; %&lt;SPAN style="FONT-WEIGHT: bold; COLOR: black"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Now the service part should be up. It is quite easy to check – you only need to compile the service and enter its URL in the browser. If anything is wrong, we'll get an error message. If everything is OK, we will see a page introducing the service, with the URL of the service's WSDL in the upper part.&lt;/P&gt;
&lt;P align=center mce_keep="true"&gt;&lt;A href="http://weblogs.asp.net/blogs/gunnarpeipman/math-service.png" mce_href="http://weblogs.asp.net/blogs/gunnarpeipman/math-service.png"&gt;&lt;/A&gt;&lt;A href="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/math-service.png"&gt;&lt;IMG src="http://weblogs.asp.net/blogs/gunnarpeipman/2007/09/math-service.png" border=0&gt;&lt;/A&gt;&lt;/A&gt;&lt;/P&gt;
&lt;H3&gt;Client&lt;/H3&gt;
&lt;P mce_keep="true"&gt;To test the service I created a simple client program that adds two figures together and displays the result.&lt;/P&gt;
&lt;HR SIZE=1&gt;
&lt;PRE&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;; 
&lt;BR&gt;&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Collections&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Generic&lt;/SPAN&gt;; 
&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; &lt;SPAN style="COLOR: #000000"&gt;System&lt;/SPAN&gt;.&lt;SPAN style="COLOR: #000000"&gt;Text&lt;/SPAN&gt;; 
&lt;SPAN style="COLOR: #0600ff"&gt;using&lt;/SPAN&gt; WCFTestConsole.&lt;SPAN style="COLOR: #000000"&gt;MathService&lt;/SPAN&gt;;

&lt;SPAN style="COLOR: #0600ff"&gt;namespace&lt;/SPAN&gt; WCFTestConsole&lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #ff0000"&gt;class&lt;/SPAN&gt; Program&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0600ff"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0600ff"&gt;void&lt;/SPAN&gt; Main&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt; args&lt;SPAN style="COLOR: #000000"&gt;)&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MathServiceClient client = &lt;A href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;&lt;SPAN style="COLOR: #008000"&gt;new&lt;/SPAN&gt;&lt;/A&gt; MathServiceClient&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.&lt;SPAN style="COLOR: #000000"&gt;WriteLine&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;"2 + 3 = "&lt;/SPAN&gt; + client.&lt;SPAN style="COLOR: #000000"&gt;Add&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;2&lt;/SPAN&gt;, &lt;SPAN style="COLOR: #ff0000"&gt;3&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.&lt;SPAN style="COLOR: #000000"&gt;WriteLine&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;"Press any key to exit"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.&lt;SPAN style="COLOR: #000000"&gt;ReadLine&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt; 
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;     &lt;BR&gt;&lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;
&lt;HR SIZE=1&gt;&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;Here I discovered something new and interesting – hooking up the service as a web service behaves differently from adding it as a WCF service. In case of SOAP the wrapper methods created are completely different. They have twice as many arguments as the service method plus two additional arguments for the returned result. Every argument and returned result has an additional Boolean-type parameter indicating whether this parameter has been set or not.&lt;/P&gt;
&lt;P mce_keep="true"&gt;When hooking up the service by adding the service reference to the project, these parameters are not generated because the WCF client is able to solve the situation by itself.&lt;/P&gt;
&lt;P mce_keep="true"&gt;You can read more on this topic from Eugene Osovetsky's blog posting &lt;A class="" title="Solving the " href="http://blogs.msdn.com/eugeneos/archive/2007/02/05/solving-the-disappearing-data-issue-when-using-add-web-reference-or-wsdl-exe-with-wcf-services.aspx" mce_href="http://blogs.msdn.com/eugeneos/archive/2007/02/05/solving-the-disappearing-data-issue-when-using-add-web-reference-or-wsdl-exe-with-wcf-services.aspx" disappearing="disappearing" data?="data?" issue="issue" when="when" using="using" Add="Add" Web="Web" Reference="Reference" or="or" Wsdl.exe="Wsdl.exe" with="with" WCF="WCF" services?="services?"&gt;Solving the "disappearing data" issue when using Add Web Reference or Wsdl.exe with WCF services&lt;/A&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Now you have everything you need to get started with WCF and test the results, so I can only wish you success with WCF.&lt;/P&gt;

&lt;hr size="1" /&gt;

&lt;table border="0" cellpadding="0" cellspacing="2" width="100%"&gt;
&lt;tr&gt;
&lt;td&gt; 
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f12%2fwcf-lets-get-started.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f12%2fwcf-lets-get-started.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a href="http://webdevvote.com:80/vote/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f12%2fwcf-lets-get-started.aspx"&gt;&lt;img src="http://webdevvote.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2007%2f09%2f12%2fwcf-lets-get-started.aspx" border="0" alt="vote it on WebDevVote.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://pimpthisblog.com/WCF-Services-Lets-Get-Started-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="pimp it" src="http://pimpthisblog.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2007%2F09%2F12%2Fwcf-lets-get-started.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://progg.ru/WCF-Services-Lets-Get-Started-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2007%2F09%2F12%2Fwcf-lets-get-started.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="right"&gt;
&lt;a rev="vote-for" href="http://dotnetshoutout.com/WCF-Services-Lets-Get-Started-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2007%2F09%2F12%2Fwcf-lets-get-started.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3837891" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item></channel></rss>