<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://advenet.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">.NET Ramblespace</title><subtitle type="html">Ramblings about .NET, C# and Related Tecnhogeek stuff...</subtitle><id>http://advenet.com/sethwebster/blog/atom.aspx</id><link rel="alternate" type="text/html" href="http://advenet.com/sethwebster/blog/default.aspx" /><link rel="self" type="application/atom+xml" href="http://advenet.com/sethwebster/blog/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2005-11-26T23:41:00Z</updated><entry><title>ASP.NET 2.0 - Client/Server Javascript Postbacks in Final</title><link rel="alternate" type="text/html" href="http://advenet.com/sethwebster/blog/archive/2005/11/26/AspCallbacks.aspx" /><id>http://advenet.com/sethwebster/blog/archive/2005/11/26/AspCallbacks.aspx</id><published>2005-11-27T06:41:00Z</published><updated>2005-11-27T06:41:00Z</updated><content type="html">&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;ASP.NET 2.0 - Client/Server Callbacks&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Those of you familiar with web development will probably know about the fabulous advantages of using Client/Server callbacks for retrieving information with doing a complete round trip to the server.&amp;nbsp;&amp;nbsp; This is especially useful when performing lookups based on user entry.&amp;nbsp; There have been various incarnations that have demonstrated different ways to accomplish this such as hidden IFRAMEs, and the XMLHTTP ActiveX object. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;You may be familiar with AJAX; a crossplatform implementation that uses the ActiveX object and is extremely powerful.&amp;nbsp; There are however situations in which AJAX may be overkill.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;After googling for awhile looking for a good and more importantly current implementation of Client/Server postbacks in ASP.NET 2.0 it was apparent to me that there isn't a lot of good documentation out there on the subject.&amp;nbsp; There were some good articles, but most of the were based on an older version of the ICallbackEventHandler interface than is currently shipping with the release version of .NET.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Thus, I have created this simple explanation of how to implement this great new functionality.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;Essentials: What's required?&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Visual Studio 2005 / Visual Web Developer based on version 2.0.50727 of the .NET Framework&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Step By Step:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;1. &lt;STRONG&gt;Create a new web site.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Click File-&amp;gt;New-&amp;gt;Web Site &lt;STRONG&gt;or&lt;/STRONG&gt; File-&amp;gt;New Web Site.&lt;BR&gt;Select ASP.NET Web Site&lt;BR&gt;Name your project, and Click &lt;STRONG&gt;Ok&lt;/STRONG&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;2. &lt;STRONG&gt;Locate the CodeFile (previously CodeBehind) for the Default.aspx Web Form.&amp;nbsp; It is normally hidden or "&lt;EM&gt;Nested"&lt;/EM&gt;&amp;nbsp;below the Default.aspx file.&amp;nbsp; Once you have opened it, you should see something similar to the following code listing:&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;1: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;2: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Data;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;3: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Configuration;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;4: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;5: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;6: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.Security;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;7: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.UI;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;8: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.UI.WebControls;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;9: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.UI.WebControls.WebParts;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;10: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.UI.HtmlControls;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;11: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;12: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;partial&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; _Default : System.Web.UI.Page&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;13: &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;14: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Page_Load(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, EventArgs e)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;15: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;16: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;17: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;18: &lt;/SPAN&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;3. &lt;STRONG&gt;The first thing that we want to do inside Default.aspx.cs, is to implement the ICallbackEventHandler interface.&amp;nbsp; Lets modify our code on line 12 as follows:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=lnum&gt;12: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;partial&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; _Default : System.Web.UI.Page,ICallbackEventHandler&lt;/PRE&gt;
&lt;P&gt;As you can see we've added ICallbackEventHandler.&amp;nbsp; Next, we will add our implementation.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;4. &lt;STRONG&gt;Right click the ICallbackEventHandler portion of line 12, and click Implement Interface.&amp;nbsp; Doing so will add the following code to the code window:&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;19: &lt;/SPAN&gt;    &lt;SPAN class=preproc&gt;#region&lt;/SPAN&gt; ICallbackEventHandler Members&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;20: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;21: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; GetCallbackResult()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;22: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;23: &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Exception(&lt;SPAN class=str&gt;"The method or operation is
not implemented."&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;24: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;25: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;26: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; RaiseCallbackEvent(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; eventArgument)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;27: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;28: &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;throw&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Exception(&lt;SPAN class=str&gt;"The method or operation is
not implemented."&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;29: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;30: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;31: &lt;/SPAN&gt;    &lt;SPAN class=preproc&gt;#endregion&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;(Your line numbers should match, but if they aren't the same, don't worry about it.)&lt;/P&gt;
&lt;P&gt;As you can see, we have a default implementation of the ICallbackEventHandler now in place.&amp;nbsp; Lets remove the default exceptions for the body of each method.&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;19: &lt;/SPAN&gt;&lt;SPAN class=preproc&gt;#region&lt;/SPAN&gt;
ICallbackEventHandler Members&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;20: &lt;/SPAN&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;21: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; GetCallbackResult()&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;22: &lt;/SPAN&gt;{&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;23: &lt;/SPAN&gt;}&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;24: &lt;/SPAN&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;25: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; RaiseCallbackEvent(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;
eventArgument)&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;26: &lt;/SPAN&gt;{&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;27: &lt;/SPAN&gt;}&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;28: &lt;/SPAN&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT color=#000000&gt;&lt;SPAN class=lnum&gt;29: &lt;/SPAN&gt;&lt;SPAN class=preproc&gt;#endregion&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Lets go ahead and save our work.&amp;nbsp; Ctrl-S for those of you who prefer the keyboard, File-&amp;gt;Save for those who are mouse-bound.&lt;/P&gt;
&lt;P&gt;5. &lt;STRONG&gt;Next, we will be editing our Default.aspx file.&amp;nbsp; Open this file and place yourself in source or markup view.&amp;nbsp;&amp;nbsp;&amp;nbsp; Here's what I have:&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;1: &lt;/SPAN&gt;&lt;SPAN class=asp&gt;&amp;lt;%@ Page Language="C#"
AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"
%&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;2: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;3: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;!&lt;/SPAN&gt;&lt;SPAN class=html&gt;DOCTYPE&lt;/SPAN&gt; &lt;SPAN class=attr&gt;html&lt;/SPAN&gt; &lt;SPAN class=attr&gt;PUBLIC&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;"-//W3C//DTD
XHTML 1.0 Transitional//EN"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;4: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;5: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;html&lt;/SPAN&gt; &lt;SPAN class=attr&gt;xmlns&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="http://www.w3.org/1999/xhtml"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;6: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;head&lt;/SPAN&gt; &lt;SPAN class=attr&gt;runat&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="server"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;7: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;title&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;Untitled Page&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;title&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;8: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;head&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;9: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;body&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;10: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;form&lt;/SPAN&gt; &lt;SPAN class=attr&gt;id&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="form1"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;runat&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="server"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;11: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;12: &lt;/SPAN&gt;    &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;13: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;14: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;form&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;15: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;body&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;16: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;html&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Lets add a script block that to the &amp;lt;head&amp;gt; section as follows:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;6: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;head&lt;/SPAN&gt; &lt;SPAN class=attr&gt;runat&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="server"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;7: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;title&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;Untitled Page&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;title&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;8: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;script&lt;/SPAN&gt; &lt;SPAN class=attr&gt;type&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="text/javascript"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;language&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="javascript"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;9: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;function&lt;/SPAN&gt; OutgoingMethod_ServerTime()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;10: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;11: &lt;/SPAN&gt;        &lt;SPAN class=rem&gt;// Set our argument so
that the server side knows where&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;12: &lt;/SPAN&gt;        &lt;SPAN class=rem&gt;// this request came from&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;13: &lt;/SPAN&gt;        arg = &lt;SPAN class=str&gt;"Time"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;14: &lt;/SPAN&gt;        &amp;lt;%=ScriptCallBackEventReference %&amp;gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;15: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;16: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;function&lt;/SPAN&gt; OutgoingMethod_IpAddressQuery()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;17: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;18: &lt;/SPAN&gt;        &lt;SPAN class=rem&gt;// Set our argument so
that the server side knows where&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;19: &lt;/SPAN&gt;        &lt;SPAN class=rem&gt;// this request came from&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;20: &lt;/SPAN&gt;        arg = &lt;SPAN class=str&gt;"IpAddress"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;21: &lt;/SPAN&gt;        &amp;lt;%=ScriptCallBackEventReference %&amp;gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;22: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;23: &lt;/SPAN&gt;    &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;24: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;function&lt;/SPAN&gt; IncomingCallbackMethod(retvalue)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;25: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;26: &lt;/SPAN&gt;        &lt;SPAN class=rem&gt;// Display our results&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;27: &lt;/SPAN&gt;        obj = document.getElementById(&lt;SPAN class=str&gt;
"resultDiv"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;28: &lt;/SPAN&gt;        obj.innerHTML = retvalue;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;29: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;30: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;script&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;31: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;head&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;As you can see, we have added three&amp;nbsp;methods.&amp;nbsp; The two methods labeled OutgoingMethod_ServerTime and OutgoingMethod_IpAddressQuery make use of a server side property called ScriptCallBackEventReference which we will create.&amp;nbsp; But first, lets create some supporting elements in Default.aspx.&amp;nbsp; Add code to the &amp;lt;body&amp;gt; section so that the entire body looks something like this:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;1: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;body&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;2: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;form&lt;/SPAN&gt; &lt;SPAN class=attr&gt;id&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="form1"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;runat&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="server"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;3: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt; &lt;SPAN class=attr&gt;onclick&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="OutgoingMethod_ServerTime();"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;style&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="border:1px solid #AAAAAA;width:160px"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;4: &lt;/SPAN&gt;    Click here for server time    &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;5: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;6: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt; &lt;SPAN class=attr&gt;onclick&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="OutgoingMethod_IpAddressQuery();"&lt;/SPAN&gt; &lt;SPAN class=attr&gt;style&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="border:1px solid #AAAAAA;width:185px"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;7: &lt;/SPAN&gt;    Click here for your ip address&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;8: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;9: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt; &lt;SPAN class=attr&gt;id&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="resultDiv"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;10: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;11: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;form&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;12: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;body&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Once you have the body code in place, switch back to code view in Default.aspx.cs.&lt;/P&gt;
&lt;P&gt;We will now implement the ScriptCallBackEventReference property.&amp;nbsp; Add the following code:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;18: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; ScriptCallBackEventReference&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;19: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;20: &lt;/SPAN&gt;        get&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;21: &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;22: &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; Page.ClientScript.GetCallbackEventReference(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"arg"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"IncomingCallbackMethod"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;23: &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;24: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;The Page.ClientScript.GetCallbackEventReference's overload shown here parameters are as follows:&lt;/P&gt;
&lt;DIV&gt;
&lt;OL&gt;
&lt;LI&gt;The control on the server-side that will handle the callback.&amp;nbsp; In this case, we use the page to handle it.&amp;nbsp; 
&lt;LI&gt;The client side argument to pass to the javscript callback function.&amp;nbsp; This is actually placed in the javascript code as you enter it without the quotes.&amp;nbsp; Therefore, you must create this argument on the javascript side.&amp;nbsp; This argument is then passed back to the server side method that handles the callback. 
&lt;LI&gt;The javascript function that will be called at the END of the request. 
&lt;LI&gt;An argument that will be evaluated client side before calling the method. 
&lt;LI&gt;Whether to perform this request asynchronously. &lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;
&lt;P&gt;Next we are going to actually implement the ICallbackEventHandler methods.&amp;nbsp; Our two javascript methods are named OutgoingMethod_ServerTime and OutgoingMethod_IpAddressQuery respectively.&amp;nbsp; So will implement the functionality to return the appropriate result.&lt;/P&gt;
&lt;P&gt;Inside the &lt;FONT color=#0000ff size=2&gt;#region&lt;/FONT&gt;&lt;FONT size=2&gt; ICallbackEventHandler Members region.&amp;nbsp; Lets modify our GetCallbackResult method to look like this:&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;1: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;2: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Data;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;3: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Configuration;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;4: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Collections;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;5: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;6: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.Security;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;7: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.UI;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;8: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.UI.WebControls;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;9: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.UI.WebControls.WebParts;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;10: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.Web.UI.HtmlControls;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;11: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;12: &lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;partial&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; _Default : System.Web.UI.Page,ICallbackEventHandler&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;13: &lt;/SPAN&gt;{&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;14: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; Page_Load(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, EventArgs e)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;15: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;16: &lt;/SPAN&gt;        &lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;17: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;18: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; ScriptCallBackEventReference&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;19: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;20: &lt;/SPAN&gt;        get&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;21: &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;22: &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; Page.ClientScript.GetCallbackEventReference(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"arg"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"IncomingCallbackMethod"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;23: &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;24: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;25: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;26: &lt;/SPAN&gt;    &lt;SPAN class=preproc&gt;#region&lt;/SPAN&gt; ICallbackEventHandler Members&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;27: &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;28: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; ret = &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.Empty;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;29: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; GetCallbackResult()&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;30: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;31: &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; ret;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;32: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;Simply put, we are creating a variable in which we store our result, and inside GetCallbackResult, we return it.&amp;nbsp; The next step is to actually populate the variable with something interesting.&amp;nbsp; This happens in RaiseCallbackEvent.&amp;nbsp;&amp;nbsp; Lets add our functionality to RaiseCallbackEvent.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;34: &lt;/SPAN&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; RaiseCallbackEvent(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; eventArgument)&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;35: &lt;/SPAN&gt;    {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;36: &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;switch&lt;/SPAN&gt; (eventArgument.ToLower())&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;37: &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;38: &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; &lt;SPAN class=str&gt;"time"&lt;/SPAN&gt; :&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;39: &lt;/SPAN&gt;                ret = DateTime.Now.ToString();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;40: &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;41: &lt;/SPAN&gt;            &lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; &lt;SPAN class=str&gt;"ipaddress"&lt;/SPAN&gt; :&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;42: &lt;/SPAN&gt;                ret = Request.ServerVariables[&lt;SPAN class=str&gt;"REMOTE_ADDR"&lt;/SPAN&gt;];&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;43: &lt;/SPAN&gt;                &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;44: &lt;/SPAN&gt;        }&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;45: &lt;/SPAN&gt;    }&lt;/PRE&gt;&lt;/DIV&gt;&amp;nbsp;We the variable that we are returning from GetCallbackResult with the appropriate data, and .NET Takes care of the rest.&lt;img src="http://advenet.com/aggbug.aspx?PostID=14" width="1" height="1"&gt;</content><author><name>sethwebster</name><uri>http://advenet.com/sethwebster/Default.aspx</uri></author></entry></feed>