<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.vyvojar.cz/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>Lukask Blog</title><link>http://blog.vyvojar.cz/lukaashek/default.aspx</link><description>Zajímám se o .NET, C#, WCF, WPF a návrhové vzory
&lt;table&gt;
&lt;tr&gt;
 &lt;td&gt;&lt;a href="http://www.mstv.cz" target="_blank"&gt;&lt;img src="http://i9vxjw.bay.livefilestore.com/y1p3QZqPBNZk9N7rpa5GypzcwtI9c-b7rfvVhhTY-osvabddZfD7prIfUdsK0sZr9YKWIIdCpdYG_u9iggEKHlic-OQHGTh0NSM/mstv.jpg" alt="Nalaďte si MSTV" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</description><dc:language /><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>SQL 2005 CLR Trigger and WCF – Issue</title><link>http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx</link><pubDate>Thu, 22 Jul 2010 13:34:39 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236788</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/236788.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=236788</wfw:commentRss><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I’ve developed simple CLR Trigger which uses WCF to send some data. So when I try to deploy CLR Trigger I got exception&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Deploy error SQL01268: .Net SqlClient Data Provider: Msg 6503, Level 16, State 12, Line 1 Assembly 'system.servicemodel, version=3.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.' was not found in the SQL catalog.      &lt;br /&gt;&amp;#160; An error occurred while the batch was being executed.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Ok, let’s go to add System.ServiceModel assembly to sql server. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_29B97ABA.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_08C60813.png" width="323" height="185" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;But if I try add System.ServiceModel assembly I got exception&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_4F42F81B.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_0EA0ABAC.png" width="644" height="273" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ok, I just try add smdiagnostics…done. So I just try add system.servicemodel again….ohh no another exception&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_5A8C0C58.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_19E9BFE9.png" width="644" height="271" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Adding system.runtime.serialization….done. Adding system.servicemodel again … exception&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_50E39E22.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_104151B3.png" width="644" height="273" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Adding system.web…fail, because system.web requires system.drawing.dll&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_7932D076.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_38908407.png" width="644" height="273" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Adding system.drawing … done. Adding system.web again … fail and exception&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_6B80146E.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_43D99844.png" width="644" height="275" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Adding system.directoryservices…done. Adding system.web again…exception&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_61D7A638.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_213559C9.png" width="644" height="271" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Adding system.directoryservices.protocols…done. Adding system.web again !!!!!…exception&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_6D20BA75.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_178CEB93.png" width="644" height="271" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Adding system.enterpriseservices…exception&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_63784C3F.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_54CDA05A.png" width="644" height="272" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Adding system.runtime.remoting … exception&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_67A22404.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_3FFBA7DA.png" width="644" height="275" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I can’t add System.Web assembly because it requires System.EnterpriseServices assembly which requires System.Runtime.Remoting assembly which requires System.Web assembly again !!!!! I have absolutely no idea who designed this ugly dependency.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx&amp;amp;;title=SQL+2005+CLR+Trigger+and+WCF+%e2%80%93+Issue" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx&amp;amp;;title=SQL+2005+CLR+Trigger+and+WCF+%e2%80%93+Issue" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx&amp;amp;;title=SQL+2005+CLR+Trigger+and+WCF+%e2%80%93+Issue" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx&amp;amp;title=SQL+2005+CLR+Trigger+and+WCF+%e2%80%93+Issue" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx&amp;amp;;title=SQL+2005+CLR+Trigger+and+WCF+%e2%80%93+Issue" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx&amp;amp;;title=SQL+2005+CLR+Trigger+and+WCF+%e2%80%93+Issue&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx&amp;amp;;subject=SQL+2005+CLR+Trigger+and+WCF+%e2%80%93+Issue" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/07/22/sql-2005-clr-trigger-and-wcf-issue.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236788" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Nový web na technologie WPF a Silverlight – pokračování</title><link>http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx</link><pubDate>Thu, 06 May 2010 13:13:28 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236242</guid><dc:creator>lukaashek</dc:creator><slash:comments>7</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/236242.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=236242</wfw:commentRss><description>&lt;p&gt;V mém posledním velmi krátkém příspěvku jsem zde dělal reklamu na web &lt;a href="http://www.aglight.cz"&gt;www.aglight.cz&lt;/a&gt; . Na tomto webu se sice stále pracuje, ale zatím velmi pomalu a proto nevidíte jednu funkcionalitu, která sice implementována je, ale jak říkám není “vidět”. Jedná se o podporu RSS kanálů!&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;WPF - &lt;a title="http://aglight.cz/WPF/Rss" href="http://aglight.cz/WPF/Rss"&gt;http://aglight.cz/WPF/Rss&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Silverlight - &lt;a title="http://aglight.cz/Silverlight/Rss" href="http://aglight.cz/Silverlight/Rss"&gt;http://aglight.cz/Silverlight/Rss&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Expression Studio - &lt;a href="http://aglight.cz/ExpressionStudio/Rss"&gt;http://aglight.cz/ExpressionStudio/Rss&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight+%e2%80%93+pokra%c4%8dov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight+%e2%80%93+pokra%c4%8dov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight+%e2%80%93+pokra%c4%8dov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx&amp;amp;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight+%e2%80%93+pokra%c4%8dov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight+%e2%80%93+pokra%c4%8dov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight+%e2%80%93+pokra%c4%8dov%26%23225%3bn%26%23237%3b&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx&amp;amp;;subject=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight+%e2%80%93+pokra%c4%8dov%26%23225%3bn%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/05/06/nov-web-na-technologie-wpf-a-silverlight-pokra-ov-n.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236242" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Nový web na technologie WPF a Silverlight</title><link>http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx</link><pubDate>Sat, 24 Apr 2010 18:42:13 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236221</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/236221.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=236221</wfw:commentRss><description>&lt;p&gt;Více na &lt;a href="http://www.aglight.cz"&gt;www.aglight.cz&lt;/a&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx&amp;amp;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx&amp;amp;;title=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx&amp;amp;;subject=Nov%26%23253%3b+web+na+technologie+WPF+a+Silverlight" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/04/24/nov-web-na-technologie-wpf-a-silverlight.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236221" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Windows 7 – Windows Explorer doesn’t refresh</title><link>http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx</link><pubDate>Tue, 30 Mar 2010 12:34:19 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236172</guid><dc:creator>lukaashek</dc:creator><slash:comments>22</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/236172.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=236172</wfw:commentRss><description>&lt;p&gt;Před pár dny mi začal blbnout windows průzkumník. Jakmile jsem chtěl vytvořit novou složku, začalo se mi točit “kolečko” a u názvu složky se objevilo známé “not responding”. Bohužel jsem se vytvoření nikdy nedočkal a tak jsem musel ukončit proces. Jakmile jsem se ovšem podíval zpátky do míst, kde jsem vytvářel novou složku tak opravdu “new folder” byla zde. Druhým chováním, kdy nedocházelo k aktualizaci složky či plochy bylo v případě kopírování, mazání a přesouvání. Vždy po provedení těchto operací jsem musel stisknout F5 aby se provedla aktualizace.&lt;/p&gt;  &lt;p&gt;Po prostudování tohoto &lt;a href="http://social.technet.microsoft.com/Forums/en/w7itproui/thread/8afb8b65-900c-4f42-b1df-3c2394417b6e" target="_blank"&gt;vlákna&lt;/a&gt; jsem objevil řešení, které pro mně zafungovalo. Tady je:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Hi all,      &lt;br /&gt;I've read this thread to the end and I've tried all the solutions posted... obviously to no avail.       &lt;br /&gt;The bug repeats itself, not randomly but constantly, in any situation, folders, libraries - sorted by name or by whatever.       &lt;br /&gt;I then tried something different, which instead &lt;strong&gt;WORKED&lt;/strong&gt; , and here it is.       &lt;br /&gt;&lt;/em&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;em&gt;I backed up the register.&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;&lt;em&gt;Searched for occurrences of the word refresh and found this key: HKEY_CLASSES_ROOT\CLSID\{BDEADE7F-C265-11D0-BCED-00A0C90AB50F}\Instance which contains three subkeys. One of them, curiously enough, is DontRefresh and it has a value of 1 (turned ON)&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;&lt;em&gt;I then changed the value to 0 (turned OFF) and hit F5 to refresh and save the now changed register.&lt;/em&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;   &lt;br /&gt;&lt;em&gt;Guess what? Now, everything (moving, deleting, copying) works and even the Trash Bin refreshes immediately.      &lt;br /&gt;I will keep you posted in the next few days to tell you whether the fix still works.       &lt;br /&gt;Good luck.&lt;/em&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx&amp;amp;;title=Windows+7+%e2%80%93+Windows+Explorer+doesn%e2%80%99t+refresh" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx&amp;amp;;title=Windows+7+%e2%80%93+Windows+Explorer+doesn%e2%80%99t+refresh" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx&amp;amp;;title=Windows+7+%e2%80%93+Windows+Explorer+doesn%e2%80%99t+refresh" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx&amp;amp;title=Windows+7+%e2%80%93+Windows+Explorer+doesn%e2%80%99t+refresh" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx&amp;amp;;title=Windows+7+%e2%80%93+Windows+Explorer+doesn%e2%80%99t+refresh" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx&amp;amp;;title=Windows+7+%e2%80%93+Windows+Explorer+doesn%e2%80%99t+refresh&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx&amp;amp;;subject=Windows+7+%e2%80%93+Windows+Explorer+doesn%e2%80%99t+refresh" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/30/windows-7-windows-explorer-doesn-t-refresh.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236172" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/Windows+7/default.aspx">Windows 7</category></item><item><title>WCF 4 – WebHttp Services – Seznamte se, routování je zde…</title><link>http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx</link><pubDate>Sun, 14 Mar 2010 01:23:31 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236113</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/236113.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=236113</wfw:commentRss><description>&lt;p&gt;Routování při použití WebHttp Services může být velice nápomocné při snaze rozdělit funkcionalitu službu na menší části, kde každá část bude mít svojí speciální adresu. Jak provést rozdělení a příslušné napamování si ukážeme na následující ukázce. &lt;/p&gt;  &lt;p&gt;Máme vytvořenou službu, která nabízí pro jednoduchost pouze dvě metody&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[ServiceContract]&lt;br /&gt;[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; EshopService&lt;br /&gt;{&lt;br /&gt;    [WebGet(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;/Products?format={format}&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    [Description(&lt;span style="color:#006080;"&gt;&amp;quot;Vrati seznam vsech produktu&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ProductCollection FindAll(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; format)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Equals(&lt;span style="color:#006080;"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;, format, StringComparison.OrdinalIgnoreCase))&lt;br /&gt;            WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FakeDatabase.Products;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [WebGet(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;/Product/{id}&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    [Description(&lt;span style="color:#006080;"&gt;&amp;quot;Najde produkt podle zadaneho id&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Product Find(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; id)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; parsedId = 0;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.TryParse(id, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; parsedId))&lt;br /&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FakeDatabase.Products.Where(p =&amp;gt; p.ID == parsedId).FirstOrDefault();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Pro zobrazení všech produktů zadáme do prohlížeče adresu &lt;a title="http://localhost:8090/Eshop/Products" href="http://localhost:8090/Eshop/Products"&gt;http://localhost:8090/Eshop/Products&lt;/a&gt;. Jakmile budeme chtít ovšem zobrazovat např. objednávky, uživatele, kategorie, apod. stane se naše třída EshopService velice nepřehlednou a tudíž složitější na údržbu. Vytvořme si tedy novou třídu nazvanou OrderService, která bude sloužit pro práci s objednávkami. Stávající třídu EshopService přejmenujeme na ProductService.&lt;/p&gt;

