<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/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>Jake Opines : ASP.NET</title><link>http://www.atalasoft.com/cs/blogs/jake/archive/tags/ASP.NET/default.aspx</link><description>Tags: ASP.NET</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>SharePoint Saturday: Developing and Packaging a Third Party SharePoint Solution</title><link>http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx</link><pubDate>Mon, 12 Jan 2009 15:34:44 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:17156</guid><dc:creator>jacobl</dc:creator><slash:comments>3</slash:comments><comments>http://www.atalasoft.com/cs/blogs/jake/comments/17156.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/jake/commentrss.aspx?PostID=17156</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/jake/WindowsLiveWriter/SharePointSaturdayDevelopingandPackaging_6ED0/SharePointSat2VA-emaillarge_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px 0px 10px 10px;border-left:0px;border-bottom:0px;" height="109" alt="SharePointSat2VA-emaillarge" src="http://www.atalasoft.com/cs/blogs/jake/WindowsLiveWriter/SharePointSaturdayDevelopingandPackaging_6ED0/SharePointSat2VA-emaillarge_thumb.png" width="260" align="right" border="0" /&gt;&lt;/a&gt; Here are some notes from my presentation at &lt;a href="http://www.sharepointsaturday.org/Pages/Default.aspx" target="_blank"&gt;SharePoint Saturday&lt;/a&gt; this past weekend in Virginia Beach, VA. Included are my slides, code that I demo'd, and hopefully answers to all of the questions that people asked.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Slides&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Download &lt;a href="http://www.atalasoft.com/cs/files/folders/17150/download.aspx" target="_blank"&gt;my slides in PDF form&lt;/a&gt; for quick reference.&lt;/p&gt;  &lt;p&gt;Download &lt;a href="http://www.atalasoft.com/cs/files/folders/17147/download.aspx" target="_blank"&gt;my slides as a QuickTime movie&lt;/a&gt; to view the presentation with all animations. Unfortunately, to keep the file size low, I had to sacrifice a lot of quality. I suggest you download both the PDF and movie to get the full effect.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Code&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The Feature that we worked on uses a toolkit called DotImage. If you're interested in using the feature for testing, feel free to &lt;a href="http://www.atalasoft.com/download/downloadDotImage.aspx" target="_blank"&gt;get an evaluation license&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Download &lt;a href="http://www.atalasoft.com/cs/files/folders/17152/download.aspx" target="_blank"&gt;the source code&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Download &lt;a href="http://www.atalasoft.com/cs/files/folders/17153/download.aspx" target="_blank"&gt;the WSP file&lt;/a&gt; (you will need to get an evaluation license for DotImage)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SPWebConfigModification&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Here are links to Dave Terrell's 6 part series on using the SPWebConfigModification object to edit the web config of a given Web Application in SharePoint.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/10/08/using-spwebconfigmodification-part-1.aspx" target="_blank"&gt;The Problem&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/10/08/using-spwebconfigmodification-part-2.aspx" target="_blank"&gt;Take this for example...&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/10/08/using-spwebconfigmodification-part-3.aspx" target="_blank"&gt;Time for some code&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/10/08/using-spwebconfigmodification-part-4.aspx" target="_blank"&gt;Why doesn't this work?&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/10/08/using-spwebconfigmodification-part-5.aspx" target="_blank"&gt;The Remedy&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/10/08/using-spwebconfigmodification-part-6.aspx" target="_blank"&gt;Putting it to work&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;WSPBuilder&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Check out &lt;a href="http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/wspbuilder-generate-sharepoint-solution-files.aspx" target="_blank"&gt;my short blog post on WSPBuilder&lt;/a&gt; with instructions on how to use it in a NAnt build script.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SharePoint Solution Installer&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I will post a more extensive article with instructions on how to use this product and some ideas on how it might be improved, but for now, you can find the &lt;a href="http://www.codeplex.com/sharepointinstaller" target="_blank"&gt;SharePoint Solution installer on CodePlex&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;AllowUnsafeUpdates&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Check out &lt;a href="http://hristopavlov.wordpress.com/2008/05/16/what-you-need-to-know-about-allowunsafeupdates/" target="_blank"&gt;Hristo Pavlov's blog on AllowUnsafeUpdates here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;My Presentation Setup&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/jake/WindowsLiveWriter/SharePointSaturdayDevelopingandPackaging_6ED0/Picture%201_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px 10px 10px 0px;border-left:0px;border-bottom:0px;" height="170" alt="Picture 1" src="http://www.atalasoft.com/cs/blogs/jake/WindowsLiveWriter/SharePointSaturdayDevelopingandPackaging_6ED0/Picture%201_thumb.png" width="260" align="left" border="0" /&gt;&lt;/a&gt;&lt;/u&gt;Here's a little more detail on the setup I used in my presentation: the computers I was using, which ones were VMs, how I switched between them and my slides, what presentation software I used, and how I tied it all together.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;SharePoint Box&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Since SharePoint is a bit of a beast, I decided to run it on an external machine. It was running on a Sony Viao with Vista. WSS 3.0 was installed directly on Vista. I will post on that in a week or so explaining how that's possible with steps on getting it done yourself.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Visual Studio Machine&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;I prefer to run Visual Studio on a different machine that I run SharePoint. The primary reason for this is so that I can quickly revert the VM that's running SharePoint in my development cycle without worrying about losing work.&lt;/p&gt;  &lt;p&gt;For my presentation, I ran Visual Studio on a virtual machine in &lt;a href="http://www.vmware.com/products/fusion/" target="_blank"&gt;VMWare Fusion for Mac&lt;/a&gt; running Windows XP Pro.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Tying them Together&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Since there was no guarantee of wireless offered at the &lt;a href="http://www.vbatc.com/" target="_blank"&gt;Advanced Technology Center&lt;/a&gt;, I made sure I was all set by hosting a wireless network from my Mac and connecting to it from the Vista laptop. From there, I was able to remote in and get to SharePoint.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Presentation Software&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;I enjoy using Apple's &lt;a href="http://www.apple.com/iwork/keynote/" target="_blank"&gt;Keynote&lt;/a&gt; software. It lets me make very attractive slides and is very easy to use. Plus, it exports to many formats that anyone can read without losing anything like transitions or animations.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Switching between Everything&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;To switch between my slides and my 2 demo machines, I used a built-in Mac feature called &lt;a href="http://www.apple.com/macosx/features/spaces.html" target="_blank"&gt;Spaces&lt;/a&gt;. It's a beautiful implementation of multiple-desktops.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/jake/WindowsLiveWriter/SharePointSaturdayDevelopingandPackaging_6ED0/Picture%202_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="286" alt="Picture 2" src="http://www.atalasoft.com/cs/blogs/jake/WindowsLiveWriter/SharePointSaturdayDevelopingandPackaging_6ED0/Picture%202_thumb.png" width="446" border="0" /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx&amp;amp;;subject=SharePoint+Saturday%3a+Developing+and+Packaging+a+Third+Party+SharePoint+Solution" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx&amp;amp;;title=SharePoint+Saturday%3a+Developing+and+Packaging+a+Third+Party+SharePoint+Solution" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx&amp;amp;title=SharePoint+Saturday%3a+Developing+and+Packaging+a+Third+Party+SharePoint+Solution" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx&amp;amp;;title=SharePoint+Saturday%3a+Developing+and+Packaging+a+Third+Party+SharePoint+Solution" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx&amp;amp;;title=SharePoint+Saturday%3a+Developing+and+Packaging+a+Third+Party+SharePoint+Solution&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/12/sharepoint-saturday-developing-and-packaging-a-third-party-sharepoint-solution.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=17156" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Conferences/default.aspx">Conferences</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Deployment/default.aspx">Deployment</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Presentations/default.aspx">Presentations</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Feature/default.aspx">Feature</category></item><item><title>KeepAlive for the DotImage WebThumbnailViewer</title><link>http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx</link><pubDate>Fri, 09 Jan 2009 13:20:27 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:17073</guid><dc:creator>jacobl</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/jake/comments/17073.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/jake/commentrss.aspx?PostID=17073</wfw:commentRss><description>&lt;p&gt;This is my third post on the topic of using a simple Java&lt;b&gt;&lt;/b&gt;Script call to keep a server session alive. My first post was on &lt;a href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/19/creating-a-simple-ajax-keepalive.aspx" target="_blank"&gt;keeping a generic IIS session alive by reloading a hidden GIF&lt;/a&gt;, my second was related directly to &lt;a href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx" target="_blank"&gt;keeping session state alive for the WebImageViewer&lt;/a&gt;, and this post will address the WebThumbnailViewer.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Using the WebThumbnailViewer with the WebImageViewer&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If you're interested in keeping a session alive for a page that contains both a WebImageViewer and a WebThumbnailViewer working in tandem, you only need to keep the session for the WebImageViewer alive since they share the same stamp file in the AtalaCache. However, if you are using just the WebThumbnailViewer, this blog is for you.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Server Side&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Luckily, you need not make any change to your code-behind. There is something very simple that we can call in DotImage on the client-side that will do the job for us.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Client Side&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is super simple. WebThumbnailViewer has an UpdateThumb call that does a round trip to the server, requests a thumb, and serves it. This causes the state keepalive that we are looking for.&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, 'Courier New', 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, 'Courier New', 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, 'Courier New', 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;var&lt;/span&gt; keepAliveIframe = &lt;span style="color:#0000ff;"&gt;null&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, 'Courier New', 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;function&lt;/span&gt; KeepAlive(){&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, 'Courier New', 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;     WebThumbnailViewer1.UpdateThumb(0);&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, 'Courier New', 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, 'Courier New', 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; setInterval(&lt;span style="color:#006080;"&gt;'KeepAlive();'&lt;/span&gt;, &lt;span style="color:#006080;"&gt;'900000'&lt;/span&gt;);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;That's it. Just add that function to your page and you'll be all set. Don't forget to update the setInterval duration to something that makes sense for your deployments. 900,000 milliseconds is 15 minutes so that should work in most cases.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx&amp;amp;;subject=KeepAlive+for+the+DotImage+WebThumbnailViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx&amp;amp;;title=KeepAlive+for+the+DotImage+WebThumbnailViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx&amp;amp;title=KeepAlive+for+the+DotImage+WebThumbnailViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx&amp;amp;;title=KeepAlive+for+the+DotImage+WebThumbnailViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx&amp;amp;;title=KeepAlive+for+the+DotImage+WebThumbnailViewer&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2009/01/09/keepalive-for-the-dotimage-webthumbnailviewer.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=17073" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Keep+Alive/default.aspx">Keep Alive</category></item><item><title>KeepAlive for the DotImage WebImageViewer</title><link>http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx</link><pubDate>Wed, 31 Dec 2008 13:22:17 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:17037</guid><dc:creator>jacobl</dc:creator><slash:comments>1</slash:comments><comments>http://www.atalasoft.com/cs/blogs/jake/comments/17037.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/jake/commentrss.aspx?PostID=17037</wfw:commentRss><description>&lt;p&gt;Recently, I posted an article describing &lt;a href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/19/creating-a-simple-ajax-keepalive.aspx" target="_blank"&gt;a simple way to keep a session alive&lt;/a&gt; during long periods of inactivity. That works great if your web application doesn't rely on some other information on the server to maintain state. If you use &lt;a href="http://www.atalasoft.com/products/dotimage/" target="_blank"&gt;DotImage&lt;/a&gt; in your web app, it maintains certain state information in the AtalaCache that needs to be updated every so often. If not, you run the risk of another user hitting the page and causing the AtalaCache to be cleaned up (assuming the cache has expired). This post explains how to avoid this by forcing the &lt;a href="http://www.atalasoft.com/products/dotimage/thinclient/default.aspx" target="_blank"&gt;WebImageViewer&lt;/a&gt; to update its timestamps on your state.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Server Side&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In your page's code behind, add the following RemoteInvokable function:&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, 'Courier New', 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, 'Courier New', 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, 'Courier New', 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; [RemoteInvokable]&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, 'Courier New', 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;void&lt;/span&gt; Remote_KeepSessionAlive()&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, 'Courier New', 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, 'Courier New', 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;span style="color:#008000;"&gt;// Don't need to do anything here.&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, 'Courier New', 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:#008000;"&gt;// A simple page request will force the&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, 'Courier New', 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:#008000;"&gt;// WebImageViewer to update any timestamps &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, 'Courier New', 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:#008000;"&gt;// it needs for this session.&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, 'Courier New', 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;strong&gt;Client Side&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In your aspx page, add the following Java&lt;b&gt;&lt;/b&gt;Script:&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, 'Courier New', 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, 'Courier New', 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, 'Courier New', 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; function KeepAlive(){&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, 'Courier New', 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;     WebImageViewer1.RemoteInvoke(&lt;span style="color:#006080;"&gt;'Remote_KeepSessionAlive'&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, 'Courier New', 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, 'Courier New', 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; setInterval(&lt;span style="color:#006080;"&gt;'KeepAlive();'&lt;/span&gt;, &lt;span style="color:#006080;"&gt;'900000'&lt;/span&gt;);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;We don't need to pass anything into the RemoteInvoke and we don't need to set an event handler for the return since it doesn't matter to us. Very simple.&lt;/p&gt;

