<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/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>Alik Levin's : AJAX</title><link>http://blogs.msdn.com/alikl/archive/tags/AJAX/default.aspx</link><description>Tags: AJAX</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>ASP.NET Performance: Fast AJAX, Faster AJAX</title><link>http://blogs.msdn.com/alikl/archive/2008/10/29/asp-net-performance-fast-ajax-faster-ajax.aspx</link><pubDate>Wed, 29 Oct 2008 00:43:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9021016</guid><dc:creator>alikl</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/alikl/comments/9021016.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alikl/commentrss.aspx?PostID=9021016</wfw:commentRss><wfw:comment>http://blogs.msdn.com/alikl/rsscomments.aspx?PostID=9021016</wfw:comment><description>&lt;table cellspacing="5" cellpadding="2" width="557" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="226"&gt;&amp;#160;&lt;a href="http://practicethis.com/" target="_blank"&gt;&lt;img title="Alik Levin" height="50" alt="Alik Levin" src="http://blogs.microsoft.co.il/blogs/mcs/WindowsLiveWriter/d20b00ba5cce_FD44/image_5.png" width="50" border="0" /&gt;&lt;/a&gt;&amp;#160;&amp;#160;&amp;#160; AJAX improves significantly both user experience and performance. It can be further improved by using down level capabilities that .Net framework offers. Specifically, consuming Web Services and WCF directly from client script. The best part is that ASP.NET AJAX comes with built in libraries - server and client - that make coding fun while significantly improving the web application's performance.&lt;/td&gt;        &lt;td valign="top" width="314"&gt;&lt;script type="text/javascript"&gt;

 
&lt;!-- 
lqm_channel=1;
lqm_publisher=253;
lqm_zone=1;
lqm_format=6;
//--&gt;&lt;/script&gt;&lt;script src="http://a.lakequincy.com/s.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h3&gt;Customer Case Study&lt;/h3&gt;  &lt;p&gt;The customer was using hand crafted XmlHttp requests from client scripts requesting the data from ASPX pages. While the goal was achieved - the amount of information sent to the server was minimal and the user interface was responsive - the coding was not really fun. Also, since the requests were sent to regular ASPX pages the whole ASPX pipeline was executing unnecessarily utilizing CPU for nothing. The customer did not want to use Update Panel control. Although it boosts coding productivity, it also adds some burden on the network. Network utilization should have been kept to the minimum. &lt;/p&gt;  &lt;h3&gt;Analysis&lt;/h3&gt;  &lt;p&gt;After quick research I found two great resources that directed me to the solution that would satisfy both requirements:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Coding productivity. &lt;/li&gt;    &lt;li&gt;Minimum of data in transit on the wire. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The first one is from Chris Hay&amp;#160; - &lt;a href="http://silverlightuk.blogspot.com/2008/10/remix08-uk-aspnet-front-end-performance.html"&gt;remix08 UK ASP.NET Front End Performance Slides&lt;/a&gt; and the other one is from Jeff Prosise - &lt;a href="http://download.microsoft.com/download/f/2/a/f2a04d97-4472-4d3d-bc5a-ecec0d073f24/03_Power_%20ASP_NET_AJAX_Programming.ppt"&gt;Power ASP.NET AJAX Programming&lt;/a&gt;. They both outline the usage of Script-Callable Web Services. There are three simple steps to follow:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Declare your Web Service as Script-Callable by adding class level attribute:&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;pre class="code"&gt;[System.Web.Script.Services.&lt;span style="color: #2b91af"&gt;ScriptService&lt;/span&gt;]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;AJAXCallableWebService &lt;/span&gt;: System.Web.Services.&lt;span style="color: #2b91af"&gt;WebService
&lt;/span&gt;{
    [&lt;span style="color: #2b91af"&gt;WebMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;HelloWorld(&lt;span style="color: blue"&gt;string &lt;/span&gt;name)
    {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Hello, &amp;quot; &lt;/span&gt;+ name;
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Declare service reference inside the ScriptManager:&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptManager &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;ScriptManager1&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Services&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ServiceReference &lt;/span&gt;&lt;span style="color: red"&gt;InlineScript&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;~/AJAXCallableWebService.asmx&amp;quot; /&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Services&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptManager&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Call a Web Service from the client script:&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;javascript&amp;quot;&amp;gt;
function &lt;/span&gt;callAjax()
{
    &lt;span style="color: blue"&gt;var &lt;/span&gt;text = document.getElementById(&lt;span style="color: #a31515"&gt;&amp;quot;Text1&amp;quot;&lt;/span&gt;).value
    
    AJAXCallsWebService.AJAXCallableWebService.HelloWorld(text,onSuccess);
}
&lt;span style="color: blue"&gt;function &lt;/span&gt;onSuccess(result)
{
    document.getElementById(&lt;span style="color: #a31515"&gt;&amp;quot;result&amp;quot;&lt;/span&gt;).innerText = result;
}
&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;span &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;result&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;span&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Button1&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;button&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;button&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;callAjax()&amp;quot; /&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Text1&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text&amp;quot; /&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;h3&gt;Sample Visual Studio Solution&lt;/h3&gt;

&lt;p&gt;Grab the sample solution implemented using Visual Studio 2008 form my SkyDrive &lt;a href="http://cid-dd25b83e4ca261f7.skydrive.live.com/self.aspx/Visual%20Studio%20Projects/AJAXCallsWebService.zip"&gt;here&lt;/a&gt;:&lt;/p&gt;
&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-dd25b83e4ca261f7.skydrive.live.com/embedrowdetail.aspx/Visual%20Studio%20Projects/AJAXCallsWebService.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;

&lt;h3&gt;Related Materials&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2008/02/18/how-to-consume-wcf-using-ajax-without-asp-net.aspx"&gt;How To Consume WCF Using AJAX Without ASP.NET&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/12/31/asp-net-ajax-control-toolkit-basic-sample-for-dynamicpopulate-control.aspx"&gt;ASP.NET AJAX Control Toolkit - Basic Sample For DynamicPopulate Control&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;a onclick="window.location = &amp;#39;http://www.reddit.com/submit?url=&amp;#39; + encodeURIComponent(window.location); return false" href="http://www.reddit.com/submit"&gt;&lt;img alt="submit to reddit" src="http://www.reddit.com/static/spreddit11.gif" border="0" /&gt; &lt;/a&gt;

&lt;p&gt;&lt;strong&gt;This template is made with &lt;a href="http://practicethis.com/" target="_blank"&gt;PracticeThis.com&lt;/a&gt; plugin for Windows Live Writer&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9021016" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alikl/archive/tags/Development+Phase/default.aspx">Development Phase</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Implementation/default.aspx">Implementation</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/alikl/archive/tags/AJAX/default.aspx">AJAX</category></item><item><title>How To Consume WCF Using AJAX Without ASP.NET</title><link>http://blogs.msdn.com/alikl/archive/2008/02/18/how-to-consume-wcf-using-ajax-without-asp-net.aspx</link><pubDate>Mon, 18 Feb 2008 23:35:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7779790</guid><dc:creator>alikl</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/alikl/comments/7779790.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alikl/commentrss.aspx?PostID=7779790</wfw:commentRss><wfw:comment>http://blogs.msdn.com/alikl/rsscomments.aspx?PostID=7779790</wfw:comment><description>&lt;p&gt;How to consume WCF services directly from Html client? How to add AJAX-like functionally to application that does not natively support ASP.NET AJAX like classic ASP, ASP.NET 1.1, or PHP?&lt;/p&gt;  &lt;p&gt;WCF that ships with .Net 3.5 provides capability to consume it from any JavaScript enabled client via XML or JSON encoding. There is new built in webHttpBinding that supports either JSON or XML encoded messages to be sent to WCF services.The functionality can dramatically improve performance and user experience.&lt;/p&gt;  &lt;p&gt;This post summarizes the steps to create and consume basic WCF service using webHttpBinding binding. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Summary of Steps &lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Step 1 &amp;#8211; Create WCF service.&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Step 2 &amp;#8211; Configure WCF end point.&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Step 3 &amp;#8211; Create JavaScript to invoke WCF service.&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Step 4 &amp;#8211; Test the solution.&lt;/b&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Next section describes each and every step in details&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Step 1 &amp;#8211; Create WCF service&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Open Visual Studio and create new WCF service project by choosing &amp;quot;WCF Service Application&amp;quot; template under &amp;quot;Web&amp;quot; project type. Name it Wcf2Ajax. Open IService1.cs file and create OperationContract as follows:&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; [ServiceContract]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&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; IService1&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;  {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;      [OperationContract]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;      &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Sum2Integers(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; n1, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; n2);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Open Service1.svc.cs file and add public method that accepts to integers and returns the sum of it. This is the functionality that will be exposed by the WCF service and consumed by JavaScript enabled client:&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Service1 : IService1&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Sum2Integers(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; n1, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; n2)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; result = num1 + num2;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; result.ToString();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;     }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;b&gt;Step 2 &amp;#8211; Configure WCF end point&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Open web.config file and add &amp;lt;binding&amp;gt; section to &amp;lt;system.serviceModel section. Add &amp;lt;webHttpBinding&amp;gt; to binding section:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;bindings&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;webHttpBinding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;binding &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;AjaxBinding&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;webHttpBinding&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;bindings&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Add AjaxBehavior to &amp;lt;behaviors&amp;gt; section to support WCF invocation via AJAX:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;behaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpointBehaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;AjaxBehavior&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;enableWebScript&lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Configure WCF service's endpoint to use newly created binding:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpoint &lt;/span&gt;&lt;span style="color: red"&gt;address&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;ajaxEndpoint&lt;/span&gt;&amp;quot; 
          &lt;span style="color: red"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;AjaxBehavior&lt;/span&gt;&amp;quot; 
          &lt;span style="color: red"&gt;binding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;webHttpBinding&lt;/span&gt;&amp;quot; 
          &lt;span style="color: red"&gt;bindingConfiguration&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;AjaxBinding&lt;/span&gt;&amp;quot; 
          &lt;span style="color: red"&gt;contract&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Wcf2Ajax.IService1&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Step 3 &amp;#8211; Create JavaScript to invoke WCF service&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Add Html file to the solution by right clicking on the solution node in solution explorer and choosing &amp;quot;New Item...&amp;quot; and then &amp;quot;HTML Page&amp;quot; template. Name it WCFConsumer.htm. Add few HTML controls - two text boxes to accept two integers, one pure HTML button to trigger WCF call, and &amp;lt;span&amp;gt; element to present the result:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;num1&amp;quot; /&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;num2&amp;quot; /&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;button&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;CallWcfAjax()&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Call WCF via AJAX&amp;quot; /&amp;gt;
&lt;/span&gt;Result &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;span &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;result&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;span&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Add &amp;lt;script&amp;gt; block to &amp;lt;header&amp;gt; section and add JavaSctip that builds HTTP request and wires invocation function to some event, say button click:&lt;/p&gt;

&lt;pre class="code"&gt;    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;
    function &lt;/span&gt;CallWcfAjax()
    {
        &lt;span style="color: blue"&gt;var &lt;/span&gt;xmlHttp = &lt;span style="color: blue"&gt;new &lt;/span&gt;ActiveXObject(&lt;span style="color: #a31515"&gt;&amp;quot;Microsoft.XmlHttp&amp;quot;&lt;/span&gt;);

        &lt;span style="color: blue"&gt;var &lt;/span&gt;url = &lt;span style="color: #a31515"&gt;&amp;quot;Service1.svc/ajaxEndpoint/&amp;quot;&lt;/span&gt;;
        url = url + &lt;span style="color: #a31515"&gt;&amp;quot;Sum2Integers&amp;quot;&lt;/span&gt;;

        &lt;span style="color: blue"&gt;var &lt;/span&gt;body = &lt;span style="color: #a31515"&gt;'{&amp;quot;n1&amp;quot;:'&lt;/span&gt;;
        body = body + document.getElementById(&lt;span style="color: #a31515"&gt;&amp;quot;num1&amp;quot;&lt;/span&gt;).value + &lt;span style="color: #a31515"&gt;',&amp;quot;n2&amp;quot;:'&lt;/span&gt;;
        body = body + document.getElementById(&lt;span style="color: #a31515"&gt;&amp;quot;num2&amp;quot;&lt;/span&gt;).value + &lt;span style="color: #a31515"&gt;'}'&lt;/span&gt;;
          
        &lt;span style="color: green"&gt;// Send the HTTP request
        &lt;/span&gt;xmlHttp.open(&lt;span style="color: #a31515"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;, url, &lt;span style="color: blue"&gt;true&lt;/span&gt;);
        xmlHttp.setRequestHeader(&lt;span style="color: #a31515"&gt;&amp;quot;Content-type&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;application/json&amp;quot;&lt;/span&gt;);
        xmlHttp.send(body);

        &lt;span style="color: green"&gt;// Create result handler 
        &lt;/span&gt;xmlHttp.onreadystatechange= &lt;span style="color: blue"&gt;function &lt;/span&gt;X()
        {
        
             &lt;span style="color: blue"&gt;if&lt;/span&gt;(xmlHttp.readyState == 4)
             {
                  &lt;span style="color: #a31515"&gt;&lt;font color="#333333"&gt;result.innerText&lt;/font&gt;&lt;/span&gt; = xmlHttp.responseText;
             }
        }
    }
    &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;Step 4 &amp;#8211; Test the solution&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Build the solution and navigate to WCFConsumer.htm. Provide two integers to both text boxes and hit &amp;quot;Call WCF via Ajax&amp;quot; button. You should expect for result similar as depicted below:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/ConsumeWCFServiceByAnyJavaScriptEnabledC_710F/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="123" alt="image" src="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/ConsumeWCFServiceByAnyJavaScriptEnabledC_710F/image_thumb.png" width="381" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Parse the result to your needs.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;b&gt;My related post&lt;/b&gt;

&lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/12/31/asp-net-ajax-control-toolkit-basic-sample-for-dynamicpopulate-control.aspx"&gt;ASP.NET AJAX Control Toolkit - Basic Sample For DynamicPopulate Control&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/10/03/ajax-security-client-side-validation-is-for-usability-only-not-for-security.aspx"&gt;AJAX Security - Client Side Validation Is For Usability Only, Not For Security&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/07/26/wcf-security-in-intranet-scenario-thoughts-on-cons-and-pros.aspx"&gt;WCF Security In Intranet Scenario : Thoughts On Cons and Pros&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;Related resources&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb885100.aspx" target="_blank"&gt;Creating WCF AJAX Services without ASP.NET&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download Visual Studio 2008 project with the sample from my SkyDrive&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-dd25b83e4ca261f7.skydrive.live.com/embedrowdetail.aspx/Visual%20Studio%20Projects/Wcf2Ajax.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7779790" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alikl/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Development+Phase/default.aspx">Development Phase</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Implementation/default.aspx">Implementation</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Planning+Phase/default.aspx">Planning Phase</category><category domain="http://blogs.msdn.com/alikl/archive/tags/AJAX/default.aspx">AJAX</category></item><item><title>Profiling JavaScript With Ajax View Tool: Spot Poor Performance Client Script In No Time</title><link>http://blogs.msdn.com/alikl/archive/2008/01/17/profiling-javascript-with-ajax-view-tool-spot-poor-performance-client-script-in-no-time.aspx</link><pubDate>Thu, 17 Jan 2008 07:19:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7139313</guid><dc:creator>alikl</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/alikl/comments/7139313.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alikl/commentrss.aspx?PostID=7139313</wfw:commentRss><wfw:comment>http://blogs.msdn.com/alikl/rsscomments.aspx?PostID=7139313</wfw:comment><description>&lt;p&gt;Ever wondered why your application unreasonably slow? You have it all - most powerful hardware, your database is tuned, SQL queries are optimized, network is barely utilized, and .Net code is super efficient. So why on earth response time is so slow?&lt;/p&gt;  &lt;p&gt;The answer might lie in recently developing area &amp;#8211; client script. I&amp;#8217;ve witnessed few over-AJAX&amp;#8217;ed applications with poor performance and far from the best user experience. Quite the contrary what AJAX and other client script flavors are for&amp;#8230;&lt;/p&gt;  &lt;p&gt;In this post I will show how &lt;a href="http://research.microsoft.com/projects/ajaxview/"&gt;Ajax View&lt;/a&gt; &amp;#8211; JavaScript profiler project from Microsoft Research &amp;#8211; helped me to spot client side script bottlenecks in no time and make the customer happy.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Ajax View &amp;#8211; the tool.&lt;/strong&gt; Ajax View is available for download &lt;a href="http://research.microsoft.com/research/downloads/details/e82e1a27-e500-4e91-85fd-75886242acfc/details.aspx" target="_blank"&gt;here&lt;/a&gt;. The tool's goal: &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;The goal of the Ajax View project is to improve developer's visibility into and control over their web applications' behaviors on end-user's desktops.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;Profiling process.&lt;/b&gt; The creators of the tool, &lt;a href="http://research.microsoft.com/~emrek/"&gt;Emre Kıcıman&lt;/a&gt; and &lt;a href="http://research.microsoft.com/~livshits/"&gt;Ben Livshits&lt;/a&gt;, provided simple and very useful &lt;a href="http://research.microsoft.com/projects/ajaxview/AjaxViewUsage-1.htm" target="_blank"&gt;walk through&lt;/a&gt; on how to install and use the tool. &lt;/li&gt;    &lt;li&gt;&lt;b&gt;Recommendations to improve client side script.&lt;/b&gt; &lt;a href="http://insidehttp.blogspot.com/" target="_blank"&gt;Eric Lawrence&lt;/a&gt;, &lt;a href="http://www.fiddler2.com" target="_blank"&gt;Fiddler tool&lt;/a&gt; creator, kindly pointed me to useful recommendations how to make JavaScript run faster:       &lt;ul&gt;       &lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/IE_Fiddler2.asp" target="_blank"&gt;Fiddler PowerToy - Part 2: HTTP Performance&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://stevesouders.com/hpws/"&gt;Steve Souders' Rules for High Performance Websites&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms533021.aspx" target="_blank"&gt;High Performance DHTML&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms533020.aspx" target="_blank"&gt;High Performance HTML&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://blogs.msdn.com/ie/archive/2006/08/28/728654.aspx" target="_blank"&gt;IE + JavaScript Performance Recommendations - Part 1&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://blogs.msdn.com/ie/archive/2006/11/16/ie-javascript-performance-recommendations-part-2-javascript-code-inefficiencies.aspx" target="_blank"&gt;IE+JavaScript Performance Recommendations Part 2: JavaScript Code Inefficiencies&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://blogs.msdn.com/ie/archive/2007/01/04/ie-jscript-performance-recommendations-part-3-javascript-code-inefficiencies.aspx" target="_blank"&gt;IE+JScript Performance Recommendations Part 3: JavaScript Code Inefficiencies&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Customer's story.&lt;/strong&gt; During recent application performance review we identified in no time the following problems using Ajax View: &lt;/li&gt; &lt;/ul&gt;  &lt;table cellspacing="3" cellpadding="3" width="400" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="192"&gt;&lt;strong&gt;Issue&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="197"&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="192"&gt;1200 lines of inline JavaScript &lt;/td&gt;        &lt;td valign="top" width="197"&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#external" target="_blank"&gt;Make JavaScript and CSS External&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="192"&gt;Using XmlHttp object with its async property set to true while performing time consuming call to the server&lt;/td&gt;        &lt;td valign="top" width="197"&gt;Do not &lt;a href="http://asp.net/AJAX/AjaxControlToolkit/Samples/Default.aspx" target="_blank"&gt;re-invent the wheel&lt;/a&gt;, use ready to-go, proven AJAX Libraries like &lt;a href="http://asp.net/ajax/" target="_blank"&gt;ASP.NET AJAX&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="192"&gt;Manipulating large XML islands inefficiently&lt;/td&gt;        &lt;td valign="top" width="200"&gt;Do not use large XML documents - neither client side nor server side. Use lazy approach of downloading the data on demand.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;b&gt;My related posts&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/11/02/identify-asp-net-web-services-and-wcf-performance-issues-by-examining-iis-logs.aspx"&gt;Identify ASP.NET, Web Services, And WCF Performance Issues By Examining IIS Logs&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/10/17/improve-web-application-performance-by-reducing-number-of-http-requests-fiddler-to-the-rescue.aspx"&gt;Improve Web Application Performance By Reducing Number Of Http Requests - Fiddler To The Rescue&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/03/28/performance-testing-for-the-masses.aspx"&gt;Performance Testing For The Masses&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7139313" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alikl/archive/tags/Test+Phase/default.aspx">Test Phase</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Tools/default.aspx">Tools</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/alikl/archive/tags/AJAX/default.aspx">AJAX</category></item><item><title>ASP.NET AJAX Control Toolkit - Basic Sample For DynamicPopulate Control</title><link>http://blogs.msdn.com/alikl/archive/2007/12/31/asp-net-ajax-control-toolkit-basic-sample-for-dynamicpopulate-control.aspx</link><pubDate>Mon, 31 Dec 2007 07:49:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6912858</guid><dc:creator>alikl</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/alikl/comments/6912858.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alikl/commentrss.aspx?PostID=6912858</wfw:commentRss><wfw:comment>http://blogs.msdn.com/alikl/rsscomments.aspx?PostID=6912858</wfw:comment><description>&lt;p&gt;How to dynamically populate the content of a control based on Web Service call triggered by another control? &lt;a href="http://asp.net/AJAX/AjaxControlToolkit/Samples/DynamicPopulate/DynamicPopulate.aspx" target="_blank"&gt;DynamicPopulate extender&lt;/a&gt; to the rescue:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;DynamicPopulate is a simple extender that replaces the contents of a control with the result of a web service or page method call. The method call returns a string of HTML that is inserted as the children of the target element.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This post to summarize basic steps of using AJAX Control Toolkit's DynamicPopulate extender. Plus customer's case study of how it was implemented with ASP.NET Masterpage for performance and UX improvement.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Summary of steps&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Step 1 - Create ASP.NET Web Application&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Step 2 - Add server side code&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Step 3 - Add DynamicPopulate extender&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Step 4 - Add client side script to use the extender behavior&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Step 5 - Add client side event to invoke the client script&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Step 6 - Test the solution&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Following section describes each step in details.&lt;/p&gt;  &lt;div class="pullquote_right"&gt;&lt;b&gt;&amp;quot;Then another ask came through - content page must update the sidebar that is part of the Master page....&amp;quot;&lt;/b&gt;&lt;/div&gt;  &lt;li&gt;&lt;strong&gt;Step 1 - Create ASP.NET Web Application. &lt;/strong&gt;Open &lt;a href="http://www.microsoft.com/visualstudio" target="_blank"&gt;Visual Studio 2008&lt;/a&gt;. Create new &amp;quot;ASP.NET Web Application&amp;quot; project, found under Web node in &amp;quot;New Project&amp;quot; dialog. Name it DynamicPopulateSample. Add site's Master Page by right clicking on the project in project explorer window, then &amp;quot;Add&amp;quot; -&amp;gt;&amp;#160; &amp;quot;New Item...&amp;quot;, then choose &amp;quot;Master Page&amp;quot; template from the &amp;quot;New Item&amp;quot; dialog. Leave its default name. Drag Label control on the Master page from the Tool Box. The Label will be dynamically updated. Add new ASPX page by right clicking on the project in project explorer window, then &amp;quot;Add&amp;quot; -&amp;gt; &amp;quot;New Item....&amp;quot;, then choose &amp;quot;Web Content Form&amp;quot;. Specify it's Master Page by choosing Site1.Master. Name it default.aspx. Add two pure Html radio buttons to default.aspx. These will serve as a trigger to update the Label on the Master Page. Add &lt;a href="http://asp.net/AJAX/AjaxControlToolkit/Samples/Default.aspx" target="_blank"&gt;AjaxControlToolkit.dll&lt;/a&gt; to the project's&amp;#160; bin folder and add reference to it. &lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Step 2 - Add server side code.&lt;/strong&gt; Open default.aspx.cs code behind for default.aspx. Add the following function:     &lt;pre class="code"&gt;[System.Web.Services.&lt;span style="color: #2b91af"&gt;WebMethod&lt;/span&gt;]
[System.Web.Script.Services.&lt;span style="color: #2b91af"&gt;ScriptMethod&lt;/span&gt;]
&lt;span style="color: blue"&gt;public static string &lt;/span&gt;GetHtml(&lt;span style="color: blue"&gt;string &lt;/span&gt;contextKey)
{
    &lt;span style="color: green"&gt;// A little pause to mimic a latent call
    // This is the place to perform server side
    // code like DB access
    &lt;/span&gt;System.Threading.&lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.Sleep(350);

    &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Persona: {0}&amp;quot;&lt;/span&gt;, contextKey);
}&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Step 3 - Add DynamicPopulate extender.&lt;/strong&gt; Register AjaxControlToolkit assembly inside the page. Add the following declaration right after &amp;lt;@Page...&amp;gt; directive&amp;#160; &lt;br /&gt;&lt;span style="background: #ffee62"&gt;&lt;/span&gt;

  &lt;p&gt;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@ &lt;/span&gt;&lt;span style="color: #a31515"&gt;Register 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;Assembly&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;AjaxControlToolkit&amp;quot; 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;Namespace&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;AjaxControlToolkit&amp;quot; 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;TagPrefix&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;ajaxToolkit&amp;quot;&lt;/span&gt;&lt;span style="background: #ffee62"&gt;%&amp;gt; 
      &lt;br /&gt;&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

    &lt;br /&gt;Add AJAX Script Manager to the page:&amp;#160; &lt;br /&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptManager &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;ScriptManager1&amp;quot;&lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;/&amp;gt;&lt;/span&gt; &lt;/p&gt;

  &lt;p&gt;Add DynamicPopulateExtender control to the page:&lt;/p&gt;

  &lt;p&gt;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ajaxToolkit&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;DynamicPopulateExtender 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;dp&amp;quot;&lt;/span&gt;&lt;span style="color: red"&gt;BehaviorID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;dp1&amp;quot;&lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot; 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;TargetControlID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;form1$Label1&amp;quot; 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;ClearContentsDuringUpdate&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot; 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;ServiceMethod&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;GetHtml&amp;quot; /&amp;gt; &lt;/span&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;Notice TargetControlID is set to &amp;quot;&lt;font color="#0000ff"&gt;form1$Label1&lt;/font&gt;&amp;quot;. This is the Label control to be updated with the Html string returned by the server side code I described in Step 2. $ notation means nesting - read &amp;quot;Label1 control inside form1 control&amp;quot;. It can be any nesting depth. Save your work and then view in browser to make sure that no exceptions generated. &lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Step 4 - Add client side script to use the extender behavior.&lt;/strong&gt;&amp;#160; So far, there is Label1 to be updated and it is sitting in the Mater page. There is DynamicPopulateExtender that defines the behavior. There is server side code to handle the request. Now add client script that makes the request to the server: 

  &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;

  &lt;p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt; 
      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; function &lt;/span&gt;updateDateKey(value) { 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var &lt;/span&gt;behavior = $find(&lt;span style="color: #a31515"&gt;'dp1'&lt;/span&gt;); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt;(behavior) { 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; behavior.populate(value); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Sys.Application.add_load(&lt;span style="color: blue"&gt;function&lt;/span&gt;(){updateDateKey(&lt;span style="color: #a31515"&gt;'Alik Levin'&lt;/span&gt;);}); 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
  &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

  &lt;p&gt;Notice initialization function call - the last row. It invokes the client side function to call into server side for the first time when the page is rendered into the browser for the first time. &lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Step 5 - Add client side event to invoke the client script.&lt;/strong&gt; The last part is adding the event that triggers the client side code to be invoked and thus making call to the server. Locate Html radio buttons that were created during Step 1, add onclick events to call the client side function: 

  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;radio&amp;quot; 
       &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;rbFormat&amp;quot; 
       &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;r0&amp;quot; 
       &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;='alik'
       &lt;/span&gt;&lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;updateDateKey(this.value);&amp;quot; 
       &lt;/span&gt;&lt;span style="color: red"&gt;checked&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;checked&amp;quot; /&amp;gt;&lt;/span&gt;click to set 'alik'&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;input &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;radio&amp;quot; 
       &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;rbFormat&amp;quot; 
       &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Radio1&amp;quot; 
       &lt;/span&gt;&lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;updateDateKey(this.value);&amp;quot;
       &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;='levin' /&amp;gt;&lt;/span&gt;click to set 'levin'&lt;/pre&gt;
  &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Step 6 - Test the solution.&lt;/strong&gt; Save your work and view in browser. Click on the radio buttons and you should see how the Label in master page gets updated with respective values. It all happens with small delays simulated on the server by Sleep function. I think it is cool. 

  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Case Study&lt;/strong&gt; &lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;I was asked by a customer to offer a solution for very responsive UX [User Experience] while avoiding annoying refresh of the web page. Natural answer was AJAX. The customer also asked to provide the solution for common look and feel. Master pages was my answer. Then another ask came through - content page must update the sidebar that is part of the Master page.... hmm A-ha! Use DynamicPopulateExtender.&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;My Related posts&lt;/strong&gt;&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;
      &lt;p&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/10/03/ajax-security-client-side-validation-is-for-usability-only-not-for-security.aspx" target="_blank"&gt;AJAX Security - Client Side Validation Is For Usability Only, Not For Security&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;

    &lt;li&gt;
      &lt;p&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/12/18/asp-net-3-5-extensions-basic-steps-to-create-dynamic-data-web-application-focus-on-security-and-performance.aspx" target="_blank"&gt;ASP.NET 3.5 Extensions: Basic Steps To Create Dynamic Data Web Application - Focus On Security and Performance&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;Sample VS2008 project that demonstrates DynamicPopulateExtender can be found on my SkyDrive:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-dd25b83e4ca261f7.skydrive.live.com/embedrowdetail.aspx/Visual%20Studio%20Projects/DynamicPopulateSample.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;

  &lt;p&gt;Watch UX [User Experience] in the video below: &lt;/p&gt;
  &lt;embed pluginspage="http://macromedia.com/go/getflashplayer" src="http://images.video.msn.com/flash/soapbox1_1.swf" width="432" height="364" type="application/x-shockwave-flash" quality="high" base="http://images.video.msn.com" allowfullscreen="true" flashvars="c=v&amp;amp;v=e5437b52-24c0-4d3d-8189-17d5085d96d9&amp;amp;ifs=true&amp;amp;fr=msnvideo&amp;amp;mkt=en-US&amp;amp;brand=" /&gt; 

  &lt;br /&gt;&lt;a title="DynamicPopulateExtender Demo" href="http://video.msn.com/video.aspx?vid=e5437b52-24c0-4d3d-8189-17d5085d96d9" target="_new"&gt;Video: DynamicPopulateExtender Demo&lt;/a&gt; 

  &lt;p&gt;Enjoy.&lt;/p&gt;
&lt;/li&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6912858" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alikl/archive/tags/Development+Phase/default.aspx">Development Phase</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Implementation/default.aspx">Implementation</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Planning+Phase/default.aspx">Planning Phase</category><category domain="http://blogs.msdn.com/alikl/archive/tags/AJAX/default.aspx">AJAX</category></item><item><title>ASP.NET 3.5 Extensions: Basic Steps To Create Dynamic Data Web Application - Focus On Security and Performance</title><link>http://blogs.msdn.com/alikl/archive/2007/12/18/asp-net-3-5-extensions-basic-steps-to-create-dynamic-data-web-application-focus-on-security-and-performance.aspx</link><pubDate>Tue, 18 Dec 2007 13:08:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6795451</guid><dc:creator>alikl</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/alikl/comments/6795451.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alikl/commentrss.aspx?PostID=6795451</wfw:commentRss><wfw:comment>http://blogs.msdn.com/alikl/rsscomments.aspx?PostID=6795451</wfw:comment><description>&lt;p&gt;This post walks through the steps I've taken to create simple Dynamic Data Web Application. I just loved the development model for &lt;a href="http://msdn2.microsoft.com/en-us/library/ms978717.aspx" target="_blank"&gt;DTO [Data Transfer Object]&lt;/a&gt; and Input Validation options.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Summary of steps&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Step 1 - Download and install ASP.NET Extensions.&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Step 2 - Create New Dynamic Data Web Application in VS2008&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Step 3 - Add "LINQ to SQL Classes" file to the project&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Step 4 - Test the project&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Step 5 - Create Model Class and add validation rules&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Following are detailed explanations for each step.&lt;/p&gt; &lt;li&gt;&lt;strong&gt;Step 1 - Download and install ASP.NET Extensions. &lt;/strong&gt;ASP.NET Extensions can be found here - &lt;a title="http://asp.net/downloads/3.5-extensions/" href="http://asp.net/downloads/3.5-extensions/" target="_blank"&gt;http://asp.net/downloads/3.5-extensions/&lt;/a&gt;. I installed it on my Vista machine that has Visual Studio 2008 installed.  &lt;li&gt;&lt;strong&gt;Step 2 - Create New Dynamic Data Web Application in VS2008.&lt;/strong&gt; Open Visual Studio 2008 and choose "Dynamic Data Web Application" template found under Web node. Make sure that the project references System.Web.Extensions assembly version 3.6. If not then remove it and reference the assembly from "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\ASP.NET 3.5 Extensions\System.Web.Extensions.dll".  &lt;li&gt;&lt;strong&gt;Step 3 - Add "LINQ to SQL Classes" file to the project. &lt;/strong&gt;Right click on the project and choose "Add"-&amp;gt;"New Item..." and then choose "LINQ to SQL Classes" template from "Data" node. In server Explorer expand "Data Connections" node, expand desired database, and then expand "Tables" node. Highlight desired tables and then drag them onto "LINQ to SQL Classes" component [double click file with .dbml extension].  &lt;li&gt;&lt;strong&gt;Step 4 - Test the project.&lt;/strong&gt; Right click on default.aspx page and choose "View in Browser". The page should look similar to the picture below. Click on the tables names to see the actual values and master-child view.  &lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/BasicStepsToCreateDynamicDataWebApplicat_13F6F/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 10px 20px; border-right-width: 0px" height="211" alt="image" src="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/BasicStepsToCreateDynamicDataWebApplicat_13F6F/image_thumb.png" width="234" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;li&gt;&lt;strong&gt;Step 5 - Create Model Class and add validation rules. &lt;/strong&gt;Adding validation rules can be accomplished using .Net attributes declaratively or using partial methods. Create new class. Add "&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Web.DynamicData;" declaration. Delete the default constructor. Add partial class with the name of desired table, say "Item" or/and&amp;nbsp; "Product".  &lt;ul&gt; &lt;ul&gt; &lt;li&gt;&lt;em&gt;&lt;u&gt;Attribute based input validation&lt;/u&gt;&lt;/em&gt;. Add attribute to the class, for example to check range for ListPrice field/column and add the following declaration:&lt;a href="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/BasicStepsToCreateDynamicDataWebApplicat_13F6F/image_6.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="65" alt="image" src="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/BasicStepsToCreateDynamicDataWebApplicat_13F6F/image_thumb_2.png" width="401" border="0"&gt;&lt;/a&gt;  &lt;li&gt;&lt;u&gt;&lt;em&gt;Partial method input validation&lt;/em&gt;&lt;/u&gt;. Add partial method for desired field change [intelliSense really rocks at this part] and then add validation logic:&lt;a href="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/BasicStepsToCreateDynamicDataWebApplicat_13F6F/image_8.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="104" alt="image" src="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/BasicStepsToCreateDynamicDataWebApplicat_13F6F/image_thumb_3.png" width="400" border="0"&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;Validation rules propagated to both client [for usability] and server [for security], this is how violation of input validation looks in it default view:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/BasicStepsToCreateDynamicDataWebApplicat_13F6F/image_10.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="60" alt="image" src="http://blogs.msdn.com/blogfiles/alikl/WindowsLiveWriter/BasicStepsToCreateDynamicDataWebApplicat_13F6F/image_thumb_4.png" width="410" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Heaven. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Focus on Security&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I can create data driven web pages using GridView and DataSets. The drawback is that validation is not that straightforward. On other hand I can create custom collections and manually data bind it - the code is much nicer and cleaner and validation rules are easy to add but there is the need of writing extra code. In the case of Dynamic Data there is fantastic combination of design time productivity and also clean code where validation rules are applied directly to the &lt;em&gt;model&lt;/em&gt;. Less room for mistake to introduce security vulnerability.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Focus on Performance&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ready to go templates that are generated with the default Dynamic Data projects already implement AJAX and paging. It reduces dramatically amount of data that round trips over the wire. Large HTML output - including ViewState - is one of the biggest performance vulnerabilities I've noticed recently. AJAX and paging is a great way to overcome this issue.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;My related posts&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/10/03/ajax-security-client-side-validation-is-for-usability-only-not-for-security.aspx"&gt;AJAX Security - Client Side Validation Is For Usability Only, Not For Security&lt;/a&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/07/06/typed-dataset-potential-performance-and-security-risk.aspx"&gt;Typed DataSet - Potential Performance And Security Risk&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Related materials&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The post was inspired and based on &lt;a href="http://blogs.msdn.com/davidebb/archive/2007/12/12/dynamic-data-screencast-is-now-available.aspx" target="_blank"&gt;David Ebbo's fantastic screencast&lt;/a&gt;  &lt;li&gt;&lt;a title="http://quickstarts.asp.net/3-5-extensions/" href="http://quickstarts.asp.net/3-5-extensions/" target="_blank"&gt;ASP.NET 3.5 Extensions Quickstarts&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/03/02/CuttingEdge/#S6" target="_blank"&gt;Keeping View State on the Server&lt;/a&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/jmeier/archive/2007/08/28/performance-threats.aspx" target="_blank"&gt;Performance Threats&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6795451" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alikl/archive/tags/Security/default.aspx">Security</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Development+Phase/default.aspx">Development Phase</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Implementation/default.aspx">Implementation</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Planning+Phase/default.aspx">Planning Phase</category><category domain="http://blogs.msdn.com/alikl/archive/tags/AJAX/default.aspx">AJAX</category></item><item><title>AJAX Security - Client Side Validation Is For Usability Only, Not For Security</title><link>http://blogs.msdn.com/alikl/archive/2007/10/03/ajax-security-client-side-validation-is-for-usability-only-not-for-security.aspx</link><pubDate>Wed, 03 Oct 2007 15:29:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5261117</guid><dc:creator>alikl</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/alikl/comments/5261117.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alikl/commentrss.aspx?PostID=5261117</wfw:commentRss><wfw:comment>http://blogs.msdn.com/alikl/rsscomments.aspx?PostID=5261117</wfw:comment><description>&lt;blockquote&gt; &lt;p&gt;“As to methods there may be a million and then some, but principles are few. The man who grasps principles can successfully select his own methods. The man who tries methods, ignoring principles, is sure to have trouble.”  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Ralph_Waldo_Emerson" target="_blank"&gt;Ralph Waldo Emerson&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;AJAX is another technique among myriads of others to present information and to send it back to server.  &lt;p&gt;In &lt;a href="http://blogs.msdn.com/jmeier/archive/2007/03/18/driver-s-guide-vs-owner-s-manual.aspx" target="_blank"&gt;Driver's Guide vs. Owner's Manual&lt;/a&gt;&amp;nbsp;JD Meier provides great run down about the difference between "How things work" vs. "How to get most out of it".&lt;/p&gt; &lt;p&gt;Here is an example of how to apply it in practice:&lt;/p&gt; &lt;p&gt;In &lt;a href="http://weblogs.asp.net/davidbarkol/archive/2007/07/29/asp-net-ajax-role-application-service-visual-studio-2008-orcas.aspx" target="_blank"&gt;ASP.NET AJAX Role Application Service – Visual Studio 2008 (Orcas)&lt;/a&gt;&amp;nbsp;David walks through new feature introduced in Orcas - AJAX Roles service. It provides also some sample. This is Owner's Manual explaining how things work:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;function onLoadRolesCompleted(result, userContext, methodName){ if (Sys.Services.RoleService.isUserInRole("Administrator")){ $get("adminView").style.display = "block"; } }&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;In &lt;a href="http://weblogs.asp.net/mschwarz/archive/2007/07/30/asp-net-ajax-roles-and-security.aspx" target="_blank"&gt;ASP.NET AJAX Roles and Security&lt;/a&gt;&amp;nbsp;Michael comments on the above features pointing out the importance of server side role membership validation. This is Driver's Guide for safe and secure driving:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"You have to test &lt;strong&gt;&lt;u&gt;ALWAYS&lt;/u&gt;&lt;/strong&gt; on the server-side code if the user has the needed user rights to execute your code."&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Some server side techniques to test server side code:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms978512.aspx#securityhowtosindex_input" target="_blank"&gt;Input and Data Validation&lt;/a&gt;  &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms978512.aspx#securityhowtosindex_auth" target="_blank"&gt;Authentication and Authorization&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Here is another example&amp;nbsp;for not following core security principle of server side validation:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/alikl/archive/2007/03/04/how-to-hack-wcf-new-technology-old-hacking-tricks.aspx"&gt;How To Hack WCF - New Technology, Old Hacking Tricks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5261117" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alikl/archive/tags/Input+Validation/default.aspx">Input Validation</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Security/default.aspx">Security</category><category domain="http://blogs.msdn.com/alikl/archive/tags/Development+Phase/default.aspx">Development Phase</category><category domain="http://blogs.msdn.com/alikl/archive/tags/AJAX/default.aspx">AJAX</category></item></channel></rss>