&lt;p&gt;Ještě před vytvořením nové třídy by jsme si mohly vytvořit rozhraní, ve kterém budeme specifikovat příslušné metody. Rozhraní si můžeme pojmenovat IEntity a vypadá následovně:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IEntity&amp;lt;&lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; TColl, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; TEntity&amp;gt; &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; TColl : Collection&amp;lt;TEntity&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// Vrati seznam vsech polozek&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;format&amp;quot;&amp;gt;format (json, xml)&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    TColl FindAll(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; format);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// Podle id nalezne prislusnou polozku&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;id&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    TEntity Find(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; id);&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;A nyní již implementace zmiňované třídy OrderService. Všimněme si, že oproti původní EshopService je upravená adresa (UriTemplate) atributu WebGet. Jelikož namapujeme adresu Orders na třídu OrderService, není potřeba aby byla adresa operace ve tvaru /Orders/id ale stačí pouze id či ?format=format…&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[ServiceContract]&lt;br /&gt;[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; OrderService : IEntity&amp;lt;OrderCollection, Order&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; Implementation of IEntity&amp;lt;&lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; OrderCollection,&lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; Order&amp;gt;&lt;br /&gt;&lt;br /&gt;    [WebGet(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;?format={format}&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    [Description(&lt;span style="color:#006080;"&gt;&amp;quot;Vrati seznam vsech objednavek&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; OrderCollection FindAll(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; format)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Equals(&lt;span style="color:#006080;"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;, format, StringComparison.OrdinalIgnoreCase))&lt;br /&gt;            WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FakeDatabase.Orders;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [WebGet(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;{id}&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    [Description(&lt;span style="color:#006080;"&gt;&amp;quot;Najde objednavku podle zadaneho id&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Order Find(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; id)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; parsedId = 0;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.TryParse(id, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; parsedId))&lt;br /&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FakeDatabase.Orders.Where(p =&amp;gt; p.ID == parsedId).FirstOrDefault();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;a přejmenování EshopService na ProductService a úprava UriTemplate (viz. OrderService)&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[ServiceContract]&lt;br /&gt;[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ProductService : IEntity&amp;lt;ProductCollection, Product&amp;gt;&lt;br /&gt;{&lt;br /&gt;    [WebGet(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;?format={format}&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    [Description(&lt;span style="color:#006080;"&gt;&amp;quot;Vrati seznam vsech produktu&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ProductCollection FindAll(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; format)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Equals(&lt;span style="color:#006080;"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;, format, StringComparison.OrdinalIgnoreCase))&lt;br /&gt;            WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FakeDatabase.Products;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [WebGet(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;{id}&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    [Description(&lt;span style="color:#006080;"&gt;&amp;quot;Najde produkt podle zadaneho id&amp;quot;&lt;/span&gt;)]&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Product Find(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; id)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; parsedId = 0;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.TryParse(id, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; parsedId))&lt;br /&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FakeDatabase.Products.Where(p =&amp;gt; p.ID == parsedId).FirstOrDefault();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Když jsme si vytvořily takto dvě třídy byly by ideální aby se po zadání určitých dotazů provedly příslušné akce:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a title="http://localhost:8090/Eshop/Products" href="http://localhost:8090/Eshop/Products"&gt;http://localhost:8090/Eshop/Products&lt;/a&gt; – zobrazí se seznam souborů&lt;/li&gt;

  &lt;li&gt;&lt;a title="http://localhost:8090/Eshop/Products" href="http://localhost:8090/Eshop/Products/1"&gt;http://localhost:8090/Eshop/Products/1&lt;/a&gt; – zobrazí detail produktu s id=1&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://localhost:8090/Eshop/Orders"&gt;http://localhost:8090/Eshop/Orders&lt;/a&gt; – zobrazí seznam objednávek&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://localhost:8090/Eshop/Orders/1"&gt;http://localhost:8090/Eshop/Orders/1&lt;/a&gt; – zobrazí detail objednávky s id=1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Původní EshopService byla tedy rozdělena na ProductService a OrderService a v posledním kroku můžeme provést namapování, tak aby naše směrování bylo úspěšné. Otevřeme si soubor Global.asax, kde v metodě RegisterRoutes provedeme příslušné namapování&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; RegisterRoutes()&lt;br /&gt;{&lt;br /&gt;    var factory = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WebServiceHostFactory();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// Edit the base address of Service1 by replacing the &amp;quot;Service1&amp;quot; string below&lt;/span&gt;&lt;br /&gt;    RouteTable.Routes.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ServiceRoute(&lt;span style="color:#006080;"&gt;&amp;quot;Products&amp;quot;&lt;/span&gt;, factory, &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(ProductService)));&lt;br /&gt;    RouteTable.Routes.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ServiceRoute(&lt;span style="color:#006080;"&gt;&amp;quot;Orders&amp;quot;&lt;/span&gt;, factory, &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(OrderService)));&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Závěr&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jak můžeme vidět, implementace routování byla v naší aplikaci na dva řádky, takže nic moc složitého. V dalších dílech si ukážeme jak pracovat s jinými formáty než jenom xml či json, jak cachovat data, apod.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Seznamte+se%2c+routov%26%23225%3bn%26%23237%3b+je+zde%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Seznamte+se%2c+routov%26%23225%3bn%26%23237%3b+je+zde%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Seznamte+se%2c+routov%26%23225%3bn%26%23237%3b+je+zde%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx&amp;amp;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Seznamte+se%2c+routov%26%23225%3bn%26%23237%3b+je+zde%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Seznamte+se%2c+routov%26%23225%3bn%26%23237%3b+je+zde%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Seznamte+se%2c+routov%26%23225%3bn%26%23237%3b+je+zde%e2%80%a6&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx&amp;amp;;subject=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Seznamte+se%2c+routov%26%23225%3bn%26%23237%3b+je+zde%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/03/14/wcf-4-webhttp-services-seznamte-se-routov-n-je-zde.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236113" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category></item><item><title>WCF 4 – WebHttp Services – Jak na výjimky</title><link>http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx</link><pubDate>Wed, 17 Feb 2010 12:28:24 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236065</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/236065.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=236065</wfw:commentRss><description>&lt;p&gt;Když jsme vytvářely WCF služby komunikující klasicky pomocí SOAP zpráv, tak jsem využívaly FaultException pro odeslání chybové zprávy zpět klientovi. WebHttp Services nabízí podobnou funkcionalitu, akorát se používá třída WebFaultException, která dědí právě z FaultException. WebFaultException nabízí dvě varianty, klasickou a generickou.&lt;/p&gt;  &lt;p&gt;Když se podíváme na sluřbu EshopService, tak vidíme, že jsme si minule vytvořily metodu pro aktualizaci ceny nazvanou &lt;strong&gt;UpdateProductPrice&lt;/strong&gt;. Právě na této metodě si ukážeme první použití zpracování výjimek. Metoda přijímá dva parametry: id a price, kde oba tyto parametry musí být čísla. Přidáme tedy první podmínku, pokud se nepovede přetypovat řetězec na číslo, ukončíme metodu vyvoláním příslušné výjimky. Při vytváření WebFaultException nám stačí když uvedeme text chybové zprávy a příslušný HttpStatusCode (existuje celá řada těchto statusů např. NotFound, BadRequest, ServiceUnavailable, apod.). Upravená metoda tedy vypadá následovně (popis v komentářích)&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[Description(&lt;span style="color:#006080;"&gt;&amp;quot;Aktualizuje cenu u produktu s danym id&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[WebInvoke(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;/UpdateProductPrice/{id}?price={price}&amp;quot;&lt;/span&gt;, Method = &lt;span style="color:#006080;"&gt;&amp;quot;PUT&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; UpdateProductPrice(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; id, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; price)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; parsedId;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt; parsedPrice;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// nepodari-li se prevest id na cislo vyhod vyjimky&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.TryParse(id, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; parsedId))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WebFaultException&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#006080;"&gt;&amp;quot;parameter id must be a number&amp;quot;&lt;/span&gt;, System.Net.HttpStatusCode.BadRequest);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// nepodari-li se prevest price na cislo vyhod vyjimku&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;.TryParse(price, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; parsedPrice))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WebFaultException&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#006080;"&gt;&amp;quot;parameter price must be a number&amp;quot;&lt;/span&gt;, System.Net.HttpStatusCode.BadRequest);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// najdu produkt&lt;/span&gt;&lt;br /&gt;    Product p = (from c &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; FakeDatabase.Products&lt;br /&gt;                 &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; c.ID == parsedId&lt;br /&gt;                 select c).FirstOrDefault();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// pokud neexistuje, vyhod vyjimku&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (p == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WebFaultException&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Product with id={0} does not exist&amp;quot;&lt;/span&gt;, parsedId),&lt;br /&gt;                                            System.Net.HttpStatusCode.NotFound);&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        p.Price = parsedPrice;&lt;br /&gt;        &lt;br /&gt;} &lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;A na straně klienta pouze upravíme již existující metodu &lt;strong&gt;UpdateProductPrice_1&lt;/strong&gt;, kde jsme přidaly 3 parametry: id, price a format aby jsme si ukázaly jak vypadají výjimky odeslané buď pomocí XML či JSON. Kromě přidání parametrů si ještě vypíšeme StatusCode.&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; UpdateProductPrice_1(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; id, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; price, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; format)&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;ID: &amp;quot;&lt;/span&gt; + id);&lt;br /&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Price: &amp;quot;&lt;/span&gt; + price);&lt;br /&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Format: &amp;quot;&lt;/span&gt; + format);&lt;br /&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;\n\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpClient client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(URI))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// budu aktualizovat produkt s id = 1&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; strUri = &lt;span style="color:#006080;"&gt;&amp;quot;UpdateProductPrice/&amp;quot;&lt;/span&gt; + id + &lt;span style="color:#006080;"&gt;&amp;quot;?price=&amp;quot;&lt;/span&gt; + price;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// pridame hlavicku s informaci o formatu odpovedi&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpRequestMessage request = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpRequestMessage(&lt;span style="color:#006080;"&gt;&amp;quot;PUT&amp;quot;&lt;/span&gt;, strUri))&lt;br /&gt;        {&lt;br /&gt;            request.Headers.Accept.AddString(format);&lt;br /&gt;            request.Content = HttpContent.CreateEmpty();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color:#008000;"&gt;// odeslu pozadavek&lt;/span&gt;&lt;br /&gt;            HttpResponseMessage response = client.Send(request);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color:#008000;"&gt;// zobrazim status a vysledek&lt;/span&gt;&lt;br /&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Status: &amp;quot;&lt;/span&gt; + response.StatusCode);&lt;br /&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Response: &amp;quot;&lt;/span&gt; + response.Content.ReadAsString());&lt;br /&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;\n\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Pro otestování zavoláme metodu UpdateProductPrice_1 hned několikrát:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#008000;"&gt;// bad request: id&lt;/span&gt;&lt;br /&gt;UpdateProductPrice_1(&lt;span style="color:#006080;"&gt;&amp;quot;str&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt;);&lt;br /&gt;UpdateProductPrice_1(&lt;span style="color:#006080;"&gt;&amp;quot;str&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;application/xml&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#008000;"&gt;// bad request: price&lt;/span&gt;&lt;br /&gt;UpdateProductPrice_1(&lt;span style="color:#006080;"&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;,&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt;);&lt;br /&gt;UpdateProductPrice_1(&lt;span style="color:#006080;"&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;application/xml&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#008000;"&gt;// not found&lt;/span&gt;&lt;br /&gt;UpdateProductPrice_1(&lt;span style="color:#006080;"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;234&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt;); &lt;br /&gt;UpdateProductPrice_1(&lt;span style="color:#006080;"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;234&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;application/xml&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#008000;"&gt;// ok&lt;/span&gt;&lt;br /&gt;UpdateProductPrice_1(&lt;span style="color:#006080;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;234&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt;);&lt;br /&gt;UpdateProductPrice_1(&lt;span style="color:#006080;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;234&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;application/xml&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;A výsledek bude vypadat následovně:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;============================================================&lt;br /&gt;ID: str&lt;br /&gt;Price: NULL&lt;br /&gt;Format: application/json&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: BadRequest&lt;br /&gt;Response: &lt;span style="color:#006080;"&gt;&amp;quot;parameter id must be a number&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============================================================&lt;br /&gt;ID: str&lt;br /&gt;Price: NULL&lt;br /&gt;Format: application/xml&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: BadRequest&lt;br /&gt;Response: &amp;lt;&lt;span style="color:#008000;"&gt;;string xmlns=&amp;quot;http://schemas.microsoft.com/2003/10/Serialization/&amp;quot;&amp;gt;parameter id must be a number&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============================================================&lt;br /&gt;ID: -1&lt;br /&gt;Price: NULL&lt;br /&gt;Format: application/json&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: BadRequest&lt;br /&gt;Response: &lt;span style="color:#006080;"&gt;&amp;quot;parameter price must be a number&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============================================================&lt;br /&gt;ID: -1&lt;br /&gt;Price: NULL&lt;br /&gt;Format: application/xml&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: BadRequest&lt;br /&gt;Response: &amp;lt;&lt;span style="color:#008000;"&gt;;string xmlns=&amp;quot;http://schemas.microsoft.com/2003/10/Serialization/&amp;quot;&amp;gt;parameter price must be a number&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============================================================&lt;br /&gt;ID: 0&lt;br /&gt;Price: 234&lt;br /&gt;Format: application/json&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: NotFound&lt;br /&gt;Response: &lt;span style="color:#006080;"&gt;&amp;quot;Product with id=0 does not exist&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============================================================&lt;br /&gt;ID: 0&lt;br /&gt;Price: 234&lt;br /&gt;Format: application/xml&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: NotFound&lt;br /&gt;Response: &amp;lt;&lt;span style="color:#008000;"&gt;;string xmlns=&amp;quot;http://schemas.microsoft.com/2003/10/Serialization/&amp;quot;&amp;gt;Product with id=0 does not exist&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============================================================&lt;br /&gt;ID: 1&lt;br /&gt;Price: 234&lt;br /&gt;Format: application/json&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: OK&lt;br /&gt;Response: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============================================================&lt;br /&gt;ID: 1&lt;br /&gt;Price: 234&lt;br /&gt;Format: application/xml&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: OK&lt;br /&gt;Response: &lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Vylepšení:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Místo vyhození výjimky s pouhým textovým popisem si vytvoříme třídu, která bude obsahovat více informací o vzniklém problému. Vytvoříme si tedy třídu NotFoundException, která bude obsahovat následující vlastnosti Code, Message a Description (tyto vlastnosti jsou pouze pro demonstraci použití):&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; NotFoundException&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Code { get; set; }&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Message { get; set; }&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Description { get; set; }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Když si tedy uživatel zažádá o produkt s ID, které neexistuje, vrátíme mu trošku více informací proč ten produkt s ID třeba neexistuje&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#008000;"&gt;// pokud neexistuje, vyhod vyjimku&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (p == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;   NotFoundException detail = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NotFoundException&lt;br /&gt;   {&lt;br /&gt;       Code = 404,&lt;br /&gt;       Message = &lt;span style="color:#006080;"&gt;&amp;quot;Product not found&amp;quot;&lt;/span&gt;,&lt;br /&gt;       Description = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;There is no product with id={0}. Change ID and try again&amp;quot;&lt;/span&gt;, parsedId)&lt;br /&gt;   };&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WebFaultException&amp;lt;NotFoundException&amp;gt;(detail, System.Net.HttpStatusCode.NotFound);&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;A na straně klienta jsme si vytvořily pomocnou metodu, která vezme objekt HttpResponseMessage a format a je-li StatusCode roven NotFound, provedeme deserializaci v závislosti na uvedeném formátu. Deserializací získáme objekt NotFoundException a budeme si moct přečíst doplňující informace&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GetExceptionDetail(HttpResponseMessage response, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; format)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// abych mohl vicekrat cist obsah nahraju ho do bufferu&lt;/span&gt;&lt;br /&gt;    response.Content.LoadIntoBuffer();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// zobrazim StatusCode&lt;/span&gt;&lt;br /&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Status: &amp;quot;&lt;/span&gt; + response.StatusCode);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (response.StatusCode == System.Net.HttpStatusCode.NotFound)&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        NotFoundException detail = format == &lt;span style="color:#006080;"&gt;&amp;quot;application/xml&amp;quot;&lt;/span&gt;&lt;br /&gt;                                    ? response.Content.ReadAsDataContract&amp;lt;NotFoundException&amp;gt;()&lt;br /&gt;                                    : response.Content.ReadAsJsonDataContract&amp;lt;NotFoundException&amp;gt;();&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (detail != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;  Code: {0}&amp;quot;&lt;/span&gt;, detail.Code);&lt;br /&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;  Message: {0}&amp;quot;&lt;/span&gt;, detail.Message);&lt;br /&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;  Description: {0}&amp;quot;&lt;/span&gt;, detail.Description);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Po opětovném zavolání metod &lt;strong&gt;UpdateProductPrice_1&lt;/strong&gt; se výsledek změní pouze u té se StatusCode = NotFound následovně&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;============================================================&lt;br /&gt;ID: 0&lt;br /&gt;Price: 234&lt;br /&gt;Format: application/json&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: NotFound&lt;br /&gt;  Code: 404&lt;br /&gt;  Message: Product not found&lt;br /&gt;  Description: There is no product &lt;span style="color:#0000ff;"&gt;with&lt;/span&gt; id=0. Change ID and try again&lt;br /&gt;Response: {&lt;span style="color:#006080;"&gt;&amp;quot;Code&amp;quot;&lt;/span&gt;:404,&lt;span style="color:#006080;"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt;:&lt;span style="color:#006080;"&gt;&amp;quot;There is no product with id=0. Change ID and try again&amp;quot;&lt;/span&gt;,&lt;span style="color:#006080;"&gt;&amp;quot;Message&amp;quot;&lt;/span&gt;:&lt;span style="color:#006080;"&gt;&amp;quot;Product not found&amp;quot;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============================================================&lt;br /&gt;ID: 0&lt;br /&gt;Price: 234&lt;br /&gt;Format: application/xml&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Status: NotFound&lt;br /&gt;  Code: 404&lt;br /&gt;  Message: Product not found&lt;br /&gt;  Description: There is no product &lt;span style="color:#0000ff;"&gt;with&lt;/span&gt; id=0. Change ID and try again&lt;br /&gt;Response: &amp;lt;&lt;span style="color:#008000;"&gt;;NotFoundException xmlns=&amp;quot;http://schemas.datacontract.org/2004/07/Eshop.Service&amp;quot; xmlns:i=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&amp;lt;Code&amp;gt;404&amp;lt;/Code&amp;gt;&amp;lt;Description&amp;gt;There is no product with id=0. Change ID and try again&amp;lt;/Description&amp;gt;&amp;lt;Message&amp;gt;Product not found&amp;lt;/Message&amp;gt;&amp;lt;/NotFoundException&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;============================================================&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Závěr:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;V dnešním krátkém příspěvku jsme si ukázaly jak můžeme na straně služby vyvolat výjimku a na straně klienta si přečíst informace o výjimce. Kromě jednoduchých textových výjimek jsme si ukázaly možnost, jak vytvořit vlastní třídy s vlastnostmi obsahující mnohem více informací o výjimce a jak tuto třídu poté deserializovat na straně klienta ke zjištění oněch dodatečných informací. Jak vidíte, práce s výjimkami je zde velice jednoduchá. V příštím článku se nejspíše podíváme na možnosti cacheování.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Jak+na+v%26%23253%3bjimky" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Jak+na+v%26%23253%3bjimky" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Jak+na+v%26%23253%3bjimky" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx&amp;amp;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Jak+na+v%26%23253%3bjimky" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Jak+na+v%26%23253%3bjimky" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Jak+na+v%26%23253%3bjimky&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx&amp;amp;;subject=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Jak+na+v%26%23253%3bjimky" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/17/wcf-4-webhttp-services-jak-na-v-jimky.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236065" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/XML/default.aspx">XML</category></item><item><title>WCF 4 – WebHttp Services – Je libo Xml nebo JSON</title><link>http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx</link><pubDate>Tue, 09 Feb 2010 13:41:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236054</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/236054.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=236054</wfw:commentRss><description>&lt;p&gt;WebHttp Services s sebou přínáší další zajímavou funkcionalitu, kterou si na následujících několika řádcích představíme. V minulých dílech jsem komunikoval se službou pouze prostřednictvím xml requestů a výsledkem byl vždy i xml response. Pokud služby nejsou nijak nastaveny, jejich defaultní chování je právě zabalit response do xml.&lt;/p&gt;  &lt;p&gt;Pojďme se tedy podívat jak ovlivnit výsledný formát odpovědi.&lt;/p&gt;  &lt;p&gt;První důležitou informací je, že pokud pošlu dotaz ve formátu XML či JSON, tak ho vždy dokáže moje služba zpracovat i v případě, že bude v konfiguračním souboru web.config nastaveno automaticFormatSelectionEnabled=&amp;quot;false&amp;quot;. Toto nastavení se týká pouze odchozích (response) zpráv !&lt;/p&gt;  &lt;p&gt;V mojí aplikaci jsem si vytvořil novou metodu nazvanou AddProduct, na které budu demonstrovat použití jednotlivýc způsobů k tomu aby jsme docílil požadovaného výsledku:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Eshop.Service&lt;/strong&gt;&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[Description(&lt;span style="color:#006080;"&gt;&amp;quot;Vlozi produkt do kolekce&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[WebInvoke(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;/AddProduct&amp;quot;&lt;/span&gt;, Method = &lt;span style="color:#006080;"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Product AddProduct(Product product)&lt;br /&gt;{&lt;br /&gt;    product.ID = FakeDatabase.Products.Max(p =&amp;gt; p.ID) + 1;&lt;br /&gt;    FakeDatabase.Products.Add(product);&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; product;&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Eshop.Client&lt;/strong&gt;&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; AddProduct(Product productToCreate)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpClient client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(URI))&lt;br /&gt;    {&lt;br /&gt;        HttpContent content = HttpContentExtensions.CreateDataContract&amp;lt;Product&amp;gt;(productToCreate);&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// poslu pozadavek POST na adresu http://localhost:8090/Eshop/AddProduct&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpResponseMessage response = client.Post(&lt;span style="color:#006080;"&gt;&amp;quot;AddProduct&amp;quot;&lt;/span&gt;, content))&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Response:&amp;quot;&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(response.Content.ReadAsString());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Zde si vytvořím metodu AddProduct, kde pouze zavolám mojí nově vytvořenou metodu na straně služby. &lt;strong&gt;Než ovšem porvedeme zavolání mojí metody nastavíme ve web.configu hodnotu automaticFormatSelectionEnabled na false&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;automaticFormatSelectionEnabled=&amp;quot;false&amp;quot;&lt;/h3&gt;