&lt;p&gt;This RemoteInvoke-based keepalive for the DotImage WebImageViewer will fire every 15 minutes (or 900,000 milliseconds == half of my session lifetime). Make sure you adjust that duration according to your server's session. Be sure to set it to something less than your session timeout or you might miss it.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx&amp;amp;;subject=KeepAlive+for+the+DotImage+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx&amp;amp;;title=KeepAlive+for+the+DotImage+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx&amp;amp;title=KeepAlive+for+the+DotImage+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx&amp;amp;;title=KeepAlive+for+the+DotImage+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx&amp;amp;;title=KeepAlive+for+the+DotImage+WebImageViewer&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/12/31/keepalive-for-the-dotimage-webimageviewer.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=17037" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/WebImageViewer/default.aspx">WebImageViewer</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Session/default.aspx">Session</category></item><item><title>A Note Regarding YUI and the WebImageViewer</title><link>http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx</link><pubDate>Mon, 21 Jul 2008 12:50:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14233</guid><dc:creator>jacobl</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/jake/comments/14233.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/jake/commentrss.aspx?PostID=14233</wfw:commentRss><description>&lt;p&gt;When developing two of my applications for 31 Apps in 31 Days (&lt;a href="http://thindoc.atalasoft.com/" title="ThinDoc" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://www.atalasoft.com/31apps/clickword/" title="ClickWord" target="_blank"&gt;here&lt;/a&gt;), I discovered an issue with using YUI with our WebImageViewer. The script tag that references the YUI js files must be inside the main form element. If it is not, the DOM of the WebImageViewer gets distroyed and multiple painful errors ensue.&lt;/p&gt;&lt;p&gt;&amp;lt;html&amp;gt;&lt;br&gt;...&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;...&lt;br&gt;&amp;lt;form ...&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;..WebImageViewer .. /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;lt;script type="text/javascript" language="javascript" href="yui-script.js" /&amp;gt;&lt;br&gt;&amp;lt;script type="text/javascript" language="javascript" href="other-yui-script.js" /&amp;gt;&lt;br&gt;&amp;lt;script type="text/javascript" language="javascript"&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;// Your JavaScript Goes Here ...&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/script&amp;gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/form&amp;gt; &lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;&amp;lt;/body&amp;gt; &lt;br&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;&lt;p&gt;This may also be the case with other third party javascript libraries. I have experienced receiving a similar error when using ExtJS, but didn't try this fix at the time. &lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx&amp;amp;;subject=A+Note+Regarding+YUI+and+the+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx&amp;amp;;title=A+Note+Regarding+YUI+and+the+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx&amp;amp;title=A+Note+Regarding+YUI+and+the+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx&amp;amp;;title=A+Note+Regarding+YUI+and+the+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx&amp;amp;;title=A+Note+Regarding+YUI+and+the+WebImageViewer&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/07/21/using-yui-with-the-webimageviewer.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14233" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/UI/default.aspx">UI</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/WebImageViewer/default.aspx">WebImageViewer</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/YUI/default.aspx">YUI</category></item><item><title>Queuing up Your Remote Invokes</title><link>http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx</link><pubDate>Tue, 24 Jun 2008 17:40:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14511</guid><dc:creator>jacobl</dc:creator><slash:comments>3</slash:comments><comments>http://www.atalasoft.com/cs/blogs/jake/comments/14511.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/jake/commentrss.aspx?PostID=14511</wfw:commentRss><description>&lt;p&gt;The &lt;a target="_blank" href="http://www.atalasoft.com/products/dotimage/thinclient/"&gt;WebImageViewer&lt;/a&gt; is a very powerful web control that we offer to our customers. It does a lot of work for you behind the scenes to make the experience as application-like as possible. It even takes that a step further with the RemoteInvoke method and RemoteInvoked event by providing customers with the ability to make server-side function calls in an AJAXy way while not requiring that they know anything about how it works behind the scenes.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Wait Your Turn!&lt;/b&gt;&lt;/p&gt;&lt;p&gt;RemoteInvoking with the WebImageViewer makes an assumption that much of AJAX-based web techniques make: you must serialize your requests or they will step on each other. (Serialize in the sense that they are not parallel... not turn into a bytified version of an object). This can be a little annoying if you don't know what you are doing or if your user works faster than you expected. You must make the appropriate accommodations such as locking up the UI while background processing is happening.&lt;/p&gt;&lt;p&gt;&lt;b&gt;The Other Approach&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Locking up the UI might not seem like the best option. You might want to allow your users to send multiple requests to the server and just have them be processed at will. This is where this little piece of code comes in. It wraps the WebImageViewer's RemoteInvoke system in a queuing service. You simply create a new Remoter JavaScript object by passing in the WebImageViewer object and you're off to the races. You'll have to make a few minor modifications to your RemoteInvoke calls and RemoteInvoked event handler assignments, but it's all well worth it.&lt;/p&gt;&lt;p&gt;Here's what it looks like to make a RemoteInvoke call with the WebImageViewer:&lt;/p&gt;&lt;p&gt;WebImageViewer1.RemoteInvoked = OnRemoteInvoked;&lt;br&gt;WebImageViewer1.RemoteInvoke("RemoteMethod", new Array("array", "of", "args"));&lt;/p&gt;&lt;p&gt;function OnRemoteInvoked()&lt;br&gt;{&lt;br&gt;WebImageViewer1.RemoteInvoked = function() {};&lt;br&gt;// any post-request processing goes here&lt;br&gt;}&lt;/p&gt;&lt;p&gt;Here's what it looks like when using the Remoter class:&lt;/p&gt;&lt;p&gt;var remoter = new Remoter("WebImageViewer1");&lt;br&gt;remoter.RemoteInvoke("RemoteMethod", new Array("array", "of", "args"), OnRemoteInvoked);&lt;br&gt;&lt;br&gt;function OnRemoteInvoked()&lt;br&gt;{&lt;br&gt;// any post-request processing goes here&lt;br&gt;}&lt;/p&gt;&lt;p&gt;&lt;b&gt;What's for free?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;You get something out of this for free that you might not expect. In addition to having all of your remote requests queued up so that they automatically don't stomp on each other, you also get the benefit of not having to reset your RemoteInvoked event handler. You're forced to set the RemoteInvoked function each time, and it is always set to an empty function if you don't.&lt;/p&gt;&lt;p&gt;With this handy little utility, you can do stuff like this:&lt;/p&gt;&lt;p&gt;var remoter = new Remoter(WebImageViewer1);&lt;/p&gt;&lt;p&gt;remoter.RemoteInvoke("RemoteMethod1", new Array(), OnRemoteInvoked1);&lt;/p&gt;&lt;p&gt;remoter.RemoteInvoke("RemoteMethod2", new Array(), OnRemoteInvoked2);&lt;/p&gt;&lt;p&gt;remoter.RemoteInvoke("RemoteMethod3", new Array(), OnRemoteInvoked3);&lt;/p&gt;&lt;p&gt;As each request is sent to the server and a response is received back, the next request will fire.&lt;/p&gt;&lt;p&gt;client ----&gt; RemoteMethod1 -----&gt; server&lt;br&gt; client &amp;lt;---- OnRemoteInvoked1 &amp;lt;----server&lt;/p&gt;&lt;p&gt;client ----&gt; RemoteMethod2 -----&gt; server&lt;br&gt;client &amp;lt;---- OnRemoteInvoked2 &amp;lt;----server&lt;/p&gt;&lt;p&gt;client ----&gt; RemoteMethod3 -----&gt; server&lt;br&gt;client &amp;lt;---- OnRemoteInvoked3 &amp;lt;----server &lt;/p&gt;&lt;p&gt;&lt;b&gt;How do I use it?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;After you download it using the link below, include it in your project. Add the following script tag to include it in your aspx page.&lt;/p&gt;&lt;p&gt;&amp;lt;script type="text/javascript" language="javascript" src="path/to/Remoter.js"&gt;&amp;lt;/script&gt;&lt;/p&gt;&lt;p&gt;That line must go in the same &amp;lt;form&gt; that your WebImageViewer or WebAnnotationViewer is in. Next, you need to add the following line to the function that is called once the WebImageViewer is done loading.&lt;/p&gt;&lt;p&gt;var remoter = new Remoter(WebImageViewer1);&lt;/p&gt;&lt;p&gt;Replace WebImageViewer1 with the id of your WebImageViewer or WebAnnotationViewer. To make sure that this function is called at the right moment, call it with atalaInitClientScript(); like so:&lt;/p&gt;&lt;p&gt;&amp;lt;script type="text/javascript" language="javascript"&gt;&lt;/p&gt;&lt;p&gt; atalaInitClientScript("OnPageLoad();");&lt;/p&gt;&lt;p&gt;function OnPageLoad()&lt;br&gt;{&lt;/p&gt;&lt;p&gt; var remoter =new Remoter(WebImageViewer1);&lt;br&gt;// other code that you want to call after the WebImageViewer is initialized.&lt;br&gt;&lt;/p&gt;&lt;p&gt;} &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/script&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Where do I get it?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Remoter is not part of DotImage, but can be &lt;a href="http://www.atalasoft.com/cs/files/folders/14517/download.aspx"&gt;downloaded here&lt;/a&gt; and used for free. &lt;/p&gt;&lt;p&gt;If you happen to be a PHP developer, check out &lt;a target="_blank" href="http://www.jacoblauzier.com/blog/2008/05/event-based-ajax-framework-for-php/"&gt;my personal blog&lt;/a&gt; for information about Remoter's adaptation to PHP. &lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx&amp;amp;;subject=Queuing+up+Your+Remote+Invokes" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx&amp;amp;;title=Queuing+up+Your+Remote+Invokes" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx&amp;amp;title=Queuing+up+Your+Remote+Invokes" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx&amp;amp;;title=Queuing+up+Your+Remote+Invokes" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx&amp;amp;;title=Queuing+up+Your+Remote+Invokes&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/06/24/queuing-up-your-remote-invokes.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14511" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/WebImageViewer/default.aspx">WebImageViewer</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/JavaScript/default.aspx">JavaScript</category></item><item><title>Full-Screening your WebImageViewer</title><link>http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx</link><pubDate>Tue, 27 May 2008 17:20:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14145</guid><dc:creator>jacobl</dc:creator><slash:comments>1</slash:comments><comments>http://www.atalasoft.com/cs/blogs/jake/comments/14145.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/jake/commentrss.aspx?PostID=14145</wfw:commentRss><description>&lt;p&gt;Last week, I posted 2 web apps (&lt;a href="http://www.atalasoft.com/cs/blogs/31appsin31days/archive/2008/05/22/clickword-online-ocr-by-click.aspx" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://www.atalasoft.com/cs/blogs/31appsin31days/archive/2008/05/23/thindoc-zero-footprint-full-screen-pdf-viewer.aspx" target="_blank"&gt;here&lt;/a&gt;) as part of our &lt;a href="http://www.atalasoft.com/cs/blogs/31appsin31days/default.aspx" target="_blank"&gt;31 Apps in 31 Days promotion&lt;/a&gt;. They both have one thing in common (outside of the fact that they're online): being full screen WebImageViewers. There are a few hoops that you need to hop through to make it happen, and this article will walk you through it.&lt;/p&gt;