&lt;p&gt;Po zavolání AddProduct, tedy pošleme na službu XML a služba nám vrátí rovněž XML (defaultní chování)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_2725E634.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_78EBEA79.png" width="644" height="94" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Pokud ovšem někdo pošle dotaz ve formátu JSON tak jak jsem uvedl výše, služba se s ním lehce vypořádá a výsledek bude stejný. Akorát v metodě AddProduct na straně klienta použíjeme &lt;em&gt;HttpContentExtensions.CreateJsonDataContract&lt;/em&gt; místo původního &lt;em&gt;ttpContentExtensions.CreateDataContract. &lt;/em&gt;Pokud budu chtít odpovídat ve formátu JSON, stačí pouze nastavit vlastnost ResponseFormat atributu WebInvoke na WebMessageFormat.Json. Z předchozích pár řádků vyplývá, že pokud pošleme dotaz v jakémkoliv formátu (xml nebo json), odpověd bude mít vždy takový tvar jaký bude uveden ve vlastnosti ResponseFormat (default: XML)&lt;/p&gt;

&lt;h3&gt;automaticFormatSelectionEnabled=&amp;quot;true&amp;quot;&lt;/h3&gt;

&lt;p&gt;Pokud ovšem nastavíme automaticFormatSelectionEnabled na true, bude chování trošku odlišnější. Při volbě formátu pro odchozí zprávu se postupuje následujícími kroky:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;WCF se podívá na vlastnost AcceptHeader objektu request, pokud nenajde odpovídající honodtu formátu podívá se dále na …&lt;/li&gt;

  &lt;li&gt;vlastnost ContentType objektu request, pokud nenajde odpovídající hodnotu formátu podívá se dále na …&lt;/li&gt;

  &lt;li&gt;hodnotu ResponseFormat odpovídající operace&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tzn. v našen případě, když pošleme dotaz ve formátu XML, vrátí se nám odpověd v XML, pokud bude požadavek v JSON, rovněž i odpověď bude v JSON.&lt;/p&gt;

&lt;p&gt;Co když ale budeme chtít poslat dotaz ve formátu XML, ale jako odpověď budeme vyžadovat JSON? Jak na to? Když se podíváte o pár řádků výše, podle čeho WCF rozhoduje o formátu odpovědi, tak na prvním místě je AcceptHeader a hned za ním ContentType. My když pomocí CreateDataContract či CreateJsonDataContract vytvoříme objekt HttpContent, tak v něm je nastaven pouze ContentType bud na “application/xml” nebo “application/json” tzn. že pomocí AcceptHeader můžeme ovlivnit výstupní formát tím, že upravíme hlavičku dotazu. Na následujícím kódu můžete vidět jak na to:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; AddProduct(Product productToCreate)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpClient client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(URI))&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpRequestMessage request = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpRequestMessage(&lt;span style="color:#006080;"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;AddProduct&amp;quot;&lt;/span&gt;))&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color:#008000;"&gt;// do hlavicky pridam informace o vystupnim formatu&lt;/span&gt;&lt;br /&gt;           request.Headers.Accept.AddString(&lt;span style="color:#006080;"&gt;&amp;quot;application/xml&amp;quot;&lt;/span&gt;);&lt;br /&gt;           &lt;span style="color:#008000;"&gt;// vytvorim si obsah ktery budu posilat&lt;/span&gt;&lt;br /&gt;           request.Content = HttpContentExtensions.CreateJsonDataContract&amp;lt;Product&amp;gt;(productToCreate);&lt;br /&gt;           &lt;span style="color:#008000;"&gt;// poslu pozadavek na adresu http://localhost:8090/Eshop/AddProduct&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpResponseMessage response = client.Send(request))&lt;br /&gt;           {&lt;br /&gt;               Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Response:&amp;quot;&lt;/span&gt;);&lt;br /&gt;               Console.WriteLine(response.Content.ReadAsString());&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Vytvořím si pouze objekt HttpRequestMessage, kde specifikuji o jakou operaci se jedná a na jakou adresu ten dotaz budu posílat. Pak přidám do hlavičky informací o formátu výstupu a nakonec tento požadavek odešllu. Jak můžete vidět, vytvářím požadavek v JSON formátu, ale výsledek chci ve formátu xml&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_0FCABBF6.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_068E80B5.png" width="644" height="103" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;V poslední ukázce se podíváme na možnost jak si explicitně zvolit výstupní formát. pro tuto ukázku použíjeme již vytvořenou metodu GetProducts, které přidáme parametr nazvaný format, podle kterého si bude moct klient specifikovat v jakém formátu data očekává&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[WebGet(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;/Products?format={format}&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ProductCollection Products(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; format)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Equals(&lt;span style="color:#006080;"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;, format, StringComparison.OrdinalIgnoreCase))&lt;br /&gt;        WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FakeDatabase.Products;&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Přidáním parametru format, jsme musely upravit vlastnost UriTemplate a přidat příslušnou podmínku. Pokud je hodnota parametru format rovna json, nastavím pomocí WebOperationContext třídy Format pro odchozí zpráv na JSON, jinak nechám defaultní hodnotu (XML). Na straně klienta musíme upravit naší metodu GetProducts následovně: (pouze přidáme informace o formátu)&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; GetProducts(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; format)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// ujistete se ze vase adresa konci lomitkem !!!&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpClient client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(URI))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// poslu pozadavek GET na adresu http://localhost:8090/Eshop/Products&lt;/span&gt;&lt;br /&gt;        HttpResponseMessage response = client.Get(&lt;span style="color:#006080;"&gt;&amp;quot;Products?format=&amp;quot;&lt;/span&gt; + format);&lt;br /&gt;&lt;br /&gt;        Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Response: [format={0}]&amp;quot;&lt;/span&gt;, format);&lt;br /&gt;        Console.WriteLine(response.Content.ReadAsString());&lt;br /&gt;        Console.WriteLine();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Pro otestování zavolám GetProducts(“json”) a GetProducts(“default”) a výsledkem bude při prvním volání odpověď ve formátu json, podruhé ve formátu xml&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_7228BB29.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_317648ED.png" width="644" height="248" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;Závěr&lt;/h3&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;V dnešním článku jsme si ukázali jak se chovají WebHttp services při zpracování požadavků v XML či JSON formátu, poukázaly na důležitost nastavení atributu automatiFormatSelectionEnabled ve web.config souboru a celé to zakončili ukázkou jak ovlivnit formát odchozí zprávy. V dalším článku se podíváme na možnosti jak zpracovávat výjimky.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Je+libo+Xml+nebo+JSON" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Je+libo+Xml+nebo+JSON" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Je+libo+Xml+nebo+JSON" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx&amp;amp;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Je+libo+Xml+nebo+JSON" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Je+libo+Xml+nebo+JSON" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Je+libo+Xml+nebo+JSON&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx&amp;amp;;subject=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Je+libo+Xml+nebo+JSON" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/09/wcf-4-webhttp-services-je-libo-xml-nebo-json.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236054" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/XML/default.aspx">XML</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/JSON/default.aspx">JSON</category></item><item><title>WCF 4 – WebHttp Services – Vytvoření klienta</title><link>http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx</link><pubDate>Mon, 01 Feb 2010 14:16:13 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236048</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/236048.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=236048</wfw:commentRss><description>&lt;p&gt;V minulém &lt;a href="http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx"&gt;článku&lt;/a&gt; jsme si vytvořili jednoduchou službu, která obsahovala jednu metodu Products. Dnes si ukážeme jak vytvořit klienta, který nám umožní volat jednotlivé metody na straně služby.&lt;/p&gt;  &lt;p&gt;Pro vytvoření klienta máme několik možností, můžeme vužít &lt;a href="http://msdn.microsoft.com/en-us/library/bb908674(VS.100).aspx"&gt;WebChannelFactory&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest(VS.100).aspx"&gt;HttpWebRequest&lt;/a&gt; nebo &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx"&gt;WebClient&lt;/a&gt; Avšak dopuručené je použití třídy HttpClient. Tato třída je součástí knihovny &lt;a title="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644" href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644"&gt;WCF Rest Starter Kit Preview 2&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Vytvoříme si tedy Consolovou aplikaci v mém případě pojmenovanou Eshop.Client a přidáme potřebné reference na&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Microsoft.Http &lt;/li&gt;    &lt;li&gt;Microsoft.HttpExtensions &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Obě tyto knihovny najdeme po nainstalování WCF Rest Starter Kitu ve složce &lt;em&gt;C:\Program Files\Microsoft WCF REST\WCF REST Starter Kit Preview 2\Assemblies\ &lt;/em&gt;Dále musíme ve vlastnostech projektu změnit cílový framework na “.NET 4” z původního “.NET 4 client profile”. Je to z toho důvodu, že třída HttpClient má nějaké závislosti na plném .NETu 4&lt;/p&gt;  &lt;p&gt;Nyní se můžeme pustit do vytvoření klienta. Třída HttpClient nabízí 3 způsoby jak nainicializovat náš objekt&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;HttpClient() &lt;/li&gt;    &lt;li&gt;HttpClient(string baseAddress) – zadáme adresu služby jako řetězec &lt;/li&gt;    &lt;li&gt;HttpClient(Uri baseAddress) – zadáme adresu služby jako Uri objekt &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Já si ve své ukázkové aplikaci zvolím zlatou střední cestu a použiju adresu služby jako obyčejný řetězec. Instanci máme vytvořenou a ted musíme pouze poslat GET požadavek na danou adresu (Products) a služba by nám měla vrátit seznam všech produktů. Pro tento účel nabízí třída HttpClient metodu Get, která má opět několik variant, kde můžeme zadat např. parametry, ale já chci zavolat metodu, která nemá parametry tak použiju pouze variantu s jedním parametrem a to adresou (další varianty si ukážeme později)&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#008000;"&gt;// ujistete se ze vase adresa konci lomitkem !!!&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpClient client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost:8090/Eshop/&amp;quot;&lt;/span&gt;))&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// poslu pozadavek GET na adresu http://localhost:8090/Eshop/Products&lt;/span&gt;&lt;br /&gt;    HttpResponseMessage response = client.Get(&lt;span style="color:#006080;"&gt;&amp;quot;Products&amp;quot;&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// vysledek vypisu do console&lt;/span&gt;&lt;br /&gt;    Console.WriteLine(response.Content);&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Výsledkem po volání metody Get je objekt typu HttpResponseMessage, kde pouze pomocí vlastnosti vypíšu obsah odpovědi do console. Docela užitečnou vlastností je StatusCode, kde jsme schopni zjistit stav – 200 OK, atd.&lt;/p&gt;

&lt;p&gt;Po spuštění naší klientské aplikace můžeme vidět následující odpověď&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_428C1A3A.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_00A534EC.png" width="644" height="79" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Tato odpověď není příliš dobrá a proto upravíme výpis do console. Na vlasntosti Content zavoláme metodu ReadAsString(), která nám převedě odpověď na smysluplnější řetězec. Další možností je zavolat metodu ReadAsStream(), která vrátí objekt Stream. Po úpravě může vypadat stejné volání následovně:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_346D2B3D.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_48569806.png" width="644" height="180" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Už je to o něco lepší, ale pořád se v tom docela špatně čte, takže uděláme poslední úpravu. Přidáme using na System.Xml.Linq a místo metody ReadAsString() použijeme metodu ReadAsXElement(). Výsledek bude vypadat následovně:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_030E1B10.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_5E4CDDCB.png" width="644" height="367" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Momentálně vypadá formát odpovědi docela pěkně na čtení, ale lépe než s XML souborem se nám bude asi pracovat přímo z daným objektem, v tomto případě s kolekcí ProductCollection. Pro tento případ budeme muset přidat referenci na System.Runtime.Serialization a samozřejmě na naší službu Eshop.Service. Upravíme tedy kód následovně:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#008000;"&gt;// ujistete se ze vase adresa konci lomitkem !!!&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpClient client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost:8090/Eshop/&amp;quot;&lt;/span&gt;))&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// poslu pozadavek GET na adresu http://localhost:8090/Eshop/Products&lt;/span&gt;&lt;br /&gt;    HttpResponseMessage response = client.Get(&lt;span style="color:#006080;"&gt;&amp;quot;Products&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    ProductCollection coll = response.Content.ReadAsDataContract&amp;lt;ProductCollection&amp;gt;();&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color:#008000;"&gt;// projdu kolekci a vypisu informace&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (Product p &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; coll)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;ID: {0}\tName: {1}&amp;quot;&lt;/span&gt;, p.ID, p.Name);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;A nyní vypadá výsledek takto:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_6059B6C7.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_11E5245D.png" width="334" height="243" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Poznámka:&lt;em&gt; Na začátku při vytváření mojí fake databáze jsem udělal menší chybičku, která by nám mohla vadit a to v případě, že provedeme update nějakého produktu tak při zavolání metody ReadAsDataContract&amp;lt;ProductCollection&amp;gt; dojde k zavolání bezparametrického konstrukturou, což nám vždycky vrátí defaultní hodnoty. Proto si ve třídy Product Collection vytvoříme další konstruktor s nějakým parametrem a načítání dat přesuneme do tohoto konstruktoru:&lt;/em&gt;&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ProductCollection(&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; loadData)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (loadData)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 1, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Bunda&amp;quot;&lt;/span&gt;, CategoryId = 1, Price = 3000 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 2, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Triko&amp;quot;&lt;/span&gt;, CategoryId = 1, Price = 500 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 3, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Mikina&amp;quot;&lt;/span&gt;, CategoryId = 1, Price = 200 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 4, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Kosile&amp;quot;&lt;/span&gt;, CategoryId = 1, Price = 1500 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 5, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Parfem&amp;quot;&lt;/span&gt;, CategoryId = 2, Price = 5000 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 6, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Hodinky&amp;quot;&lt;/span&gt;, CategoryId = 2, Price = 6000 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 7, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Retizek&amp;quot;&lt;/span&gt;, CategoryId = 2, Price = 200 });&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;První část máme za sebou a dále si vytvoříme na straně služby novou metodu UpdateProductPrice, která bude sloužit pro změnu ceny daného produktu. Jako parametry bude id produktu a nová cena. Jak si můžete všimnout o pár řádků níže služba je označená atributem WebInvoke, který nabízí kromě stejných vlastností jako WebGet i jednu vlastnost navíc nazvanou Method. Pomocí této vlastnosti můžeme specifikovat o jakou akci se bude jednat např. POST, PUT.&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[Description(&lt;span style="color:#006080;"&gt;&amp;quot;Aktualizuje cenu u produktu s danym id&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[WebInvoke(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;/UpdateProductPrice/{id}?price={price}&amp;quot;&lt;/span&gt;, Method = &lt;span style="color:#006080;"&gt;&amp;quot;PUT&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; UpdateProductPrice(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; id, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; price)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; parsedId;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt; parsedPrice;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.TryParse(id, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; parsedId))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;.TryParse(price, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; parsedPrice))&lt;br /&gt;        {&lt;br /&gt;            Product p = (from c &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Products()&lt;br /&gt;                         &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; c.ID == parsedId&lt;br /&gt;                         select c).FirstOrDefault();&lt;br /&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (p != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;                p.Price = parsedPrice;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Co je v tomto kódu nového:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Description – jedná se o atribut, kterým můžeme popsat naší metodu. Tento popis bude viditelný na stránce s nápovědou (/help) &lt;/li&gt;

  &lt;li&gt;UriTemplate obsahuje následující adresu &lt;span style="color:#006080;"&gt;&lt;font color="#ffffff"&gt;&amp;quot;/UpdateProductPrice/{id}?price={price}&amp;quot;&lt;/font&gt;&lt;/span&gt; 

    &lt;ul&gt;
      &lt;li&gt;UpdateProductPrice – název metody &lt;/li&gt;

      &lt;li&gt;{id} – id produktu, nad kterým budeme chtít provést update &lt;/li&gt;

      &lt;li&gt;za otazníkem následují další parametry. V našem případě price={price}&amp;quot; &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Poznámka 1: &lt;/em&gt;&lt;em&gt;Názvy ve složených závorkách musí odpovídat názvům parametrům v dané metodě. Např. použití price={price1}&amp;quot; vyvolá výjimku při spuštění služby, ale price123={price}&amp;quot; je naprosto v pohodě&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Poznámka 2: &lt;/em&gt;&lt;em&gt;Vstupní parametry musí být typu string či jiný objekt (nějaká naše třída), ale nelze použít int, decimal atd.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Na straně klienta vytvoříme příslušnou metodu, která provede update daného produktu:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; UpdateProductPrice_1()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpClient client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(URI))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// budu aktualizovat produkt s id = 1&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; strUri = &lt;span style="color:#006080;"&gt;&amp;quot;UpdateProductPrice/1?price=19900&amp;quot;&lt;/span&gt;;&lt;br /&gt;        HttpResponseMessage response = client.Put(strUri, HttpContent.CreateEmpty());&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Jediné co zde udělám vytvoření instance HttpClienta, nastavení Uri adresy metody s příslušnými parametry a zavoláním metody Put, která má několik variant kde jedna z nich přijímá jako parametr adresu operace a HttpContent, který můžeme nastavit na Empty, jelikož vše potřebné nastavíme pomocí parametrů v adrese.&lt;/p&gt;