&lt;blockquote&gt;&lt;img src="http://www.atalasoft.com/cs/photos/jacobs_blog_photos/images/14118/original.aspx" align="right" height="205" hspace="10" width="250"&gt;1. Create a new Web Site project with nothing on the Default.aspx page except for the Atalasoft WebImageViewer.&lt;br&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;2. Set the Width and Height properties in the image viewer to 100%.&lt;/blockquote&gt;

&lt;blockquote&gt;3. Height is a funny beast. It needs to be set in every tag going up the tree to (AND INCLUDING) &amp;lt;html&amp;gt;. To set the height of each of these properties, add the following attribute to each of those elements up the tree:&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;code&gt;style="height:100%; width:100%"&lt;/code&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;4. In your body tag, we need to make all the browsers not show the main windows scroll bars so that we only see the scroll bars of the WebImageViewer. To do that, add this attribute to the &amp;lt;body&amp;gt; tag:&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;code&gt;style="overflow:hidden;"&lt;/code&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;This basically means that if the browser detects any content that stretches beyond the height of the page, it will just not show it. In our case, this is perfect because anything the browser thinks is there is probably just an off-by-one-pixel issue...&lt;/blockquote&gt;

&lt;blockquote&gt;5. Lastly, we need to fix a little issue with IE. Internet Explorer doesn't get rid of the vertical scroll-bar after simply adding the style in step 4. It just grays it out. That's not good enough. Add this last attribute to the &amp;lt;body&amp;gt; tag:&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;code&gt;scroll="no"&lt;/code&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Visual Studio will say it's not a valid property (the same would have happened when you added the style to your &amp;lt;html&amp;gt; tag, but that's ok.&lt;/blockquote&gt;&lt;p&gt;That's it! Now, the tricky part is figuring out how to build your interface on top of the image viewer instead of around it. In &lt;a href="http://www.atalasoft.com/31apps/thindoc/" target="_blank"&gt;ThinDoc&lt;/a&gt;, the elements are absolutely positioned to the right (for the controls) and on the bottom-center (for the thumbnails). They appear whenever the mouse moves, but won't go away when the user is hovering over either of those controls.&lt;/p&gt;&lt;p&gt;For a sample of this in action, go to &lt;a href="http://www.atalasoft.com/cs/blogs/31appsin31days/archive/2008/05/23/thindoc-zero-footprint-full-screen-pdf-viewer.aspx" target="_blank"&gt;my post about ThinDoc&lt;/a&gt; and download the source.&lt;br&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx&amp;amp;;subject=Full-Screening+your+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx&amp;amp;;title=Full-Screening+your+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx&amp;amp;title=Full-Screening+your+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx&amp;amp;;title=Full-Screening+your+WebImageViewer" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx&amp;amp;;title=Full-Screening+your+WebImageViewer&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/27/full-screening-your-dotimage-webimageviewer.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14145" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/WebImageViewer/default.aspx">WebImageViewer</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Full-Screen/default.aspx">Full-Screen</category></item><item><title>&quot;Bad, IIS. Bad!&quot; - Forcing IIS to run your site in .NET 2.0</title><link>http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx</link><pubDate>Thu, 03 Apr 2008 14:43:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:13596</guid><dc:creator>jacobl</dc:creator><slash:comments>1</slash:comments><comments>http://www.atalasoft.com/cs/blogs/jake/comments/13596.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/jake/commentrss.aspx?PostID=13596</wfw:commentRss><description>&lt;span class="Apple-style-span" style="border-collapse:separate;font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"&gt;&lt;div style="padding:8px;font-family:Arial,Helvetica,sans-serif;font-size:10pt;"&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="border-collapse:separate;font-family:'Times New Roman';font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;"&gt;&lt;img src="http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.jpg" align="right" height="381" hspace="10" width="350"&gt;&lt;/span&gt;I was working in IIS, today, and came across an issue where it was attempting to load my site in ASP.NET 1.1.xxx. I, for one, know that the site I was deploying was built as a precompiled web from VS2005, which, as far as I know, means that it's .NET 2.0 for sure. I also knew that all of the assemblies I was referencing were .NET 2.0 and the web config had all the appropriate .NET 2.0 love.&lt;/p&gt;&lt;p&gt;The first thing I did was search around IIS to see if there was a way to beat it into submission and force it to run the site in ASP.NET 2.0. No luck... I believe the newer versions of IIS have this functionality, because I swear I've used it before, but I wanted to deploy now!&lt;/p&gt;&lt;p&gt;After a bit of searching, I came across this great little utility called &lt;a href="http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx" target="_blank"&gt;ASP.NET Version Switcher&lt;/a&gt; that saved me a boatload of time by Denis Bauer.&lt;span class="Apple-style-span" style="font-family:'Lucida Grande';font-size:12px;white-space:pre;"&gt;&lt;/span&gt; It shows all of the sites in IIS and easily lets you switch the .NET Framework version for any one. Granted, it just runs the command line utility that I'm sure is easy enough to figure out, but GUIs are nice too.&lt;br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;subject=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;title=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;title=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;title=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx&amp;amp;;title=%26quot%3bBad%2c+IIS.+Bad!%26quot%3b+-+Forcing+IIS+to+run+your+site+in+.NET+2.0&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/jake/archive/2008/04/03/bad-iis-bad-forcing-iis-to-run-your-site-in-net-2-0.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13596" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/IIS/default.aspx">IIS</category><category domain="http://www.atalasoft.com/cs/blogs/jake/archive/tags/Deployment/default.aspx">Deployment</category></item></channel></rss>