&lt;p&gt;Pro otestování si zabalíme kód pro získání všech produktů do metody pojmenované GetProducts a upravíme v cyklu foreach kolekci coll tak, aby vzala pouze první prvek (aby jsme si nevypisovaly zbytečně všechny produkty) a do detailu o produktu přidáme informaci o ceně. Nejdříve tedy zavoláme metodu GetProducts, hned po ní Updateproduct_1, která změní původní cenu na novou a nakonec opět GetProducts, aby jsme si ověřili, zda opravdu došlo ke změně hodnoty:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;{&lt;br /&gt;    GetProducts();&lt;br /&gt;    UpdateProductPrice_1();&lt;br /&gt;    GetProducts();&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Výsledek po volání vypadá následovně:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_10345889.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_2FE33251.png" width="372" height="84" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Další způsob aktualizace produktu bude takový, že jako parametr bude přímo objekt Product. Vytvoříme metody UpdateProduct, která bude velice podobná metodě UpdateProductPrice, akorát se bude lišit druhý parametr:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[Description(&lt;span style="color:#006080;"&gt;&amp;quot;Aktualizuje produkt s danym id&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[WebInvoke(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;/UpdateProduct/{id}&amp;quot;&lt;/span&gt;, Method = &lt;span style="color:#006080;"&gt;&amp;quot;PUT&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; UpdateProduct(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; id, Product product)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; parsedId;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.TryParse(id, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; parsedId))&lt;br /&gt;    {&lt;br /&gt;        Product p = (from c &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Products()&lt;br /&gt;                     &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; c.ID == parsedId&lt;br /&gt;                     select c).FirstOrDefault();&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (p != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            p.Name = product.Name;&lt;br /&gt;            p.CategoryId = product.CategoryId;&lt;br /&gt;            p.Price = product.Price;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;A zavolání této metod z klienta provedu tak, že jako uri adresu nastavím UpdateProduct/1, vytvořím si novou instanci třídy Product a pomocí metody CreateDataContract třídy HttpContentExtensions vytvořím objekt typu HttpContent, který předám jako druhý parametr metody Put: Objekt product totiž nelze předat pomocí query stringu a tak musíme tento objekt zabalit a poslat na příslušnou adresu. Když se podíváme na stránku s nápovědou &lt;a title="http://localhost:8090/Eshop/help/operations/UpdateProduct" href="http://localhost:8090/Eshop/help/operations/UpdateProduct"&gt;http://localhost:8090/Eshop/help/operations/UpdateProduct&lt;/a&gt; můžeme vidět ukázku jak má vypadat požadavek buď ve tvaru XML či JSON:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_75F3EF64.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_3551A2F5.png" width="499" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Kód na straně klienta:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; UpdateProduct_2()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpClient client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(URI))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// budu aktualizovat produkt s id = 1&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; strUri = &lt;span style="color:#006080;"&gt;&amp;quot;UpdateProduct/1&amp;quot;&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// vytvorim si novy produkt u ktereho provedu update&lt;/span&gt;&lt;br /&gt;        Product p = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product&lt;br /&gt;        {&lt;br /&gt;            Name = &lt;span style="color:#006080;"&gt;&amp;quot;Novy produkt&amp;quot;&lt;/span&gt;,&lt;br /&gt;            CategoryId = 2,&lt;br /&gt;            Price = 2500&lt;br /&gt;        };&lt;br /&gt;        HttpContent content = HttpContentExtensions.CreateDataContract&amp;lt;Product&amp;gt;(p);&lt;br /&gt;        HttpResponseMessage response = client.Put(strUri, content);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;A aby jsme to mohly odzkoušet, ještě upravíme main metodu kde místo UpdateProductPrice_1() budeme volat naší nově vytvořenou metodu UpdateProduct_2()&lt;/p&gt;

&lt;p&gt;Výsledek může vypadat takto:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_05475174.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_3DF1FB81.png" width="378" height="68" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Ještě než dnešní povídání zakončím, vytvoříme si nějakou metodu pro vytvoření:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[Description(&lt;span style="color:#006080;"&gt;&amp;quot;Metoda pro vytvoreni noveho produktu&amp;quot;&lt;/span&gt;)]&lt;br /&gt;[WebInvoke(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;/CreateProduct&amp;quot;&lt;/span&gt;, Method = &lt;span style="color:#006080;"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; CreateProduct(Product productToCretae)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// pokud neexistuje produkt s danym id, vloz ho do kolekce produktu&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!FakeDatabase.Products.Any(p =&amp;gt; p.ID == productToCretae.ID))&lt;br /&gt;    {&lt;br /&gt;        FakeDatabase.Products.Add(productToCretae);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;No a klient můžeme velice jednoduše tuto metodu zavolat a vytvořit nový produkt: Kód vypadá téměř totožně jako metoda pro update&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; CreateProduct()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (HttpClient client = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HttpClient(URI))&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// budu aktualizovat produkt s id = 1&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; strUri = &lt;span style="color:#006080;"&gt;&amp;quot;CreateProduct&amp;quot;&lt;/span&gt;;&lt;br /&gt;        Product p = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product&lt;br /&gt;        {&lt;br /&gt;            ID = 22,&lt;br /&gt;            Name = &lt;span style="color:#006080;"&gt;&amp;quot;Nov ytvoreny produkt&amp;quot;&lt;/span&gt;,&lt;br /&gt;            CategoryId = 2,&lt;br /&gt;            Price = 600&lt;br /&gt;        };&lt;br /&gt;        HttpResponseMessage response = client.Post(strUri, HttpContentExtensions.CreateDataContract&amp;lt;Product&amp;gt;(p));&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Pro otestování jsem si opět upravil metodu GetProducts, kde si nyní z kolekce vyberu poslední prvek, abych zjistil zda se mi můj produkt opravdu vytvořil. Zde je výsledek: Nejdříve jsem si získal poslední produkt (ID=7), provedl vytvoření nového produktu a poté získal znovu poslední produkt, v tomto případě to už bude nově vytvořený produkt (ID=22)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_390F47C5.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_71B9F1D2.png" width="475" height="81" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;Závěr:&lt;/h3&gt;

&lt;p&gt;Dnes jsme si ukázali jak vytvořit klienta a volat jednotlivé metody na straně služby, jak tuto odpověď zobrazit či deserializovat do konkrétního typu. Dále jak vytvořit metodu pro update, která přijímala buď jednotlivé parametry jako string hodnoty nebo parametry jako uživatelem definovaný typ např. třída Product. A v posledním případě zde byla ukázka jak vytvořit a volat metody pro vytváření nějakých objektů v našem případě vytvoření nového produktu. V příším díle bych rád ukázal jednotlivé možnosti formátování&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;XML – XML = tenhle způsob komunikace jsme momentálně používal ve svých ukázkách&lt;/li&gt;

  &lt;li&gt;XML – JSON – ukázka jak poslat request ve formátu XML a očekávat response ve formátu JSON&lt;/li&gt;

  &lt;li&gt;JSON – XML – ukázka jak poslat request ve formátu JSON a očekávat response ve formátu XML&lt;/li&gt;

  &lt;li&gt;JSON – JSON – ukázka jak poslat request a očekávat response ve formátu JSON&lt;/li&gt;

  &lt;li&gt;jak přidat jednotlivým metodám parametr, podle kterého si uživatel zvolí v jakém formátu chce data očekávat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;a další různé věci z této oblasti.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Vytvo%c5%99en%26%23237%3b+klienta" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Vytvo%c5%99en%26%23237%3b+klienta" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Vytvo%c5%99en%26%23237%3b+klienta" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx&amp;amp;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Vytvo%c5%99en%26%23237%3b+klienta" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Vytvo%c5%99en%26%23237%3b+klienta" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Vytvo%c5%99en%26%23237%3b+klienta&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx&amp;amp;;subject=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Vytvo%c5%99en%26%23237%3b+klienta" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/02/01/wcf-4-webhttp-services-vytvo-en-klienta.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236048" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/XML/default.aspx">XML</category></item><item><title>WCF 4 – WebHttp Services – Seznámení</title><link>http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx</link><pubDate>Sat, 30 Jan 2010 20:44:12 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:236045</guid><dc:creator>lukaashek</dc:creator><slash:comments>3</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/236045.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=236045</wfw:commentRss><description>&lt;p&gt;Další novinkou ve WCF 4 budou WebHttp Services kde budeme mít možnost komunikovat se službou pomocí NE SOAP zpráv, ale klasických xml či json requestů. Dále můžeme poslat dotaz ve formátu xml (json) a služba nám odpoví v xml (json) formátu. Vše záleží na nás jak se nám to bude líbit. Co si ovšem většina z nás vývojářů zalíbí je možnost mít plně pod kontrolou jednotlivé adresy všech metod dané služby.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Poznámka:&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Jste-li vlastníkem VS 2010 ve verzi Beta, budete si muset doinstalovat přes extension managera šablonu pro vytvoření WebHtp služby (WCF Rest Service Template) a jakmile si tuto šablonu stáhnete pak budete moct vytvořit novou aplikaci typu “WCF Rest Service Application”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Šablona obsahuje předvytvořené třídy a další soubory, které si v rychlosti popíšeme:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Global.asax – bude nám sloužit pro nastavení routování – více později &lt;/li&gt;    &lt;li&gt;SampleItem.cs – soubor, která představuje nějaké data v naší službě &lt;/li&gt;    &lt;li&gt;Service1.cs – nmaše služba, která nabízí nějaké ukázkové metody &lt;/li&gt;    &lt;li&gt;Web.config – standardní configurační soubor &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Pro mojí ukázku si vytvoříme fiktivní databázi (třída) obsahující kategorie (CategoryCollection) a produkty (ProductCollection)&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; FakeDatabase&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; FakeDatabase()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// nactu categorie a produkty&lt;/span&gt;&lt;br /&gt;        Categories = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CategoryCollection();&lt;br /&gt;        Products = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ProductCollection();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; ProductCollection Products { get; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; set; }&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; CategoryCollection Categories { get; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; set; }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;ProductCollection + Product&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ProductCollection : Collection&amp;lt;Product&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ProductCollection()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 1, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Bunda&amp;quot;&lt;/span&gt;, CategoryId = 1, Price = 3000 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 2, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Triko&amp;quot;&lt;/span&gt;, CategoryId = 1, Price = 500 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 3, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Mikina&amp;quot;&lt;/span&gt;, CategoryId = 1, Price = 200 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 4, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Kosile&amp;quot;&lt;/span&gt;, CategoryId = 1, Price = 1500 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 5, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Parfem&amp;quot;&lt;/span&gt;, CategoryId = 2, Price = 5000 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 6, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Hodinky&amp;quot;&lt;/span&gt;, CategoryId = 2, Price = 6000 });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Product { ID = 7, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Retizek&amp;quot;&lt;/span&gt;, CategoryId = 2, Price = 200 });&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Product&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; ID { get; set; }&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name { get; set; }&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; CategoryId { get; set; }&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt; Price { get; set; }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;CategoryCollection + Category &lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CategoryCollection : Collection&amp;lt;Category&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; CategoryCollection()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Category { ID = 1, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Obleceni&amp;quot;&lt;/span&gt; });&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Category { ID = 2, Name = &lt;span style="color:#006080;"&gt;&amp;quot;Doplnky&amp;quot;&lt;/span&gt; });&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Category&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; ID { get; set; }&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name { get; set; }&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ProductCollection Products { get; set; }&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Můžeme začít implementovat naší službu. Nejdříve si přejmenujeme službu Service1.cs na EshopService. Vymažeme všechny metody uvnitř třídy a vytvoříme jednu novou metodu nazvanou Products, která vrátí seznam všech produktů v naší imaginární databázi:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;[WebGet(UriTemplate = &lt;span style="color:#006080;"&gt;&amp;quot;/Products&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ProductCollection Products()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FakeDatabase.Products;&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Jak můžeme vidět, služba je označená atributem WebGet, pomocí kterého zpřístupníme naší službu na GET požadavky ze strany klientů a pomocí vlastnosti UriTemplate nastavíme příslušnou adresu, na které bude metoda dostupná. Kromě vlastnosti UriTemplate nabízí třída WebGet další zajímavé vlastnosti:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;BodyStyle – pomocí tohoto atributu jsme schopni ovlivnit styl příchozí či odchozí zprávy &lt;/li&gt;

  &lt;ul&gt;
    &lt;li&gt;WebMessageBodyStyle.Bare – obsah všech zpráv není zabalen do speciálních elementů (ukázka níže – obrázek 1.) &lt;/li&gt;

    &lt;li&gt;WebMessageBodyStyle.Wrapped – obsah všech zpráv je zabalen do speciálních elementů (ukázka níže – obrázek 1.) &lt;/li&gt;

    &lt;li&gt;WebMessageBodyStyle.WrappedRequest – pouze obsah příchozí zprávy je zabalen do speciálního elementu&lt;/li&gt;

    &lt;li&gt;WebMessageBodyStyle.WappedResponse – pouze obsah odchozí zprávy je zabalen do speciálního elementu&lt;/li&gt;
  &lt;/ul&gt;

  &lt;li&gt;RequestFormat 
    &lt;ul&gt;
      &lt;li&gt;WebMessageFormat.Xml – požadavek musí přijít ve formátu XML &lt;/li&gt;

      &lt;li&gt;WebMessageFormat.Json – požadavek musí přijít ve formátu Json &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;ResponseFormat 
    &lt;ul&gt;
      &lt;li&gt;WebMessageFormat.Xml – odpověd bude ve formátu XML &lt;/li&gt;

      &lt;li&gt;WebMessageFormat.Json – odpověd bude ve formátu Json &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Obrázek 1.&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="2"&gt;
    &lt;tr&gt;
      &lt;td&gt;Bare&lt;/td&gt;

      &lt;td&gt;Wrapped&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_400FF929.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_2D5AFF72.png" width="244" height="127" /&gt;&lt;/a&gt;&lt;/td&gt;

      &lt;td&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_61FB5BAD.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_2CEECC7D.png" width="307" height="132" /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;p&gt;Naše služba má již vytvořenou potřebnou metodu a můžeme jí vyzkoušet. Předtím budeme ovšem muset provést pár drobných nastavení. Ve vlastnostech projektu specifikujeme port (aby jsme nemuseli pokaždé měnit kód v budoucích aplikacích na číslo portu, které se vygeneruje vždy jiné) a virtuální cestu&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_618F28B8.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_41741BFB.png" width="397" height="101" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Po těchto nastaveních bude naše metoda dostupná na adrese &lt;a href="http://localhost:8090/Eshop/Products"&gt;http://localhost:8090/Eshop/Products&lt;/a&gt;. Poslední úprava před spuštění se musí provést v souboru Global.asax v metodě RegisterRoute z důvodu, že jsme si přejmenovali třídu Service1.cs na EshopService.cs a pevně si nastavili virtuální cestu. Upravená metoda vypadá následovně:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; RegisterRoutes()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#008000;"&gt;// Edit the base address of Service1 by replacing the &amp;quot;Service1&amp;quot; string below&lt;/span&gt;&lt;br /&gt;    RouteTable.Routes.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ServiceRoute(&lt;span style="color:#006080;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WebServiceHostFactory(), &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(EshopService)));&lt;br /&gt;}&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Nyní by mělo být vše připraveno ke spuštění aplikace. Jakmile stisknete F5, spustí se development server na adrese &lt;a title="http://localhost:8090/Eshop/" href="http://localhost:8090/Eshop/"&gt;http://localhost:8090/Eshop/&lt;/a&gt; a pokud k této adrese přidáme Products, uvidíme výsledný XML soubor obsahující seznam produktů.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Poznámka:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Když vytváříte WebHttp služby je defaultně povolena stránka s nápovědou, tzn. že když místo Products zadám help, dostanu se na stránku s informacemi o tom, jaké metody moje služba nabízí, jaké obsahují parametry či jak vypadá dotaz (odpověd) ve formátu xml (Json)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;Závěr&lt;/h3&gt;

&lt;p&gt;V dnešním článku jste se mohly seznámit s novinkou, která Vás čeká a nemine ve verzi WCF 4. Kromě tohoto lehkého úvodu s velice jednoduchou ukázkou se v příštím díle podíváme na zajímavější věci např. jak &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;vystavit metody s parametry &lt;/li&gt;

  &lt;li&gt;vytvořit klienta a komunikovat se službou &lt;/li&gt;

  &lt;li&gt;provést update či vytvoření nového např. produktu &lt;/li&gt;
&lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Sezn%26%23225%3bmen%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Sezn%26%23225%3bmen%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Sezn%26%23225%3bmen%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx&amp;amp;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Sezn%26%23225%3bmen%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Sezn%26%23225%3bmen%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx&amp;amp;;title=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Sezn%26%23225%3bmen%26%23237%3b&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx&amp;amp;;subject=WCF+4+%e2%80%93+WebHttp+Services+%e2%80%93+Sezn%26%23225%3bmen%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2010/01/30/wcf-4-webhttp-services-sezn-men.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=236045" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/XML/default.aspx">XML</category></item><item><title>WCF Extensibility – OperationInvoker</title><link>http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx</link><pubDate>Mon, 28 Dec 2009 09:54:26 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:235970</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/235970.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=235970</wfw:commentRss><description>&lt;p&gt;Ve článcích &lt;a href="http://blog.vyvojar.cz/lukaashek/archive/2009/02/14/wcf-extensibility-parameter-inspection.aspx" target="_blank"&gt;parameter inspection&lt;/a&gt; a &lt;a href="http://blog.vyvojar.cz/lukaashek/archive/2009/03/28/wcf-extensibility-message-inspection.aspx" target="_blank"&gt;message inspection&lt;/a&gt; jsem se věnoval možnostem rozšíření a dnes v tom budu pokračovat, protože jsem zapomněl uvést možnost rozšíření pomocí rozhraní IOperationInvoker. Toto rozhraní nám umožní přepsat metodu Invoke a plně převzít kontrolu nad vykonáním konkrétní aplikace.&lt;/p&gt;  &lt;p&gt;Vytvořil jsem si jednoduchou službu (atributu ProductCaching si zatím nevšímejte, vysvětlím později)&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;[ServiceContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IProductService&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    [OperationContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    [ProductCaching]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    Product GetProduct(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;V implementaci služby pouze vrátím konkrétní produkt&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ProductService : IProductService&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; IProductService Members&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Product GetProduct(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (VWAEntities ctx = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; VWAEntities())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (from c &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ctx.Product&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; c.Name == name&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    select c).FirstOrDefault();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
To co zde napíšu jako rozšíření pomocí rozhraní IOperationInvoker by se dalo velice snadno zakomponovat do implementace metody GetProduct, ale může nastat situace, kdy nebudeme moct šahat na tento kód tak se nám možnost tohoto rozšíření může hodit.

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Vytvořím si tedy třídu, která bude implementovat rozhraní &lt;em&gt;IOperationInvoker&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;object[] AlocateInputs – slouří pro alokaci pole potřebného pro vsupní parametry metody, jejichž spuštění budeme chtít přepsat. V našem případě má metoda Getproduct jeden parametr name, proto vrátíme pole o velikosti 1 &lt;/li&gt;

  &lt;li&gt;object Invoke – zde provedeme přepsání naší metody GetProduct &lt;/li&gt;

  &lt;li&gt;IAsyncResult BeginInvoke – stejné jako Invoke, akorát se vykonání provede asynchronně &lt;/li&gt;

  &lt;li&gt;object InvokeEnd – vrátí výsledek po asynchronním vykonání operace &lt;/li&gt;

  &lt;li&gt;IsSynchronous – nastaví zda je volání synchronní nebo asynchronní &lt;/li&gt;
&lt;/ul&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ProductCacher : Attribute, IOperationInvoker&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; IOperationInvoker operationInvoker;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#008000;"&gt;// lokalni productCache ve ktere budu uchovavat jiz hledane produkty&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, Product&amp;gt; productCache = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, Product&amp;gt;();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ProductCacher(IOperationInvoker invoker)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.operationInvoker = invoker;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; IOperationInvoker Members&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] AllocateInputs()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#008000;"&gt;// moji metodu volam z jednim parametrem GetProduct(string name)&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[1];&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Invoke(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; instance, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] inputs, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] outputs)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#008000;"&gt;// ziskam si hodnotu parametru name&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name = inputs[0] &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        Product &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#008000;"&gt;// zkusim najit produkt v productCache&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (product&lt;strike&gt;Cache&lt;/strike&gt;.TryGetValue(name, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#008000;"&gt;// pokud ho najdu tak vysledny produkt vratim a vypisu textovou informaci&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            outputs = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[0];&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;-- Data loaded from productCache...&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#008000;"&gt;// jinak zavolam puvodni metodu GetProduct&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt; = (Product)&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.operationInvoker.Invoke(instance, inputs, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; outputs);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#008000;"&gt;// ulozim do productCache&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            productCache[ name] = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;-- Data loaded from database...&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#008000;"&gt;// a vratim hodnotu&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IAsyncResult InvokeBegin(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; instance, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] inputs, AsyncCallback callback, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; state)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; InvokeEnd(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; instance, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] outputs, IAsyncResult result)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; IsSynchronous&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Na závěr se dostáváme k tomu, proč je moje metoda v definici rozhraní IProductService označená atributem ProductCaching. Tato třída implementuje již známé rozhraní IOperationBehavior, kde v implementaci metody ApplyDispatchBehavior nastavíme Invoker na instanci třídy ProductCacher&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ProductCaching : Attribute, IOperationBehavior&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#cc6633;"&gt;#region&lt;/span&gt; IOperationBehavior Members&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;         dispatchOperation.Invoker = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ProductCacher(dispatchOperation.Invoker);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Validate(OperationDescription operationDescription)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#cc6633;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
Tím jsme dali najevo, že po označení metody atributem ProductCaching dojde při spuštění metody GetProduct k zavolání metody Invoke třídy ProductCacher, která se podívá do lokální productCache, zda se tam hledaný produkt nachází a v případě, že ne, zavolá se původní metoda GetProduct, výsledek se uloží do productCache a odešle se klientovi.

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Pro otestování jsem vytvořil klientskou aplikaci, která zavolá několikrát metodu GetProduct a ověří správnou funkcionalitu našeho rozšíření&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/WCF_OperationInvoker_4EE71AF9.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WCF_OperationInvoker" border="0" alt="WCF_OperationInvoker" src="http://blog.vyvojar.cz/blogs/lukaashek/WCF_OperationInvoker_thumb_5BE0FB0A.jpg" width="299" height="206" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;při prvním volání metody GetProduct s parametrem name=Hokejka dojde k provedení dotazu do SQL serveru, ale při druhém volání se tento produkt již načte z productCache.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx&amp;amp;;title=WCF+Extensibility+%e2%80%93+OperationInvoker" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx&amp;amp;;title=WCF+Extensibility+%e2%80%93+OperationInvoker" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx&amp;amp;;title=WCF+Extensibility+%e2%80%93+OperationInvoker" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx&amp;amp;title=WCF+Extensibility+%e2%80%93+OperationInvoker" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx&amp;amp;;title=WCF+Extensibility+%e2%80%93+OperationInvoker" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx&amp;amp;;title=WCF+Extensibility+%e2%80%93+OperationInvoker&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx&amp;amp;;subject=WCF+Extensibility+%e2%80%93+OperationInvoker" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/28/wcf-extensibility-operationinvoker.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=235970" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category></item><item><title>WCF .NET 4 Beta 2 – Dynamic Routing</title><link>http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx</link><pubDate>Sat, 19 Dec 2009 12:25:46 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:235960</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/235960.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=235960</wfw:commentRss><description>&lt;p&gt;V minulém &lt;a href="http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx" target="_blank"&gt;článku&lt;/a&gt; jsem ukazoval možnosti routování, kde jsem vše potřebné nastavil v konfiguračním souboru a dnes si ukážeme jak aplikovat nové pravidla pro směrování za běhu služby. Např. naše routovací služba může provádět v jiném vlákně kontrolu stavu jednotlivých služeb a v případě, že služba nebude schopna momentálně přijímat žádné požadavky, můžeme dynamicky změnit podmínku pro směrování zpráv a nyní přeposílat zprávy na jinou službu.&lt;/p&gt;  &lt;p&gt;Musíme si tedy vytvořit novou routovací konfiguraci, která obsahuje směrovací tabulku s jednotlivými filtry:&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; RoutingConfiguration NewRoutingConfiguration()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#008000;"&gt;// vytvorim si smerovaci tabulku&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    var filterTable = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; MessageFilterTable&amp;lt;IEnumerable&amp;lt;ServiceEndpoint&amp;gt;&amp;gt;();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#008000;"&gt;// pridam dva filtry&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    MessageFilter addFilter = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ActionMessageFilter(&lt;span style="color:#006080;"&gt;&amp;quot;http://tempuri.org/ICalculator/Add&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    MessageFilter subtractFilter = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ActionMessageFilter(&lt;span style="color:#006080;"&gt;&amp;quot;http://tempuri.org/ICalculator/Subtract&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#008000;"&gt;// definice endpointu na ktere se budou zpravy preposilat&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    ServiceEndpoint calc1 = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ServiceEndpoint(&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        ContractDescription.GetContract(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(IRequestReplyRouter)),&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BasicHttpBinding(),&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EndpointAddress(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost:9000/servicemodelsamples/calcservice1&amp;quot;&lt;/span&gt;));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    ServiceEndpoint calc2 = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ServiceEndpoint(&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        ContractDescription.GetContract(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(IRequestReplyRouter)),&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BasicHttpBinding(),&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EndpointAddress(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost:9001/servicemodelsamples/calcservice2&amp;quot;&lt;/span&gt;));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#008000;"&gt;// filtry pridam do smerovaci tabulky&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    filterTable.Add(addFilter, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;ServiceEndpoint&amp;gt; { calc2 });&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    filterTable.Add(subtractFilter, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;ServiceEndpoint&amp;gt; { calc1 });&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#008000;"&gt;// vratim nove vytvorenou konfiguraci&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RoutingConfiguration(filterTable, &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Jedná se úplně o stejnou konfiguraci jako v minulém článku, akorát jsem provedl záměnu služeb, tzn. že se volání metody Add vykoná na službě CalculatorService2 místo CalculatorService1.&lt;/p&gt;

&lt;p&gt;Poté si z kolekce Extensions objektu ServiceHost získáme objekt RoutingExtensions, na kterém zavoláme metodu ApplyConfiguration a jako parametr předáme naši nově vytvořenou konfiguraci&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;var re = serviceHost.Extensions.Find&amp;lt;RoutingExtension&amp;gt;();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (re != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    re.ApplyConfiguration(NewRoutingConfiguration());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Configuration changed&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Zde můžete vidět výsledek po spuštění této ukázky&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ServiceHost&lt;/strong&gt; – aplikace, která hostuje služby CalculatorService1 a CalculatorService2&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_6D581275.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_79B60FD1.png" width="644" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RoutingServiceHost&lt;/strong&gt; – naše routovací služba&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_51372DBD.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_3E823406.png" width="644" height="141" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RoutingClient&lt;/strong&gt; – klient, který volá metody Add a Subtract&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_7D0781AC.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_5BA7DC10.png" width="644" height="305" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Nejdříve spustím Clienta, který zavolá metodu Add a Subtract, poté změním konfiguraci na straně routovací služby a nakonec na straně clienta opět zavolám stejné metody a tentokrát se vykonají na jiných službách, přesně tak jak jsem to chtěl v konfiguraci&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Dynamic+Routing" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Dynamic+Routing" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Dynamic+Routing" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx&amp;amp;title=WCF+.NET+4+Beta+2+%e2%80%93+Dynamic+Routing" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Dynamic+Routing" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Dynamic+Routing&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx&amp;amp;;subject=WCF+.NET+4+Beta+2+%e2%80%93+Dynamic+Routing" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/19/wcf-net-4-beta-2-dynamic-routing.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=235960" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category></item><item><title>WCF .NET 4 Beta 2 – Routing Services</title><link>http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx</link><pubDate>Tue, 15 Dec 2009 09:46:50 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:235940</guid><dc:creator>lukaashek</dc:creator><slash:comments>1</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/235940.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=235940</wfw:commentRss><description>&lt;p&gt;Routování nemělo ve verzi .NET 3.x oficiální podporu, ale s pomocí API jsme si tuto funkcionalitu byly schopni napsat. Ve verzi .NET 4.x už tato podpora existuje. Než se do toho pustíme, vytvoříme si pomocnou službu, na které budu požadavky od klienta posílat, Tedy naše routovací služba podle různých parametrů se rozhodne, na jakou službu tu zprávu zašle. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;CalculatorService&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Aby jsme si mohli ověřit správnou funkcionalitu vytvořil jsem si 2 služby, kde každá služba implementuje stejné rozhraní ICalculator:&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;[ServiceContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; ICalculator&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    [OperationContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; Add(&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; a, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; b);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    [OperationContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; Subtract(&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; a, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; b);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    [OperationContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; Multiply(&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; a, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; b);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    [OperationContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; Divide(&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; a, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; b);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Kromě počítání správného výsledku mají za úkol služby vypsat do console informaci o spuštění konkrétní metody. Tyto služby spustím jednoduše pomocí objektu ServiceHost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RoutingService&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pro spuštění naší routovací služby vytvoříme pouze instanci objektu ServiceHost, kde do konstruktoru předáme typ objektu RoutingService a spustíme. Toť vše a jak to tedy funguje? Pro důvod routování byla právě vytvořená nová třída RoutingService, kterou takto vložíme do konstruktoru ServiceHost objektu a poté vše nastavení provedeme v konfiguračním souboru&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (ServiceHost serviceHost = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ServiceHost(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(RoutingService)))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            serviceHost.Open();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;The Routing Service is now running.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Press &amp;lt;ENTER&amp;gt; to terminate router.\n&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#008000;"&gt;// The service can now be accessed.&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            Console.ReadLine();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            serviceHost.Close();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (CommunicationException)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            serviceHost.Abort();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;V konfiguračním souboru pak v elementu service uvedeme jako název služby právě název té nové třídy RoutingService ( i s názvy namespace !!) a pak stačí vytvořit libovolný počet endpointů na kterém bude naše služba naslouchat. Tzn. klient bude znát pouze adresu routovací služby, ale už se nikdy nedozví o adrese konkrétní služby, která zpracovala jeho požadavek ( v našem případě to bude buď služba CalculatorService1 nebo CalculatorService2). Při definici endpointu uvedeme klasicky adresu, binding a do contractu uvedeme název z předem určených kontraktů&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ISimplexDatagramRouter&lt;/li&gt;

  &lt;li&gt;ISimplexSessionRouter&lt;/li&gt;

  &lt;li&gt;IRequestReplyRouter&lt;/li&gt;

  &lt;li&gt;IDuplexSessionRouter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;My jelikož budeme komunikovat klasickým stylem request-reply využijeme contract IRequestReply. Např. pokud by naše služba nabízela metody, které jsou označeny atributem IsOneWay=true museli by jsme použít contract ISimplexDatagramRouter&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;service&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.ServiceModel.Routing.RoutingService&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;           &lt;span style="color:#ff0000;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingData&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;host&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;baseAddresses&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;baseAddress&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://localhost:9000/routingservice/router&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;baseAddresses&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;host&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;endpoint&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;twowayEndpointBasic&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;              &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;twoway-basic&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;              &lt;span style="color:#ff0000;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;basicHttpBinding&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;              &lt;span style="color:#ff0000;"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.ServiceModel.Routing.IRequestReplyRouter&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;service&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Nyní pokud bude chtít klient komunikovat se službou, může zaslat zprávu na adresu &lt;em&gt;http://localhost:9000/routingservice/router/twoway-basic&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dále jsme v elementu service uvedli název konfigurace pro další nastavení naší služby. V této části nastavení pouze uvedeme název směrovací tabulky, která se využije pro směrování jednotlivých zpráv&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;behavior&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingData&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;        &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;         &lt;span style="color:#008000;"&gt;&amp;lt;!--NAZEV SMEROVACI TABULKY--&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;routing&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterTableName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingTable2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;routeOnHeadersOnly&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;behavior&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Definice routovací tabulky je uvedena v elementu routing. Můžeme samozřejmě definovat více směrovacích tabulek a tu aktivní nastavíme vždy v konfiguraci služby. Každá směrovací tabulka obsahuje název filtru a název endpointu. Pokud příchozí zpráva vyhovuje filtru, přepošle se na uvedený endpoint. o filtrech a endpointech jsem se ještě nezmínil, tak pojďme to napravit&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTables&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTable&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingTable&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;addFilter&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;subtractFilter&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTable&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingTable2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;gt5&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService1&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lt5&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService2&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTables&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Jelikož se naše routovací služba chová zároveň jako klient (jako služba přijímá požadavky, které potom jako klient zasílá na konkrétní služby) musíme do elementu client uvést názvy endpointů už těch opravdových služeb (CalculatorService1 a CalculatorService2)&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;endpoint&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService1&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;           &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://localhost:9000/servicemodelsamples/calcservice1&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;           &lt;span style="color:#ff0000;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;basicHttpBinding&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;           &lt;span style="color:#ff0000;"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;endpoint&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService2&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;           &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://localhost:9001/servicemodelsamples/calcservice2&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;           &lt;span style="color:#ff0000;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;basicHttpBinding&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;           &lt;span style="color:#ff0000;"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Nyní služba ví, kam případné zprávy přeposílat a už nám chybí se podívat na jednotlivé filtry, které se rovněž definují v elementu routing. U filtru uvádíme vždy název, na který se pak odkazujeme z routovací tabulky, typ filtru (může nabývat následujících hodnot)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;•Action&lt;/li&gt;

  &lt;li&gt;•EndpointAddress&lt;/li&gt;

  &lt;li&gt;•PrefixEndpointAddress&lt;/li&gt;

  &lt;li&gt;•And&lt;/li&gt;

  &lt;li&gt;•Custom&lt;/li&gt;

  &lt;li&gt;•EndpointName&lt;/li&gt;

  &lt;li&gt;•MatchAll&lt;/li&gt;

  &lt;li&gt;•XPath&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;a případně nastavím atribut filterData na požadovanou akci, xpath výraz či něco jiného. Pojďme se podívat na moje definované filtry:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;addFilter – typ filtru je nastaven na action, tzn. že se bude rozhodovat podle toho jaká metoda se zavolá. Pokud se zavolá metoda Add, filtr vyhoví&lt;/li&gt;

  &lt;li&gt;subtractFilter – stejné jako výše, akorát filtr vyhoví při zavolání metody Subtract&lt;/li&gt;

  &lt;li&gt;gt5 – metody mají 2 parametry ‘a’ a ’b’. Pokud je 5 větší než 5, daný filtr vyhoví&lt;/li&gt;

  &lt;li&gt;lt5 – podobný jako gt5, akorát vyhoví při čísle menším než 5&lt;/li&gt;
&lt;/ul&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;addFilter&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Action&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterData&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://tempuri.org/ICalculator/Add&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;subtractFilter&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Action&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterData&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://tempuri.org/ICalculator/Subtract&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;    &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;gt5&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;XPath&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#ff0000;"&gt;filterData&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;boolean(//*[local-name()= 'a']/text() &amp;amp;gt; 5)&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lt5&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;XPath&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#ff0000;"&gt;filterData&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;boolean(//*[local-name()= 'a']/text() &amp;amp;lt; 5)&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MatchAll&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MatchAll&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Naše routovací služba je nyní kopmpletně hotová a můžeme vyzkoušet klienta. Klientská část spočívá ve vytvoření proxy třídy, která poté pošle zprávu na endpoint routovací služby. Když budu chtít např. sčítat a jako číslo a zadám hodnotu menší než 5, provede se vykonání zprávy na službe CalculatorService1, při hodnotě vyšší než 5, převezme režii služba CalculatorService2.&lt;/p&gt;

&lt;p&gt;Co ovšem nastane v případě když zadám číslo rovno 5? Výsledkem bude výjimka, proto je nutné tady tohle nějak ošetřit. Musíme do naší routovací tabulky přidat nový filter, kde jako typ filtru vybereme MatchAll (tzn. uplatní se na všechny zprávy) a nastavíme mu pripritu na 0. Ostatním filtrům v tabulce nastavíme prioritu na 1. Čím vyšší priorita, tím dříve se daný filtr vykoná. V našem případě se provedou nejdříve filtry gt5 a lt5 a jelikož ani jeden nevyhověl, provede se na závěr filtr MatchAll, který danou zprávu přepošle na např. defaultní službu (např. CalculatorService1)&lt;/p&gt;

&lt;p&gt;Co se stane v případě, kdy služba na kterou chceme přeposlat zprávu neběží? I v této situaci jsme schopni se vyvarovat případné výjimce a to tím, že si vytvoříme tzv. backupList, do kterého uvedeme názvy endpointů, které jsou např. nějaké záložní a to že je zaručeno, že budou vždy spuštěné. Poté u jednotlivých filtrů uvedeme název takového backupListu a pokud se při uplatnění filtru bude chtít zpráva poslat na služba, která neběží, uplatní se backupList a zpráva se pošle na tuhle záložní slučbu.&lt;/p&gt;

&lt;p&gt;Na závěr ještě kompletní nastavení v souboru App.config&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#800000;"&gt;xml&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;encoding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;endpoint&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService1&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://localhost:9000/servicemodelsamples/calcservice1&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#ff0000;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;basicHttpBinding&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#ff0000;"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;endpoint&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService2&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://localhost:9001/servicemodelsamples/calcservice2&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#ff0000;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;basicHttpBinding&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#ff0000;"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;services&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#008000;"&gt;&amp;lt;!--ROUTING SERVICE--&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;service&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.ServiceModel.Routing.RoutingService&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;               &lt;span style="color:#ff0000;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingData&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;host&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;baseAddresses&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;baseAddress&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://localhost:9000/routingservice/router&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;baseAddresses&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;host&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;endpoint&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;twowayEndpointBasic&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                  &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;twoway-basic&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                  &lt;span style="color:#ff0000;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;basicHttpBinding&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                  &lt;span style="color:#ff0000;"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.ServiceModel.Routing.IRequestReplyRouter&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;service&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;services&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;behavior&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingData&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceMetadata&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;httpGetEnabled&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceDebug&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;includeExceptionDetailInFaults&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#008000;"&gt;&amp;lt;!--NAZEV SMEROVACI TABULKY--&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;routing&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterTableName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingTable2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;routeOnHeadersOnly&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;behavior&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;routing&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;addFilter&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Action&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterData&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://tempuri.org/ICalculator/Add&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;subtractFilter&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Action&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterData&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://tempuri.org/ICalculator/Subtract&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;gt5&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;XPath&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#ff0000;"&gt;filterData&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;boolean(//*[local-name()= 'a']/text() &amp;amp;gt; 5)&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lt5&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;XPath&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#ff0000;"&gt;filterData&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;boolean(//*[local-name()= 'a']/text() &amp;amp;lt; 5)&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MatchAll&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MatchAll&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTables&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTable&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingTable&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;addFilter&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;subtractFilter&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTable&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingTable2&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;gt5&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;backupList&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;backupEndpoints&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;priority&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lt5&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;backupList&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;backupEndpoints&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;priority&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;filterName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MatchAll&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;priority&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;filterTables&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;backupLists&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;backupList&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;backupEndpoints&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;endpointName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CalculatorService1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;backupList&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;backupLists&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;routing&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Ukázkovou aplikaci můžete stáhnout &lt;a href="http://public.bay.livefilestore.com/y1pnDM7EZ9ynWmYlzuX6blyUZig7gFfVv23FJA6AOUPa_kwXOuH0uvCy5-WB1t525FjaOJy8RFIJGGZXaMGaMonfA/WCF4%20Beta2-Novinky%20%5B2009-12-03%5D.7z?download" target="_blank"&gt;zde&lt;/a&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Routing+Services" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Routing+Services" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Routing+Services" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx&amp;amp;title=WCF+.NET+4+Beta+2+%e2%80%93+Routing+Services" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Routing+Services" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Routing+Services&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx&amp;amp;;subject=WCF+.NET+4+Beta+2+%e2%80%93+Routing+Services" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/15/wcf-net-4-beta-2-routing-services.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=235940" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category></item><item><title>WCF .NET 4 Beta 2 – Discovery (Metadata Extensions, Announcements)</title><link>http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx</link><pubDate>Mon, 07 Dec 2009 10:20:55 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:235903</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/235903.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=235903</wfw:commentRss><description>&lt;p&gt;&lt;strong&gt;Metadata Extensions&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Další novinkou v oblasti Discovery je možnost přidat k endpointu doplňující informace (v mém případě to bude u chatovací aplikace uživatelské jméno uživatele). Z verze WCF 3.x víte, že každý endpoint má kolekci Behaviors, do které můžeme přidat dodatečná nastavení či rozšířené vlastnosti endpointu. Stačí vytvořit třídu, která implementuje rozhraní IEndpointBehavior a upravit metody tak aby dělaly co chcete (např. kontrola příchozích zpráv v článku &lt;a href="http://blog.vyvojar.cz/lukaashek/archive/2009/03/28/wcf-extensibility-message-inspection.aspx" target="_blank"&gt;zde&lt;/a&gt;). Ve verzi 4.x můžeme využít třídu EndpointDiscoveryBehavior, která implementuje zmiňované rozhraní IEndpointBehavior a dále přidává další vlastnosti např. Scopes či Extensions.&lt;/p&gt;  &lt;p&gt;Jakmile vytvoříme instance třídy EndpointDiscoveryBehavior tak do kolekce Extensions můžeme uložit jakékoliv informace ve formě XElementu&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// vytvorim si novy objekt EndpointDiscoveryBehavior&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; var endpointDiscoveryBehavior = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EndpointDiscoveryBehavior();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;// do kolekce Extensions pridam doplnujici informace o aktualne prihlasenem uzivateli&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; endpointDiscoveryBehavior.Extensions.Add(&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XElement(&lt;span style="color:#006080;"&gt;&amp;quot;root&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XElement(&lt;span style="color:#006080;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.UserName)));&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Pokud si vzpomínáte na můj první článek o &lt;a href="http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx" target="_blank"&gt;Discovery&lt;/a&gt; tak jsem po stisku tlačítka vytvářel instanci objektu ServiceHost, kde jsem předal typ služby a jednoznačnou adresu. Jelikož se endpoint vytvoří dynamicky na základě mojí Uri adresy, potřebuju si získat z kolekce endpointů ten můj dynamicky vytvořený, abych mu mohl toto rozšíření přidat do jeho kolekce Behaviors:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; var serviceEndpoint = serviceHost.Description.Endpoints.Find(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(GreetingService.IHello));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; serviceEndpoint.Behaviors.Add(endpointDiscoveryBehavior);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;jakmile se nyní pokusí uživatel vyhledat ostatní uživatele (služby) bude schopen si ze získaných metadat přečíst to co jsme si uložili do kolekce Extensions. Metoda, která to v mojí aplikaci provádí vypadá následovně:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetPeerName(EndpointDiscoveryMetadata metadata)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     XElement peerNameElement = metadata.Extensions.Elements(&lt;span style="color:#006080;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;).FirstOrDefault();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (peerNameElement != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; peerNameElement.Value;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Na závěr ještě ukázka jak bude vypadat metoda pro přihlášení uživatele po úpravách, které jsme provedli abychom přidali uživatelské jméno do kolekce Extensions:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; btnSignIn_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrWhiteSpace(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.UserName))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;         MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Username&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     localAddress = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EndpointAddress(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost:8091/&amp;quot;&lt;/span&gt; + Guid.NewGuid().ToString());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     serviceHost = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ServiceHost(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(GreetingService.GreetingService), localAddress.Uri);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     var endpointDiscoveryBehavior = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EndpointDiscoveryBehavior();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     endpointDiscoveryBehavior.Extensions.Add(&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XElement(&lt;span style="color:#006080;"&gt;&amp;quot;root&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XElement(&lt;span style="color:#006080;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.UserName)));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     var serviceEndpoint = serviceHost.Description.Endpoints.Find(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(GreetingService.IHello));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     serviceEndpoint.Behaviors.Add(endpointDiscoveryBehavior);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;     serviceHost.BeginOpen((result) =&amp;gt; serviceHost.EndOpen(result), &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;    &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;     btnSignIn.Enabled = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;     btnSignOut.Enabled = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;     btnDiscovery.Enabled = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;     ChangeTitle(txtUsername.Text);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;A kromě grafické vzhledu jak to bude vypadat nyní v naší aplikaci, můžete na obrázku níže vidě i strukturu SOAP zprávy z naším uživatelským jménem:&lt;/p&gt;

&lt;p&gt;-- todo přidat obrázek kde je místo uri uživatelské jméno&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;s:Envelope&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns:a&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://www.w3.org/2005/08/addressing&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns:s&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://www.w3.org/2003/05/soap-envelope&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;s:Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;a:Action&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;s:mustUnderstand&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Hello&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;a:Action&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;h:AppSequence&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;InstanceId&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1259903861&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;MessageNumber&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns:h&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;a:MessageID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;urn:uuid:7b950263-1677-4957-ae74-dc608edc06eb&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;a:MessageID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;s:Header&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;s:Body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Hello&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;a:EndpointReference&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;a:Address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;http://localhost:8091/7fa58827-fe75-42ca-afc0-b8cad4dc37b6&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;a:Address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;a:EndpointReference&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;d:Types&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns:dp0&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://tempuri.org/&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns:d&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;dp0:IHello&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;d:Types&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;XAddrs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;http://localhost:8091/7fa58827-fe75-42ca-afc0-b8cad4dc37b6&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;XAddrs&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;MetadataVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;0&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;MetadataVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;root&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Lukas&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;root&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Hello&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;s:Body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;s:Envelope&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Announcements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tak jako existuje funkcionalita u různých IM programů, že Vám oznámí když někdo přejde do stavu online, tak máte možnost tuto funkcionalitu zabudovat i do WCF služeb. Lze toho dosáhnout velice jednoduchým způsobem a to pouze přidáním konkrétního endpointu. Tak jako pro funkcionalitu hledání na síti jsme využívali udpDiscoveryEndpoint, tak pro funkcionalitu oznámení existuje udpAnnouncementEndpoint. Pokud má naše služba tento endpoint je schopna poslat notifikaci, vždy když přejde do stavu online či offline. jakmile služba odešle určitý typ oznámení, tak by jsme měli být schopni na tento typ oznámení patřičně zareagovat. Ve WCF 4 je nová třída AnnouncementService, kterou když spustíme, tak dokáže naslouchat online, či offline oznámením a vždy vyvolá potřebnou událost:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;OnlineAnnouncementReceived &lt;/li&gt;

  &lt;li&gt;OfflineAnnouncementReceived &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Přidáme tedy do konfiguračního souboru naší služby udpAnnouncementEndpoint, který nám zajistí funkcionalitu oznámení, tedy když se služba spustí, vyvolá online oznámení a když službu ukončím, vyvolá se offline oznámení.&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;behavior&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceDiscovery&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;announcementEndpoints&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;endpoint&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;udpAnnouncement&amp;quot;&lt;/span&gt; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;                    &lt;span style="color:#ff0000;"&gt;kind&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;udpAnnouncementEndpoint&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;announcementEndpoints&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceDiscovery&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;behavior&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Naše služba nyní umí zasílat online či offline oznámení, ale momentálně nemáme nic co by nám tyto oznámení odchytávalo. Vytvoříme si tedy instanci třídy AnnouncementService, která jak jsem uvedl výše slouží pro odchytávání těch oznámení. Provedeme obsluhu událostí OnlineAnnouncementReceived a OfflineannouncementReceived a pak takto vytvořenou instanci předáme objektu ServiceHost a spustíme. Nyní nám v naší chatovací oáplikaci běží kromě klasické služby i služba odchytávající oznámení.&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; private void OpenAnnouncementService()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     this.announcementService = new AnnouncementService();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     this.announcementService.OnlineAnnouncementReceived += OnlineAnnouncementReceived;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     this.announcementService.OfflineAnnouncementReceived += OfflineAnnouncementReceived;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     announcementServiceHost = new ServiceHost(this.announcementService);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     announcementServiceHost.AddServiceEndpoint(new UdpAnnouncementEndpoint());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     announcementServiceHost.BeginOpen(&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;         (result) =&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; announcementServiceHost.EndOpen(result), null);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt; void OfflineAnnouncementReceived(object sender, AnnouncementEventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     EndpointDiscoveryMetadata metadata = e.EndpointDiscoveryMetadata;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     FindCriteria findCriteria = new FindCriteria(typeof(GreetingService.IHello));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     if (findCriteria.IsMatch(metadata))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;         this.RemoveUser(new PeerUser(GetPeerName(metadata), metadata.Address.Uri));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt; void OnlineAnnouncementReceived(object sender, AnnouncementEventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum27"&gt;  27:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum28"&gt;  28:&lt;/span&gt;     EndpointDiscoveryMetadata metadata = e.EndpointDiscoveryMetadata;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum29"&gt;  29:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum30"&gt;  30:&lt;/span&gt;     FindCriteria findCriteria = new FindCriteria(typeof(GreetingService.IHello));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum31"&gt;  31:&lt;/span&gt;     if (findCriteria.IsMatch(metadata))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum32"&gt;  32:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum33"&gt;  33:&lt;/span&gt;         this.PopulateUsersList(metadata);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum34"&gt;  34:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum35"&gt;  35:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Jakmile se nějaký uživatel přihlásí, automaticky to zjistí i ostatní přihlášení uživatelé.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(Metadata+Extensions%2c+Announcements)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(Metadata+Extensions%2c+Announcements)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(Metadata+Extensions%2c+Announcements)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx&amp;amp;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(Metadata+Extensions%2c+Announcements)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(Metadata+Extensions%2c+Announcements)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(Metadata+Extensions%2c+Announcements)&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx&amp;amp;;subject=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(Metadata+Extensions%2c+Announcements)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/07/wcf-net-4-beta-2-discovery-metadata-etensions-announcements.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=235903" width="1" height="1"&gt;</description></item><item><title>WCF .NET 4 Beta 2 – Discovery (AD Hoc mode)</title><link>http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx</link><pubDate>Fri, 04 Dec 2009 10:55:45 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:235881</guid><dc:creator>lukaashek</dc:creator><slash:comments>1</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/235881.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=235881</wfw:commentRss><description>&lt;p&gt;Nová verze WCF nabízí novou a velice dobře vypadající novinku “Discovery”. Tato novinka slouží pro hledání služeb, kde pro hledání využívá &lt;a href="http://specs.xmlsoap.org/ws/2005/04/discovery/ws-discovery.pdf" target="_blank"&gt;WS-Discovery protokol&lt;/a&gt;. WCF nabízí 2 módy pro hledání služeb:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;AD Hoc mód – funguje pouze v lokálním subnetu &lt;/li&gt;    &lt;li&gt;Managed mód – NENÍ omezen pouze na lokální subnet &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Implementace druhého módu, je o něco málo komplikovanější a proto mu budu věnovat samostatný článek. Nyní si tedy ukážeme implementaci AD hoc módu.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Služba&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Aby uměla naše služba reagovat na hledání ze strany klienta, musí mít endpoint UdpDiscoveryEndpoint (Klient, který provádí hledání má rovněž tento endpoint) na který přichází požadavky od klienta, tedy klient pošle zprávu na všechny služby, které mají uveden tento endpoint. Kromě tohoto endpointu je nutné v ServiceBehaviors “zapnout” viditelnost služby na síti a to pomocí elementu serviceDiscovery. Pokud by naše služba neměla uvedený element ServiceDiscovery, zprávy zaslané klientem by na takovou službu nepřišly.&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;services&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;service&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;GreetingService.GreetingService&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;endpoint&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;                   &lt;span style="color:#ff0000;"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;basicHttpBinding&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;                   &lt;span style="color:#ff0000;"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;GreetingService.IHello&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;endpoint&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;udpDiscoveryEndpoint&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;kind&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;udpDiscoveryEndpoint&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;service&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;services&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;behavior&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceDiscovery&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;behavior&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Poznámka: V ukázce využívám službu, jejíž definice je následující:&lt;/em&gt;&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; [ServiceContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IHello&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     [OperationContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; SayHello(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; str);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt; [ServiceContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IGoodbye&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     [OperationContract]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; SayGoodBye(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; str);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; GreetingService : IHello, IGoodbye&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; SayGoodBye(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; str)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Goodbye {0}&amp;quot;&lt;/span&gt;, str);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; SayHello(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; str)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Hello {0}&amp;quot;&lt;/span&gt;, str);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Pro praktickou ukázku jsem si vytvořil chatovací aplikaci:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_661A2B83.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_12C2E55D.png" width="367" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Pokud uživatel vyplní jméno a stiskne tlačítko “Sign In” vyvolá se následující metoda (důležité informace jsou v komentářích) Nedělá se zde nic zásadního, pouze se pomocí objektu ServiceHost spustí službu na adrese, která se automaticky vygeneruje. Konfigurační soubor, který jsem ukazoval o pár řádků výše je samozřejmě součástí této ukázky, bez něho by naše služba nebyla viditelná v síti a neuměla zpracovávat zpráva zaslané klientem:&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; btnSignIn_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrWhiteSpace(txtUsername.Text))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;         MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Username&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// vytvorim jedinecnou adresu, na ktere mi pobezi sluzba&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     localAddress = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EndpointAddress(&lt;span style="color:#006080;"&gt;&amp;quot;http://localhost:8091/&amp;quot;&lt;/span&gt; + Guid.NewGuid().ToString());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// objektu serviceHost predam do konstruktoru typ moji sluzbu, kterou chci hostovat a adresu na ktere bude dostupna&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     serviceHost = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ServiceHost(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(GreetingService.GreetingService), localAddress.Uri);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// asynchrone tuto sluzbu spustim&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     serviceHost.BeginOpen((result) =&amp;gt; serviceHost.EndOpen(result), &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     btnSignIn.Enabled = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     btnSignOut.Enabled = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     btnDiscovery.Enabled = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;     ChangeTitle(txtUsername.Text);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Nyní je naše služba spuštěna a zároveň viditelná na síti. Ted se podíváme jaké máme možnosti na straně klienta, který provádí hledání takto viditelných služeb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Klient&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pro implementaci klienta existuje nová třída nazvaná &lt;em&gt;DiscoveryClient. &lt;/em&gt;Když vytváříme instanci této třídy, do konstruktoru uvádíme objekt typu UdpDiscoveryEndpoint aby ten klient veděl na jaké endpointy má zasílat zprávy při hledání. Dále tato nová třída obsahuje dvě užitečné události:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;&lt;strong&gt;FindProgressChanged&lt;/strong&gt;&lt;/em&gt; – tato událost se vyvolá, vždy když klient nalezne nějakou službu. Při odchycení této služby získáme z argumentů objekt EndpointDiscoveryMetadata, který obsahuje informace o nalezené službě &lt;/li&gt;

  &lt;li&gt;&lt;em&gt;&lt;strong&gt;FindCompleted&lt;/strong&gt;&lt;/em&gt; – jakmile klient dokončí hledání služeb &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ještě před samotným voláním metody Find nebo FindAsync musíme uvést nějaké kritéria, podle kterých se bude hledat. Pro definici kritérií existuje opět nová třída FindCriteria, kde do konstrukturou uvedu typ Service Contractu (řeknu, že hledám pouze ty služby, které nabízí tenhle ServiceContract). Nakonec tedy provedu volání metody Find či FindAsync kde jako parametr předám právě vytvořené kritéria&lt;/p&gt;

&lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ADHocMode()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// vytvorim clienta&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     DiscoveryClient discoveryClient = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DiscoveryClient(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; UdpDiscoveryEndpoint());&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     discoveryClient.FindProgressChanged += (sender, args) =&amp;gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;         PopulateUsersList(args.EndpointDiscoveryMetadata);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     discoveryClient.FindCompleted += (sender, args) =&amp;gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;             btnDiscovery.Enabled = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;             btnDiscovery.Text = &lt;span style="color:#006080;"&gt;&amp;quot;Discovery Users&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;         };&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// zadam podle jakych kriterii se bude hledat&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     FindCriteria findCriteria = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; FindCriteria(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(GreetingService.IHello));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// budu hledat asynchronne&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;     discoveryClient.FindAsync(findCriteria);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;     btnDiscovery.Enabled = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     btnDiscovery.Text = &lt;span style="color:#006080;"&gt;&amp;quot;Discovering users...&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;V obsluze události FindProgressChanged si můžete všimnout, že volám metodu PopulateUsersList, kde ovšem nedělám nic jiného, než že si z vlastnosti Address.Uri ziskám adresu nalezené služby a zobrazím v ListBoxu. Výsledek po hledání by mohl vypadat takto:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/lukaashek/image_3E270657.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/lukaashek/image_thumb_68933774.png" width="369" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Poznámka: Adresa kterou zde vidíte je adresa jiného uživatele.&lt;/em&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(AD+Hoc+mode)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(AD+Hoc+mode)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(AD+Hoc+mode)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx&amp;amp;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(AD+Hoc+mode)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(AD+Hoc+mode)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx&amp;amp;;title=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(AD+Hoc+mode)&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx&amp;amp;;subject=WCF+.NET+4+Beta+2+%e2%80%93+Discovery+(AD+Hoc+mode)" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/wcf-net-4-beta-2-discovery-ad-hoc-mode.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=235881" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category></item><item><title>Archiv prezentací</title><link>http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx</link><pubDate>Fri, 04 Dec 2009 09:59:36 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:235880</guid><dc:creator>lukaashek</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/lukaashek/comments/235880.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/lukaashek/commentrss.aspx?PostID=235880</wfw:commentRss><description>&lt;p&gt;Konečně jsem se odhodlal k tomu abych všechny svoje prezentace umístil na jedno místo. Prohlédnout, případně stáhnout si je můžete na adrese &lt;a title="http://cid-443d88037e0a0331.skydrive.live.com/self.aspx/Prezentace" href="http://cid-443d88037e0a0331.skydrive.live.com/self.aspx/Prezentace"&gt;http://cid-443d88037e0a0331.skydrive.live.com/self.aspx/Prezentace&lt;/a&gt; Jedná se především o prezentace, které jsem měl na VŠB TU-Ostrava&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx&amp;amp;;title=Archiv+prezentac%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx&amp;amp;;title=Archiv+prezentac%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx&amp;amp;;title=Archiv+prezentac%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx&amp;amp;title=Archiv+prezentac%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx&amp;amp;;title=Archiv+prezentac%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx&amp;amp;;title=Archiv+prezentac%26%23237%3b&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx&amp;amp;;subject=Archiv+prezentac%26%23237%3b" target="_blank" title = "Post http://blog.vyvojar.cz/lukaashek/archive/2009/12/04/archiv-prezentac.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=235880" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/.NET+Framework/default.aspx">.NET Framework</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/XML/default.aspx">XML</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/LINQ+to+SQL/default.aspx">LINQ to SQL</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/lukaashek/archive/tags/WPF/default.aspx">WPF</category></item></channel></rss>