<?xml-stylesheet type="text/xsl" href="/rss.xsl" media="screen"?><rss version="2.0"><channel><title>softlogger Latest Articles ::DotNetNuke</title><link>http://softlogger.com</link><description>softlogger Latest Articles ::DotNetNuke</description><ttl>180</ttl><item><title>4.3 and 3.3 - Upgrade asap - Vulnerability in DotNetNuke could allow access to user profile details</title><link>http://softlogger.com/16535/DotNetNuke/4-3-and-3-3--upgrade-asap--vulnerability-in-do-netnuke-could-allow-access-to-user-profile-details.aspx</link><description>&lt;span align="left" id="dnn_ctr3275_ContentPane"&gt;I found this info on the DotNetNuke site, it recommends that you upgrade to the latest point release for 3.3 and 4.3 as a severe  security issue has been found - details below&lt;br /&gt;&lt;br /&gt;http://dotnetnuke.com/SecurityPolicy/SecurityBulletins/tabid/976/Default.aspx&lt;span class="Normal" id="dnn_ctr3275_HtmlModule__ctl0_lblContent"&gt; &lt;p&gt;&lt;strong&gt;Published: August 02, 2006&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Version: 1.0&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Maximum Severity Rating: Critical&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;For the 3.3.3/4.3.3 releases of DotNetNuke, the membership/roles/provider components were significantly overhauled to allow better granularity of control, and to allow us to make a number of enhancements. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Issue Summary&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;During the process of rewriting the code to extend the Profile component, an authorization issue was introduced that could allow a user (including anonymous users) to access another users profile.&lt;br /&gt;Due to the seriousness of this issue, further details are not available, users of 3.3.3/4.3.3 are recommended to upgrade to 3.3.4/4.3.4.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Mitigating factors&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;N/A&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Affected DotNetNuke versions&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;3.3.0, 3.3.1, 3.3.2, 3.3.3, 4.3.0, 4.3.1, 4.3.2 ,4.3.3&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Non-Affected Versions:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;All other versions&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Fix(s) for issue&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;To fix this problem, you are recommended to update to the latest version of DotNetNuke (3.3.4/4.3.4 at time of writing)&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;* * * * * * * * * *&lt;br /&gt;&lt;a href="http://www.dnncreative.com/"&gt;DNN Creative Magazine&lt;/a&gt; provides &lt;a href="http://www.dnncreative.com/"&gt;DotNetNuke&lt;/a&gt; tutorials, articles, reviews all for the DotNetNuke web designer. An issue is released each month. Stats: 145 Videos &amp; 5 MP3 Interviews&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.skinningtoolkit.com/"&gt;DotNetNuke Skinning Toolkit&lt;/a&gt; demonstrates all of the skin classes to help you quickly and easily create DotNetNuke skins.&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: right;"&gt;&lt;a href="http://technorati.com/tag/dotnetnuke" rel="tag"&gt;dotnetnuke&lt;/a&gt;&lt;/div&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=16535"&gt;</description><author>DotNetNuke tutorials, tips &amp;amp; tricks</author><pubDate>2008-01-05T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>DotNetNuke Deployment and Synchronization, Admin Menu Access and Free CSS Skin</title><link>http://softlogger.com/12731/DotNetNuke/do-netnuke-deployment-and-synchronization-admin-menu-access-and-free-css-skin.aspx</link><description>In issue 26 of DNN Creative Magazine we explore the development and deployment of a DotNetNuke website, how to synchronise a local installation with a live installation.&lt;br /&gt;&lt;br /&gt;This allows you to update the content on the live or local installation and keep both versions in sync without taking the live site offline.&lt;br /&gt;&lt;br /&gt;We also demonstrate how to set access to the admin menu so that users can access elements of the menu without the need for full administration privileges.&lt;br /&gt;&lt;br /&gt;To finish, we have also included a new pure CSS XHTML skin.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/DNNTutorialsforAdministrators/SynchronizeLocalandLiveInstallations/tabid/375/Default.aspx"&gt;How to synchronize local and live DotNetNuke installations&lt;/a&gt;&lt;br /&gt;(Deployment using Red Gate Data Compare software)&lt;br /&gt;(4 videos – 33mins)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/DNNTutorialsforAdministrators/Howtolimitaccesstotheadminmenu/tabid/376/Default.aspx"&gt;How to limit access to the admin menu&lt;/a&gt;&lt;br /&gt;(Video  - 11min)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/SkinningTutorials/InternetSharing/tabid/373/Default.aspx"&gt; Free CSS Skin – Internet Sharing&lt;/a&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=12731"&gt;</description><author>DotNetNuke tutorials, tips &amp;amp; tricks</author><pubDate>2007-11-27T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>Issue 12 – CSS Horizontal Menus and Google Adsense</title><link>http://softlogger.com/11486/DotNetNuke/issue-12--css-horizontal-menus-and-google-adsense.aspx</link><description>&lt;a href="http://www.dnncreative.com/Home/Volume1/Issueno12/tabid/274/Default.aspx"&gt;August     Issue 12 Released &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;     I am pleased to announce that issue 12 of DNN Creative Magazine has been released.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;     In this Issue we build on the previous skinning tutorials from issues 5 to 11.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;     We create horizontal CSS menus and demonstrate step by step creating 3 different     horizontal CSS menus using the HouseMenu.&lt;/p&gt;We provide an introduction to Google Adsense as an easy way to monetize your DotNetNuke     websites. We demonstrate how you can use the CSS techniques developed over the previous     issues to easily incorporate Google Adsense into DotNetNuke websites. This covers     blending the ads with the text content of the page and easily placing the ads anywhere     you require within the page.&lt;br /&gt;&lt;p&gt;     &lt;strong&gt;This issue comes complete with 11 videos.&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;     &lt;strong&gt;Tutorials:&lt;/strong&gt;&lt;/p&gt;&lt;table cellpadding="10" cellspacing="5"&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td&gt;            CSS Menus&lt;br /&gt;       &lt;br /&gt;          &lt;img src="http://www.dnncreative.com/Portals/0/pics/issues/CSSMenus_sm.gif" alt="CSS Menus" height="139" width="250" /&gt;&lt;/td&gt;&lt;br /&gt;         &lt;td&gt;             &lt;a href="http://www.dnncreative.com/Tutorials/SkinningTutorials/HorizontalCSSHouseMenu/tabid/271/Default.aspx"&gt;                 How to create Horizontal CSS menus in DotNetNuke using the HouseMenu&lt;/a&gt;&lt;br /&gt;          (7 videos – 65mins)&lt;br /&gt;       &lt;br /&gt;          &lt;a href="http://www.dnncreative.net/free/video_intro/Issue12_How_to_create_a_horizontal_CSS_menu_video1.htm" target="_blank"&gt;                 Watch the introduction video&lt;/a&gt; (3.8MB)&lt;/td&gt;&lt;br /&gt;     &lt;/tr&gt;&lt;br /&gt;     &lt;tr&gt;&lt;br /&gt;         &lt;td&gt;             Google Adsense&lt;br /&gt;       &lt;br /&gt;          &lt;img src="http://www.dnncreative.com/Portals/0/pics/issues/Adsense_sm.gif" alt="Google Adsense" height="139" width="250" /&gt;&lt;/td&gt;&lt;br /&gt;         &lt;td&gt;             &lt;a href="http://www.dnncreative.com/Articles/Google/GoogleAdsense/tabid/273/Default.aspx"&gt;                 Introduction to Google Adsense, how to easily monetize your website&lt;/a&gt;          &lt;br /&gt;       &lt;br /&gt;          &lt;a href="http://www.dnncreative.com/tabid/272/Default.aspx"&gt;Incorporating Google Adsense                 into DotNetNuke Skins&lt;/a&gt;&lt;br /&gt;          (4 videos – 33mins)&lt;br /&gt;       &lt;br /&gt;          &lt;a href="http://www.dnncreative.net/free/video_intro/Issue12_How_to_add_adsense_to_DNN_video1.htm" target="_blank"&gt;                 Watch the introduction video&lt;/a&gt; (4.4MB)&lt;/td&gt;&lt;br /&gt;     &lt;/tr&gt;&lt;br /&gt; &lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;     &lt;strong&gt;Downloads:&lt;/strong&gt; To save you time, all of the videos for each issue are     available as a single zip download from each issue page.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;     Download the videos from here:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;     &lt;a href="http://www.dnncreative.com/Home/Volume1/Issueno12/tabid/274/Default.aspx"&gt;Issue         12 - CSS Horizontal Menus and Google Adsense&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Home/Volume1/Issueno11/tabid/270/Default.aspx"&gt;Issue         11 - An in-depth look at Headings and Styling      &lt;br /&gt;  &lt;/a&gt;&lt;a href="http://www.dnncreative.com/tabid/266/Default.aspx"&gt;Issue 10 - The DotNetNuke         Skinning Toolkit&lt;/a&gt;  &lt;br /&gt;  &lt;a href="http://www.dnncreative.com/tabid/260/Default.aspx"&gt;Issue 9 - Advanced Content         Styling Techniques and CSS&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Issueno8/tabid/254/Default.aspx"&gt;Issue 8 - CSS for         Styling and Layout in DotNetNuke&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Issueno7/tabid/239/Default.aspx"&gt;Issue 7 – Developing         and enhancing skins&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Issueno5and6/tabid/223/Default.aspx"&gt;Issues 5 &amp;         6 - Working with skins&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Issueno4/tabid/206/Default.aspx"&gt;Issue 4 – Installation         Essentials&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Issueno3/tabid/188/Default.aspx"&gt;Issue 3 - The Really         Simple Issue (RSS)&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Issueno2/tabid/152/Default.aspx"&gt;Issue 2 - A Picture         Is Worth A Thousand Words&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Issueno1/tabid/55/Default.aspx"&gt;Issue 1 - The World         At Your Fingertips&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;If you have any suggestions for the magazine, or requests, please do not hesitate     to contact me, &lt;strong&gt;this magazine is for you.&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;  &lt;br /&gt;  Many thanks,  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Lee Sykes  &lt;br /&gt;  DNN Creative Magazine  &lt;br /&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Home/Volume1/Issueno12/tabid/274/Default.aspx"&gt;&lt;strong&gt;         View Issue 12&lt;/strong&gt;&lt;br /&gt;  &lt;/a&gt;  &lt;br /&gt;  &lt;strong&gt;PS. &lt;/strong&gt;Play &lt;a href="http://www.dnncreative.com/Games/PacMan/tabid/115/Default.aspx"&gt;         PacMan&lt;/a&gt; to win a free subscription to DNN Creative Magazine or &lt;a href="http://www.dnncreative.com/Games/Tetris/tabid/118/Default.aspx"&gt;             Tetris&lt;/a&gt; to win the File Manager Pro module ($199) from Speerio.&lt;/p&gt;&lt;strong&gt;PPS.&lt;/strong&gt; View the RSS feeds page, keep up to date with the latest information,     or display our articles on your website using the &lt;a href="http://www.dnncreative.com/Home/RSSFeeds/tabid/194/Default.aspx"&gt;         DNN Creative Magazine RSS Feeds &lt;/a&gt;.&lt;br /&gt;&lt;p&gt;     &lt;strong&gt;Quick Links:&lt;/strong&gt;  &lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Home/FreeContent/tabid/101/Default.aspx"&gt;All Free         Content&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Home/DotNetNukeVideos/tabid/160/Default.aspx"&gt;All         Videos&lt;/a&gt;&lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Home/Interviews/tabid/245/Default.aspx"&gt;All Interviews&lt;/a&gt;  &lt;br /&gt;  &lt;a href="http://www.dnncreative.com/Articles/tabid/99/Default.aspx"&gt;All Articles&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;Stats: &lt;/strong&gt;There are now 145 videos on DNN Creative Magazine.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;* * * * * * * * * *&lt;br /&gt;&lt;a href="http://www.dnncreative.com/"&gt;DNN Creative Magazine&lt;/a&gt; provides &lt;a href="http://www.dnncreative.com/"&gt;DotNetNuke&lt;/a&gt; tutorials, articles, reviews all for the DotNetNuke web designer. An issue is released each month. Stats: 145 Videos &amp;amp; 5 MP3 Interviews&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.skinningtoolkit.com/"&gt;DotNetNuke Skinning Toolkit&lt;/a&gt; demonstrates all of the skin classes to help you quickly and easily create DotNetNuke skins.&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: right;"&gt;&lt;a href="http://technorati.com/tag/dotnetnuke" rel="tag"&gt;dotnetnuke&lt;/a&gt;&lt;/div&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=11486"&gt;</description><author>DotNetNuke tutorials, tips &amp;amp; tricks</author><pubDate>2007-11-20T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>Using WiX 3.0 to create a per-user MSI that does not prompt for elevation on Windows Vista</title><link>http://softlogger.com/11345/DotNetNuke/using-wix-3-0-to-create-a-per-user-msi-that-does-not-prompt-for-elevation-on-windows-vista.aspx</link><description>&lt;p&gt;A while back, I &lt;a href="http://blogs.msdn.com/astebner/archive/2006/12/13/some-useful-things-i-have-learned-about-windows-installer-and-uac.aspx"&gt;posted a summary of some information&lt;/a&gt; I learned about how Windows Installer interacts with UAC on Windows Vista.&amp;nbsp; Included in that blog post is a list of steps that must be taken to create a per-user MSI that will not cause a Windows Vista UAC elevation prompt when installing it.&lt;/p&gt; &lt;p&gt;Since then, I've gotten a few questions about exactly how to create an MSI that implements those guidelines.&amp;nbsp; As a result, I decided to create an example MSI to demonstrate these concepts, and also post the setup authoring for this example (created using a recent build of &lt;a href="http://wix.sourceforge.net/downloadv3.html"&gt;WiX 3.0&lt;/a&gt;).&amp;nbsp; Hopefully, this example will help translate the per-user MSI creation guidelines into real-world MSI concepts so that anyone who wants to create their own per-user MSIs will be able to do so relatively easily.&lt;/p&gt; &lt;p&gt;For this example, I chose to create a per-user installer for a &lt;a href="http://msdn2.microsoft.com/en-us/library/bb189002.aspx"&gt;Windows Media Center Presentation Layer Web application&lt;/a&gt; because this type of application does not require installing any per-machine resources (as long as you do not user the /allusers switch when calling &lt;a href="http://msdn2.microsoft.com/en-us/library/bb189728.aspx"&gt;RegisterMceApp&lt;/a&gt; as a custom action during setup to register the application with Media Center).&amp;nbsp; However, the general concepts demonstrated in this example will work for other types of per-user applications and not just per-user Media Center applications.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Where to download the example files&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;You can download the example MSI and setup authoring from the following locations:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Zip file containing all WiX 3.0 setup authoring files, a build batch file that can be used to compile and link the MSI, and a copy of the built MSI - &lt;a href="http://astebner.sts.winisp.net/Tools/example_per_user_msi.zip"&gt;http://astebner.sts.winisp.net/Tools/example_per_user_msi.zip&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Source WXS file for the example MSI - &lt;a href="http://astebner.sts.winisp.net/Tools/example_per_user_msi_setup.wxs"&gt;http://astebner.sts.winisp.net/Tools/example_per_user_msi_setup.wxs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;How to build the example MSI&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I included a copy of the built MSI in the sample zip file, but you may also want to modify the source and rebuild the MSI to experiment with some of the settings.&amp;nbsp; To build the MSI using the source files included in this example, you can use the following steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Download and install wix3.msi from the latest build of WiX 3.0 at &lt;a href="http://wix.sourceforge.net/releases"&gt;http://wix.sourceforge.net/releases&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Download and extract the contents of the example zip file from &lt;a href="http://astebner.sts.winisp.net/Tools/example_per_user_msi.zip"&gt;http://astebner.sts.winisp.net/Tools/example_per_user_msi.zip&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Make any desired changes to the sample setup authoring files&lt;/li&gt; &lt;li&gt;Run the file build.bat to compile and link the MSI using the Candle and Light tools included in WiX 3.0&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Details about how the example was implemented&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Rather than walk through the entire WXS file, I have included comments in the text of the WXS file to explain the purpose for each of the blocks of code in the file.&amp;nbsp; In addition, I want to specifically highlight a few key parts of the setup authoring that are needed in order to build an MSI that will not cause a UAC prompt to appear during installation on Windows Vista.&amp;nbsp; These highlighted items match the requirements for creating an MSI that will not prompt for elevation that are enumerated in &lt;a href="http://msdn2.microsoft.com/en-us/library/Aa368772.aspx"&gt;this MSDN topic&lt;/a&gt; and that I summarized in my &lt;a href="http://blogs.msdn.com/astebner/archive/2006/12/13/some-useful-things-i-have-learned-about-windows-installer-and-uac.aspx"&gt;previous blog post&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;1.&amp;nbsp; Ensure that no actions performed in your MSI require elevation&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;This means that all files and registry must be created in a per-user location and no custom actions can require administrator privileges.&amp;nbsp; In this example, the directory that the application files are installed to is located under the per-user application data folder.&amp;nbsp; This is defined in the following authoring:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;Directory Id="LocalAppDataFolder" Name="AppData"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Directory Id="AppRootDirectory" Name="MyApplication"/&amp;gt;&lt;br&gt;&amp;lt;/Directory&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;In addition, the component that includes the payload for this example MSI includes a CreateFolder entry, a RemoveFolder entry and a HKEY_CURRENT_USER registry entry that is marked as the key path.&amp;nbsp; This is defined in the following authoring:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;DirectoryRef Id="AppRootDirectory"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Component Id="Registration.xml" Guid="f671ee4d-dd0a-4f7f-a4d1-1d181d2f3002" DiskId="1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CreateFolder/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RemoveFolder Id="RemoveAppRootDirectory" On="uninstall" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;File Id="Registration.xml" Name="Registration.xml" Source="Registration.xml" Checksum="no" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;File Id="Application.png" Name="Application.png" Source="Application.png" Checksum="no" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RegistryKey Root="HKCU" Key="Software\MyCompany\MyApplication" Action="createAndRemoveOnUninstall"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RegistryValue Name="Version" Value="[ProductVersion]" Type="string" KeyPath="yes"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/RegistryKey&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Component&amp;gt;&lt;br&gt;&amp;lt;/DirectoryRef&amp;gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;These settings are included in this setup authoring in order to eliminate &lt;a href="http://msdn2.microsoft.com/en-us/library/aa368961.aspx"&gt;ICE38&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/library/aa369011.aspx"&gt;ICE64&lt;/a&gt; errors when building the MSI. &lt;p&gt;The example package includes some custom actions to register the application with Media Center, but these custom actions do not require administrative privileges so they will work correctly in a per-user MSI that does not run with elevated privileges. &lt;p&gt;One other note - the build script included with this example includes a command line argument to suppress errors and warnings related to &lt;a href="http://msdn2.microsoft.com/en-us/library/aa369053.aspx"&gt;ICE91&lt;/a&gt; when running Light.&amp;nbsp; This ICE validation test reports warnings if any resources are installed to a per-user location in an MSI.&amp;nbsp; However, in this example, the warning can be safely ignored because the MSI is specifically designed to be per-user, and as we will see in step 2 below, we will also enforce that the MSI can only be installed per-user. &lt;p&gt;&lt;strong&gt;2.&amp;nbsp; Set the ALLUSERS property to an empty string &lt;/strong&gt; &lt;p&gt;The following syntax defines the ALLUSERS property but does not assign a value to it so it will be set to blank during installation:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;Property Id="ALLUSERS" Secure="yes"/&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Since this property is a Windows Installer public property, it could be changed by the user when they install the MSI via command line.&amp;nbsp; As an extra precaution, I added a launch condition to this WXS file so that the MSI will not allow you to install if you try to set the ALLUSERS property to something other than blank or 0.&amp;nbsp; This WiX authoring is used to implement this block:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;Condition Message="!(loc.LaunchCondition_AllUsers)"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NOT ALLUSERS OR ALLUSERS=0)&lt;br&gt;&amp;lt;/Condition&amp;gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The error message that appears when this block is invoked is defined in this entry in the WiX localization (WXL) file named Setup-en-us.wxl that is included in the zip file: &lt;blockquote&gt; &lt;p&gt;&amp;lt;String Id="LaunchCondition_AllUsers"&amp;gt;Setting the ALLUSERS property is not allowed because [ProductName] is a per-user application. Setup will now exit.&amp;lt;/String&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;3.&amp;nbsp; Set bit 3 of the &lt;a href="http://msdn2.microsoft.com/en-us/library/Aa372870.aspx"&gt;Word Count summary property&lt;/a&gt; to 8 to indicate that elevated privileges are not required&lt;/strong&gt; &lt;p&gt;This is accomplished in WiX by setting the InstallerPrivileges attribute to "limited" in the Package element.&amp;nbsp; In this example, the Package element looks like the following:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;Package Description="!(loc.Package_Description)"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Comments="!(loc.Package_Comments)"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InstallerVersion="200"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Compressed="yes"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;InstallPrivileges="limited" &lt;/strong&gt;&lt;br&gt;/&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The build script included with this example includes a command line argument to suppress errors and warnings related to &lt;a href="http://msdn2.microsoft.com/en-us/library/aa368962.aspx"&gt;ICE39&lt;/a&gt; when running Light.&amp;nbsp; This ICE validation test checks the contents of the &lt;a href="http://msdn2.microsoft.com/en-us/library/aa372044.aspx"&gt;Summary Information Stream&lt;/a&gt; in the MSI.&amp;nbsp; Bit 3 of the Word Count summary property is a part of the Summary Information Stream, and it is a new value introduced in Windows Installer 4.0.&amp;nbsp; Unfortunately, the ICE validation test file (darice.cub) does not currently recognize this new bit, and an MSI that attempts to set it will fail ICE39 tests even though it is authored correctly.&amp;nbsp; Ignoring ICE39 errors is safe in this case because if an MSI that includes it is installed using an older version of Windows Installer that does not recognize it, Windows Installer will ignore it. &lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6385121" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=11345"&gt;</description><author>Aaron Stebners WebLog</author><pubDate>2007-11-19T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>A Short Introduction to .Net Satellite Assemblies (aka Resource DLL's, Language DLL's, Localization DLL's, etc)</title><link>http://softlogger.com/8713/DotNetNuke/a-short-introduction-to-net-satellite-assemblies-aka-resource-dll-s-language-dll-s-localization-dll-s-etc.aspx</link><description>&lt;p&gt;&lt;a href="http://www.codeproject.com"&gt;CodeProject&lt;/a&gt; - &lt;a href="http://www.codeproject.com/dotnet/satellite_assembly.asp"&gt;Satellite Assembly and Implementation Details&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Microsoft released the .NET Framework and common language runtime model, targeting high productivity in software development. Their goal was to create an enriched user experience with easy-to-use products. &lt;/p&gt; &lt;p&gt;Satellite assembly comes into the picture when we develop an application, which is localized on a specific culture. Throughout this article we will explain the use and implementation details of satellite assembly.  &lt;p&gt;...&amp;nbsp; &lt;p&gt;But in order to talk about localization, we must know about resource files. Resource files are nothing but a key and textual, value collections specific to each language. Therefore, we will have to create a resource file for each language that we plan to support. The .NET Framework classes will retrieve language-specific details from these multiple language resource files based on the chosen language context.  &lt;p&gt;..."&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Another localization option for .Net developers...&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;Related Past Post XRef:&lt;br&gt;&lt;a href="http://www.blogger.com/feeds/5655811/posts/default/2019437651684414293"&gt;Project Localizer - An Interesting way to Localize your Project&lt;/a&gt; &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/coolthingoftheday?a=itCaoPwo"&gt;&lt;img src="http://feeds.feedburner.com/~f/coolthingoftheday?i=itCaoPwo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/coolthingoftheday?a=ponEDJMX"&gt;&lt;img src="http://feeds.feedburner.com/~f/coolthingoftheday?i=ponEDJMX" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/coolthingoftheday?a=4fkD6iuj"&gt;&lt;img src="http://feeds.feedburner.com/~f/coolthingoftheday?i=4fkD6iuj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/coolthingoftheday/~4/162447876" height="1" width="1"/&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=8713"&gt;</description><author>Gregs Cool [Insert Clever Name] of the Day</author><pubDate>2007-10-24T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>Pure CSS SEO Layouts for DotNetNuke skins</title><link>http://softlogger.com/8801/DotNetNuke/pure-css-seo-layouts-for-do-netnuke-skins.aspx</link><description>Issue 25 of DNN Creative Magazine has been released. - This is our second year anniversary!&lt;br /&gt;&lt;br /&gt;In this issue we demonstrate how to create advanced pure CSS search engine optimized skin layouts.&lt;br /&gt;&lt;br /&gt;These techniques were developed for the new DNN Creative skin. Following the release of the DNN Creative skin we have responded to the requests of our subscribers for tutorials covering how to create these SEO CSS skins.&lt;br /&gt;&lt;br /&gt;Continuing the SEO CSS skin layout tutorials we also explore multiple skin layout techniques and reducing CSS code through the skinname.css file.&lt;br /&gt;&lt;br /&gt;These are advanced and flexible techniques for improving your pure CSS skins.&lt;br /&gt;&lt;br /&gt;This issue comes complete with 8 videos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/SkinningTutorials/CSSSEOLayouts/tabid/367/Default.aspx"&gt;Pure CSS SEO Layouts for DotNetNuke skins &lt;/a&gt;&lt;br /&gt;(7 videos – 64mins)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/SkinningTutorials/Multipleskinlayouts/tabid/368/Default.aspx"&gt;Multiple skin layouts using skinname.CSS&lt;/a&gt;&lt;br /&gt;(1 video – 8mins)&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=8801"&gt;</description><author>DotNetNuke tutorials, tips &amp;amp; tricks</author><pubDate>2007-10-24T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>PowerShell for DotNetNuke</title><link>http://softlogger.com/8715/DotNetNuke/powershell-for-do-netnuke.aspx</link><description>&lt;p&gt;For the past couple of months I have been playing with PowerShell and it has been a real pleasure to dig-in and get my hands dirty in a command-line interface again.  Not since my early days with the &lt;a href="http://www.amiga.com/"&gt;Amiga&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/ARexx"&gt;ARexx&lt;/a&gt; have I enjoyed learning about a new CLI and an associated scripting language.  The PowerShell team has done a great job of bringing windows scripting and the CLI into the 21st century.  Not only has Microsoft been putting in a lot of effort into PowerShell, but you are also seeing an explosion of third-parties who have also jumped onboard to push the new language and hosting environment.  Companies like &lt;a href="http://www.primalscript.com/Free_Tools/index.asp"&gt;Sapien&lt;/a&gt;, &lt;a href="http://www.quest.com/activeroles-server/arms.aspx"&gt;Quest&lt;/a&gt;, &lt;a href="http://www.nsoftware.com/powershell/"&gt;/n Software&lt;/a&gt;, and &lt;a href="http://www.powershellanalyzer.com/"&gt;ShellTools&lt;/a&gt; are creating great tools and sponsoring community sites like &lt;a href="http://www.powershellcommunity.org/"&gt;PowerShellCommunity.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With all of this excitement and passion in the PowerShell community, how could I not look to see how I could use PowerShell with DotNetNuke.  Thus was born my session idea:  &lt;a href="http://www.openforce07.com/Conferences/OpenForce07/Sessions/tabid/57/Default.aspx"&gt;PowerShell for DotNetNuke&lt;/a&gt; which I will be presenting in Las Vegas at &lt;a href="http://www.openforce07.com/Conferences/OpenForce07/"&gt;OpenForce '07&lt;/a&gt;.  During my session I will be showing how you can use PowerShell to enhance managing DotNetNuke, both for installing new sites and for sites that are already up and running.  &lt;/p&gt;
&lt;p&gt;One of the early ideas I had was that I might even be able to create a DotNetNuke module that would let a user execute PowerShell commands and scripts on the server.  Since DotNetNuke allows you to lock down access to any module it is fairly secure.  The initial code for this module is based off earlier examples by &lt;a href="http://www.hanselman.com/blog/TestingPowerShellScriptsWithNUnit.aspx"&gt;Scott Hanselman&lt;/a&gt; and &lt;a href="http://www.leastprivilege.com/HostingPowerShellInASPNET.aspx"&gt;Dominick Baier&lt;/a&gt;.  Here is a sample video of my work so far.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="margin: 10px auto; width: 640px; height: 498px;"&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="640" height="498"&gt; &lt;param name="movie" value="http://content.screencast.com/bootstrap.swf" /&gt; &lt;param name="quality" value="high" /&gt; &lt;param name="bgcolor" value="#FFFFFF" /&gt; &lt;param name="flashVars" value="content=http://content.screencast.com/media/114cc50c-f149-4032-982b-cc7d14a87bd9_cd10fcf4-7a0f-443e-baab-9a2d1c84a7b5_static_0_0_PowerShellForDNN.swf&amp;amp;width=640&amp;amp;height=498" /&gt; &lt;param name="allowFullScreen" value="true" /&gt; &lt;embed src="http://content.screencast.com/bootstrap.swf" quality="high" bgcolor="#FFFFFF" width="640" height="498" type="application/x-shockwave-flash" flashvars="content=http://content.screencast.com/media/114cc50c-f149-4032-982b-cc7d14a87bd9_cd10fcf4-7a0f-443e-baab-9a2d1c84a7b5_static_0_0_PowerShellForDNN.swf&amp;amp;width=640&amp;amp;height=498" allowfullscreen="true"&gt; &lt;/embed&gt; &lt;/object&gt;&lt;/div&gt;
&lt;p&gt;I still have some enhancements that I will be making before the conference, but you can download the latest code here.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="fb3a1972-4489-4e52-abe7-25a00bb07fdf:ec7419fa-8b07-47b7-97a2-a8b47d5c6610" contenteditable="false" style="margin: 0px; padding: 0px; display: inline;"&gt;
&lt;p&gt; &lt;a href="http://blog.theaccidentalgeek.com/images/blog_theaccidentalgeek_com/WindowsLiveWriter/PowerShellforDotNetNuke_DBC6/Posh4DNN_01.00.00_Install.zip" target="_blank"&gt;Posh4DNN Module&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:64f9e5b9-e97b-41fc-9897-ae90aed95834" contenteditable="false" style="margin: 0px; padding: 0px; display: inline;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/DotNetNuke" rel="tag"&gt;DotNetNuke&lt;/a&gt;, &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;, &lt;a href="http://technorati.com/tags/OpenForce%20'07" rel="tag"&gt;OpenForce '07&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.theaccidentalgeek.com/aggbug/20.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/JoeBrinkman?a=XynNR6MM"&gt;&lt;img src="http://feeds.feedburner.com/~f/JoeBrinkman?i=XynNR6MM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/JoeBrinkman?a=Kh4CVYqL"&gt;&lt;img src="http://feeds.feedburner.com/~f/JoeBrinkman?i=Kh4CVYqL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/JoeBrinkman?a=iYpXumD0"&gt;&lt;img src="http://feeds.feedburner.com/~f/JoeBrinkman?i=iYpXumD0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/JoeBrinkman?a=a3ODwNuh"&gt;&lt;img src="http://feeds.feedburner.com/~f/JoeBrinkman?i=a3ODwNuh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/JoeBrinkman?a=W1nB6dAV"&gt;&lt;img src="http://feeds.feedburner.com/~f/JoeBrinkman?i=W1nB6dAV" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JoeBrinkman/~4/169803291" height="1" width="1"/&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=8715"&gt;</description><author>The Accidental Geek - Joe Brinkman</author><pubDate>2007-10-14T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>5 Free CSS XHTML Compliant DotNetNuke Skins</title><link>http://softlogger.com/7563/DotNetNuke/5-free-css-xhtml-compliant-do-netnuke-skins.aspx</link><description>We have now completed the changeover to the new pure CSS skin for DNN Creative, so for issue 23 we have released &lt;a href="http://www.dnncreative.com/Issueno23/tabid/356/Default.aspx"&gt;5 free pure CSS XHTML compliant skins&lt;/a&gt; for DotNetNuke.&lt;br /&gt;&lt;br /&gt;These skins are open source html templates which we have converted to DotNetNuke skins.&lt;br /&gt;&lt;br /&gt;Viewing the code from a variety of designers helps to improve your CSS skills and learn multiple techniques for manipulating the layouts and styling of CSS skins....&lt;br /&gt;&lt;br /&gt;Skins:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/SkinningTutorials/Andreas01/tabid/355/Default.aspx"&gt; Andreas 01&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/SkinningTutorials/Andreas09/tabid/357/Default.aspx"&gt; Andreas 09&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/SkinningTutorials/SummerBreeze/tabid/358/Default.aspx"&gt; Summer Breeze&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/SkinningTutorials/FreeStyle/tabid/359/Default.aspx"&gt;FreeStyle&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Tutorials/SkinningTutorials/CuriouslyGreen/tabid/360/Default.aspx"&gt;Curiously Green&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://skintemplates.dnncreative.com/"&gt; View all skins live&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope you find them useful.&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=7563"&gt;</description><author>DotNetNuke tutorials, tips &amp;amp; tricks</author><pubDate>2007-09-13T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>Page Templates and Page Management</title><link>http://softlogger.com/7562/DotNetNuke/page-templates-and-page-management.aspx</link><description>Issue 24 of DNN Creative Magazine has been release.&lt;br /&gt;&lt;br /&gt;In this issue we demonstrate how to work with and create your own page templates. We have discovered an easy technique for creating page templates so that you do not require any programming skills to create complex templates.&lt;br /&gt;&lt;br /&gt;Page templates are a powerful time saving tool. If you have certain modules that you regularly need to add to a page, you can do this automatically with a page template. If you have content in a Text / HTML module that you always use as a starting point, you can have default content added to a module through a page template.&lt;br /&gt;&lt;br /&gt;Following page templates we demonstrate the new page management functions in the latest versions of DotNetNuke. This covers username permissions and various page copying functions.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/tabid/361/Default.aspx"&gt;How to create Page Templates in DotNetNuke&lt;/a&gt;&lt;br /&gt;(4 videos – 32mins)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dnncreative.com/tabid/362/Default.aspx"&gt;Page Management – New Functions DotNetNuke v4.5.x&lt;/a&gt;&lt;br /&gt;(2 videos – 19mins)&lt;br /&gt;&lt;a href="http://www.dnncreative.com/Home/Issues/Volume2/Issueno24/tabid/363/Default.aspx"&gt;&lt;br /&gt;Issue 24 – Page Templates and Page Management&lt;/a&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=7562"&gt;</description><author>DotNetNuke tutorials, tips &amp;amp; tricks</author><pubDate>2007-09-13T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>DNN 4.5.3 Redirect for ReturnURL Issue</title><link>http://softlogger.com/7192/DotNetNuke/dnn-4-5-3-redirect-for-returnurl-issue.aspx</link><description>&lt;p&gt;
We have installed and upgraded quite a few sites to the latest DNN version, 4.5.3,
that came out last week and most went seamlessly. However, we have found one issue
that has raised it's ugly head quite a few times. After upgrading, if you clicked
on "Register" you would be redirected to an admin skinned page with no account fields/content.
Looking at the url you can see "/ctl/returnurl". Since the site(s) uses a custom page
using a 3rd party module for registration&amp;nbsp;for the account info, it is specified
in Admin &amp;gt; Site Settings &amp;gt; Advanced Settings &amp;gt; Page Management &amp;gt; User
Page. 
&lt;/p&gt;
&lt;p&gt;
Here is the error message:
&lt;/p&gt;
&lt;p&gt;
System.Web.HttpException: Could not load type ''. ---&amp;gt; System.ArgumentException:
String cannot have zero length. at System.Reflection.Assembly.GetType(String name,
Boolean throwOnError, Boolean ignoreCase) at System.Web.Compilation.BuildManager.GetType(String
typeName, Boolean throwOnError, Boolean ignoreCase) --- End of inner exception stack
trace --- at System.Web.Compilation.BuildManager.GetType(String typeName, Boolean
throwOnError, Boolean ignoreCase) at DotNetNuke.Framework.Reflection.CreateType(String
TypeName, String CacheKey, Boolean UseCache, Boolean IgnoreErrors)
&lt;/p&gt;
&lt;p&gt;
Luckily we found a post on the DNN Forums concerning the quick fix...
&lt;/p&gt;
&lt;p&gt;
&lt;span class=Forum_NormalBold id=spSubject&gt;&lt;a href="http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/108/threadid/140539/threadpage/1/scope/posts/Default.aspx" name=140539&gt;4.5.3
New user registration not working if specific page defined&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
In the above post someone else was having a similar issue. It looks like there was
a bug reported as well:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://support.dotnetnuke.com/issue/ViewIssue.aspx?id=5746"&gt;http://support.dotnetnuke.com/issue/ViewIssue.aspx?id=5746&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
While there could definitely been a longer or better description of the problem, it
was quickly closed with "unable to reproduce in 4.5.3" the next day without any followup.
Luckily the thread on the forums gained the interest of other having the issue and&amp;nbsp;vitkoz
was kind enough to run it through debugging to find the issue and hence the issue
has been reopened in the DNN issue tracker.
&lt;/p&gt;
&lt;p&gt;
Here is his fix:&lt;span class=Forum_Normal id=spBody&gt;
&lt;/p&gt;
&lt;p&gt;
"In the file admin/skins/user.ascx.vb, line 142 needs to be changed:
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&amp;nbsp;FROM THIS:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=3&gt;Response.Redirect(NavigateURL(PortalSettings.UserTabId,&lt;font color=#a31515&gt;"returnurl="&lt;/font&gt; &amp;amp;
ReturnUrl), &lt;font color=#0000ff&gt;True&lt;/font&gt;)&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;strong&gt;TO THIS:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=3&gt;Response.Redirect(NavigateURL(PortalSettings.UserTabId, &lt;font color=#ffffff&gt;&lt;strong&gt;&lt;font style="BACKGROUND-COLOR: #ff0000"&gt;"Register",&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt; &lt;font color=#a31515&gt;"returnurl="&lt;/font&gt; &amp;amp;
ReturnUrl), &lt;font color=#0000ff&gt;True&lt;/font&gt;)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font size=2&gt;You can simply go to that file, make that change, and IIS will
recompile it on the next run." - vitkoz&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&gt;&lt;img width="0" height="0" src="http://dnnblog.venexus.com/aggbug.ashx?id=abb5705c-7e8d-4b86-8682-5c9d296036b6" /&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=7192"&gt;</description><author>Venexus DotNetNuke Blog                                                                             </author><pubDate>2007-06-05T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>Continuous Integration Environment for DotNetNuke Module Development</title><link>http://softlogger.com/7046/DotNetNuke/continuous-integration-environment-for-do-netnuke-module-development.aspx</link><description>&lt;p&gt;
&lt;strong&gt;&lt;em&gt;Continuous integration&lt;/em&gt;&lt;/strong&gt; is a software development term describing
the process that completely rebuilds and tests applications frequently. We recently
implemented a continuous integration environment to “publish” our DotNetNuke modules
to our development/staging DotNetNuke sites. 
&lt;/p&gt;
&lt;p&gt;
The main advantages of a continuous integration environment are:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Issues are detected and fixed continuously! 
&lt;li&gt;
Enhancements and new features are published continuously! 
&lt;li&gt;
You are warned about problematic code before it is published. 
&lt;li&gt;
Immediate unit testing of all changes. 
&lt;li&gt;
Constant availability of a "current" build for testing, demos, or releases. 
&lt;li&gt;
Bragging rights for developers who have the least number of broken builds. 
&lt;li&gt;
Huge conservation of time when considering the normal administrative process of Build
&amp;gt; Package &amp;gt; install in DNN &amp;gt; Test. 
&lt;li&gt;
Did I mention this is continuous?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font size=3&gt;How Our CI and DNN Environment Works&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Below is a picture to show you the basics of how our continuous integration environment
works. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://dnnblog.venexus.com/content/binary/Continuous-Integration-DotNetNuke1.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font color=#ff0000&gt;Disclaimer:&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
If you are running Visual Studio 2005 Web Developer Express, our setup will not work
for you. You can stop reading here, or upgrade, unless you are just curious, then
read on… 
&lt;li&gt;
There have been long discussion on Web Site Projects (WSP) versus Web Application
Projects (WAP) and this post is not one to argue about which is better, rather than
to say this is what we do, and the basics of how it works. 
&lt;li&gt;
You are free to comment and collaborate with others on this post. Feel free to even
argue about WAP versus WEP, or that you may know of a way to integrate CI with DNN
and WSP, we really do not care. However, we do not have time to walk you through setting
any of this up, so please do not ask…unless you are interested in one of our &lt;a href="http://www.venexus.com/Services/DotNetNuke/DotNetNukeSupport/tabid/912/Default.aspx"&gt;DNN
support packages&lt;/a&gt;, then by all means we can help ;-)&lt;br&gt;
&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;strong&gt;Basics of the process:&lt;/strong&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
A developer “commits” the DNN module code to Subversion. 
&lt;li&gt;
The commit triggers CruiseControl.Net to “build” the DNN module using a “Trigger”
for the project. 
&lt;li&gt;
CruiseControl.Net can be configured to unit test the module before publishing. 
&lt;li&gt;
An “ExecutableTask” is used with our custom assembly publisher application to send
the .DLL file to the DNN website. 
&lt;li&gt;
A “BuildPublisher” sends the code from the source directory to the DNN site (D:\DNNSites\ClientDevSite\DesktopModules\CustomDNNModule
as example). 
&lt;li&gt;
Results of “build” are visible in the CruiseControl.Net Web&amp;nbsp;Dashboard.&lt;br&gt;
&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font size=3&gt;Implementing CI for DNN Development&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Development:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
We started DotNetnuke 4 development using the WSP methodology for all of our DNN projects.
This has been successful for us for quite a while, especially when using EntitySpaces
for the &lt;a href="http://www.entityspaces.net"&gt;Persistence Layer and Business Objects&lt;/a&gt; (it's
so easy using ES to generate the DAL. You must check this out if you are not using
it). However, we found that to make this work we have to use WAP projects. I have
a very fast laptop, but using WSP and doing a build of all of DNN to compile a module
can be quite time consuming, taking several minutes sometimes. But, building a WAP
project is FAST, saving some development time when debugging and testing builds, especially
when doing those final little tweaks. One could argue that WSP is better, but for
our setup with one to many developers working on a single module, WAP is the best
decision. So, it did not take much to twist our arm to changing our methodology. It
is unfortunate that in order to use this for our existing clients and projects, we
will need to convert our WSP modules to WAP. But, we have started developing all new
modules as WAPs and converting WSP modules to WAP is not a difficult task.
&lt;/p&gt;
&lt;p&gt;
To read about the great WSP versus WAP debate, see the following links:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Shaun Walker’s post on WAP&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/434/Default.aspx"&gt;http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/434/Default.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;An interesting debate between Michael Washington and Vladan Strigo&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetnuke.com/Projects/ModuleNews/Forums/tabid/953/forumid/111/threadid/91268/threadpage/6/scope/posts/Default.aspx"&gt;http://www.dotnetnuke.com/Projects/ModuleNews/Forums/tabid/953/forumid/111/threadid/91268/threadpage/6/scope/posts/Default.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;em&gt;WAP Methodology&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
“Web Application Projects provide a companion web project model that can be used as
an alternative to the built-in Web Site Project in Visual Studio 2005. This new model
is ideal for web site developers who are converting a Visual Studio .Net 2003 web
project to Visual Studio 2005. (Released May 8, 2006)” - &lt;a href="http://msdn2.microsoft.com/en-us/asp.net/aa336618.aspx"&gt;http://msdn2.microsoft.com/en-us/asp.net/aa336618.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Michael Washington has a great post on creating a DNN WAP Module:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.adefwebserver.com/DotNetNukeHELP/DNN4_WAP/"&gt;http://www.adefwebserver.com/DotNetNukeHELP/DNN4_WAP/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Once the module is ready for testing on our client development site, we use &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt; to
“commit” code to Subversion (&lt;a href="http://tortoisesvn.tigris.org/"&gt;http://tortoisesvn.tigris.org/&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Source Code Version Control:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
We use &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; for our source code
repository and version control system (&lt;a href="http://subversion.tigris.org/"&gt;http://subversion.tigris.org/&lt;/a&gt;).
We have tried Visual SourceSafe and CVS, but have been using Subversion with success
for quite some time now. CruiseControl.Net integrates with Subversion easily. It is
also nice that there is a&amp;nbsp;plugin for Subversion that allows us to send our comments
directly to Gemini (project management/tracking application) when we commit new code.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Continuous Integration Software:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
We use &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.Net&lt;/a&gt;,
a .Net port of the Java based CruiseControl&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;em&gt;Continuous Integration Server using CruiseControl.Net&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The CruiseControl.Net Server automates the integration process by monitoring the team's
source control repository directly. Every time a developer commits a new set of modifications
for the DNN module, the server will automatically launch an integration build to validate
the changes. When the build is complete, the server notifies the developer whether
the changes that they committed integrated successfully or not. 
&lt;/p&gt;
&lt;p&gt;
CruiseControl.Net allows for several different types of “Tasks”, such as:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
EmailPublisher (for emailing of build details) 
&lt;li&gt;
ExecutableTask (for kicking off executables, such as our custom assembly publisher) 
&lt;li&gt;
NAntTask (for unit testing) 
&lt;li&gt;
NUnitTask (for unit testing) 
&lt;li&gt;
RSSBuildsPublisher (for generating a RSS feed with details) 
&lt;li&gt;
VisualStudioTask (for running something in VS) 
&lt;li&gt;
Etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;em&gt;Here is an example ccnet.config:&lt;/em&gt;
&lt;br&gt;
&amp;lt;!--&amp;lt;ccnetconfig&amp;gt;&amp;lt;configurationVersion&amp;gt;1.2.1&amp;lt;/configurationVersion&amp;gt;&amp;lt;/ccnetconfig&amp;gt;--&amp;gt;&lt;br&gt;
&amp;lt;cruisecontrol&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;project name="BPLWantList"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;workingDirectory&amp;gt;D:\cibuilds\ProjectName\ModuleName&amp;lt;/workingDirectory&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webURL&amp;gt;http://ourCIdomain.com/server/local/project/ModuleName/ViewProjectReport.aspx&amp;lt;/webURL&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sourcecontrol type="svn"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;trunkUrl&amp;gt;svn://localhost/ProjectName/ModuleName&amp;lt;/trunkUrl&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/sourcecontrol&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;triggers&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;intervalTrigger name="Quarter Hour Build" seconds="900"
/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/triggers&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tasks&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;exec&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;executable&amp;gt;VenexusAssemblyPublisher.exe&amp;lt;/executable&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;baseDirectory&amp;gt;D:\&amp;lt;/baseDirectory&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;buildArgs&amp;gt;"d:\Source\ProjectName\DesktopModules\ModuleName\obj\Debug"
"d:\DevSites\ProjectName\bin"&amp;lt;/buildArgs&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/exec&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tasks&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;publishers&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;buildpublisher&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sourceDir&amp;gt;D:\cibuilds\ProjectName\ModuleName&amp;lt;/sourceDir&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;publishDir&amp;gt;D:\DevSites\ProjectName\DesktopModules\ModuleName&amp;lt;/publishDir&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;useLabelSubDirectory&amp;gt;false&amp;lt;/useLabelSubDirectory&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/buildpublisher&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xmllogger /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;statistics /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/publishers&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/project&amp;gt;&lt;br&gt;
&amp;lt;/cruisecontrol&amp;gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;em&gt;&lt;strong&gt;CruiseControl.Net Web Dashboard&lt;/strong&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The &lt;a href="http://ccnet.sourceforge.net/CCNET/Web%20Dashboard.html"&gt;CruiseControl.Net
Web Dashboard Application&lt;/a&gt; is used for reporting a wide range of information about
the builds. At one end of the scale it reports summary details of all projects in
your organisation and at the other it can give specific metric output for any specific
build. 
&lt;/p&gt;
&lt;p&gt;
Here is an example of a simple DNN Module being used in our CI environment:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://dnnblog.venexus.com/content/binary/CruiseControlDashboard.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Notice the failed build notification. While we have not setup unit testing, you can
see in the left menu in the image, there are quite a few different options.
&lt;/p&gt;
&lt;p&gt;
&lt;font size=3&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
For long term DotNetNuke module projects, setting up a continuous integration environment
will save a tremendous amount of time in the long run. All of the tools to implement
CI are free, lowering the total cost of DNN module development. With a little bit
of time setting up your environment, you can provide continuous updates to your clients,
all while forcing good coding practices among your developers.&amp;nbsp;&lt;br&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dnnblog.venexus.com/aggbug.ashx?id=592ea7d9-7cc3-406b-8803-ddf06a6bfbaf" /&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=7046"&gt;</description><author>Venexus DotNetNuke Blog                                                                             </author><pubDate>2007-04-20T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>Tags within tags regular expression</title><link>http://softlogger.com/12488/DotNetNuke/tags-within-tags-regular-expression.aspx</link><description>&lt;p&gt;
We ran into an issue parsing some HTML for a DNN content migration project we are
working on. We needed to find the actual content of the page, without all of the look
and feel. Luckily we found a pretty solid case of an opening and closing div tag that
wrapped the entire content of the page. At first we had a basic regular expression
for finding the div tags like so:
&lt;/p&gt;
&lt;font color=#008000 size=2&gt;&lt;font color=#008000 size=2&gt; 
&lt;p&gt;
&lt;font color=#ff0000&gt;Dim sRegEx As String = "&amp;lt;div align=" &amp;amp; Chr(34) &amp;amp; "center"
&amp;amp; Chr(34) &amp;amp; "[\d\D]*?\&amp;lt;/div&amp;gt;"&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#000000&gt;This worked fine until we ran into some code that had div tags
withing the div tags. The following shows you what the reg ex returns.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#000000&gt;Example:&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#ff0000&gt;&amp;lt;div align="center"&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#ff0000&gt;Some text here&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color=#ff0000&gt;&amp;lt;div&amp;gt; this is between another div&amp;lt;/div&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Here is more text that should be in the content we are ripping.
&lt;/p&gt;
&lt;p&gt;
&amp;lt;/div&amp;gt;
&lt;/p&gt;
&lt;/font&gt;&lt;/font&gt; 
&lt;p&gt;
After some digging, the following regex does the trick:
&lt;/p&gt;
&lt;font size=2&gt; 
&lt;p&gt;
&lt;/font&gt;&lt;font color=#0000ff size=2&gt;Dim&lt;/font&gt;&lt;font size=2&gt; regexp &lt;/font&gt;&lt;font color=#0000ff size=2&gt;As&lt;/font&gt;&lt;font size=2&gt; Regex
= &lt;/font&gt;&lt;font color=#0000ff size=2&gt;New&lt;/font&gt;&lt;font size=2&gt; Regex( _&gt;
&lt;p&gt;
&lt;/font&gt;&lt;font color=#800000 size=2&gt;"(&amp;lt;[^&amp;gt;]*?div[^&amp;gt;]*?(?:center)[^&amp;gt;]*&amp;gt;)((?:.*?(?:&amp;lt;[
\r\t]*div[^&amp;gt;]*&amp;gt;?.*?(?:&amp;lt;.*?/.*?div.*?&amp;gt;)?)*)*)(&amp;lt;[^&amp;gt;]*?/[^&amp;gt;]*?div[^&amp;gt;]*?&amp;gt;.*&amp;lt;/div&amp;gt;)"&lt;/font&gt;&lt;font size=2&gt;,
_&gt;
&lt;p&gt;
RegexOptions.IgnoreCase _
&lt;/p&gt;
&lt;p&gt;
&lt;/font&gt;&lt;font color=#0000ff size=2&gt;Or&lt;/font&gt;&lt;font size=2&gt; RegexOptions.Singleline _&gt;
&lt;p&gt;
)
&lt;/p&gt;
&lt;/font&gt;&lt;img width="0" height="0" src="http://dnnblog.venexus.com/aggbug.ashx?id=556dade8-4c76-41cb-9aa0-c68e92350754" /&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=12488"&gt;</description><author>Venexus DotNetNuke Blog                                                                             </author><pubDate>2007-03-14T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>DotNetNuke Commercial Module Licensing</title><link>http://softlogger.com/6225/DotNetNuke/do-netnuke-commercial-module-licensing.aspx</link><description>&lt;p&gt;As an open source project, DotNetNuke is available under an enterprise friendly BSD license. Since the license has no usage restrictions, there has never been any requirement for managing license restrictions in the core platform. However, as a web application framework, DotNetNuke has an advanced extensibility model which allows third party features to integrate seamlessly with the base platform. And while some of these third party features are offered under an open source license, there is also a rapidly evolving commercial ecosystem of products being offered under traditional software licensing models.&lt;/p&gt;
&lt;p&gt;In simple terms a software license is an agreement where the owner of a piece of software grants permission for others to use the software under very specific conditions. In a commercial model, the license generally needs to be purchased for a fee. Once a license has been acquired, the vendor is then obligated to deliver a version of the software which provides the functionality specified in the license agreement. This is typically done by providing the software on physical media, providing an ability to download the software electronically, or by providing an "activation key" which transforms a limited trial version into a fully working product. Once this process is complete, the challenge for the software vendor is how to enforce the usage restrictions in the license agreement. Most vendors would prefer to rely on a simple "trust" model, where the responsibility for adhering to licensing terms is passed on to the customer. The model requires very little administration; however, it does have the risk of being significantly abused, resulting in lost revenue or even worse implication for the vendor. To mitigate this risk, most vendors generally try to employ some additional techniques for enforcing the conditions in their license.&lt;/p&gt;
&lt;p&gt;As part of our ongoing efforts to provide more services for the DotNetNuke ecosystem, we have been gathering feedback and conducting business analysis on how we can assist developers with their commercial licensing needs. The following information represents the set of high level requirements we have gathered on this topic thus far.&lt;/p&gt;
&lt;p&gt;Licensing technology needs to integrate seamlessly with the base platform, without extra configuration or environmental constraints. It needs to be reliable and robust. It needs to work in a disconnected manner with no external dependencies which could impose network latency, performance, security, or privacy implications. It needs to work in an Internet as well as an Intranet scenario. It needs to be simple for the developer to integrate with their products and administrate.&lt;/p&gt;
&lt;p&gt;Licensing technology needs to be available to individual software developers. It should not require them to bundle their products with other third party products. Brand identity is a very tanglible asset which consumers use to identify quality and value; therefore, developers work hard to build their brand and create recognition and loyalty. Bundling generally leads to brand dilution and other issues based on association.&lt;/p&gt;
&lt;p&gt;Licensing technology needs to provide access to customer information. Customer data is an essential business asset which ultimately becomes part of the valuation of any successful software company. It provides the business intelligence necessary to identify trends in your customers and potential deficiencies in your products. It also provides the direct communication which allows you to provide a high level of support, pursue inside sales opportunities, and cultivate relationships and loyalty.&lt;/p&gt;
&lt;p&gt;Licensing technology needs to be flexible. Developers require a high level of control so they can adapt their business model to the evolving needs of their customers. A high level of control also provides the ability to automate administrative tasks and deliver real-time solutions. Dependence on a third party can be a significant business risk if not properly mitigated, as it introduces another point of failure which is outside of your immediate control. In addition, developers need to be wary of long term commitments, exclusivity, or other restrictive business tactics which can affect their future opportunities.  &lt;/p&gt;
&lt;p&gt;In general, DotNetNuke's approach is to provide value added tools and guidance which help developers create solutions to complex problems. At this time, there are a number of areas that we have identified where we can provide assistance to developers. One minor enhancement which is now in scope is to provide unique identifiers at the portal and host level which developers can rely on for generating localized activation keys. In addition, we will include a standard uasability mechanism where customers can enter their activation keys within DotNetNuke, as well as a secure data store and API which developers can use to save and retrieve these keys. In terms of generating keys and validating them within your products, we are in active discussions with a number of highly reputable component vendors who already possess enterprise-grade licensing technology with a long distinguished track record. Our goal is to work with these vendors to create an affordable, robust solution for DotNetNuke developers.&lt;/p&gt;
&lt;p&gt;Our current plans are to release these new services in the first part of 2007. We truly want this to be a collaborative effort so we will be working closely with our Benefactor community and Review Program participants. We anticipate that the feedback, suggestions, and beta testing we get from this highly focussed group will ensure an optimal solution for the entire community.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=6225"&gt;</description><author>Shaun Walker</author><pubDate>2007-01-03T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>Performance Enhancements</title><link>http://softlogger.com/6006/DotNetNuke/performance-enhancements.aspx</link><description>&lt;p&gt;So in my last blog I talked about how important it is to have a thorough understanding of the Windows Hosting environment before diving into performance optimizations in your web application. Another critical aspect is having a Performance Test Plan as well as a Test Lab where you can simulate load under various scenarios and measure the results. At the beginning of November, Charles Nurse spent one week in Redmond working side by side with some Microsoft perf experts, putting DotNetNuke through its paces in a robust test lab. The various resources were provided by the Microsoft Web Platform &amp; Tools team and Microsoft Patterns &amp; Practices team and we are eternally grateful to Microsoft for their assistance in this area.&lt;/p&gt;
&lt;p&gt;The purpose of the performance testing was to establish some baseline expectations by measuring how DotNetNuke reacted under a variety of load scenarios. Since DotNetNuke is primarily used in a shared hosting environment, we focussed on simulating a highly dense server configuration - with many active IIS web sites competing for server resources. We also limited our testing to ASP.NET 2.0 on IIS 6.0, as it is now the predominant platform for Windows hosting. We compared an early version of DotNetNuke 4.0 with the development code for DotNetNuke 4.4.0 to determine if the recent optimizations resulted in performance and/or scalability gains.&lt;/p&gt;
&lt;p&gt;Like many of our previous releases, DotNetNuke 4.4.0 has a central theme which in this case is focused on performance improvements. In DotNetNuke 4.4.0, we analyzed every single application layer and service to try and identify bottlenecks. We used a wide variety of tools and processes and gained some very deep technical knowledge on the intricacies of ASP.NET, IIS, and the Windows Hosting environment. It is never easy to produce a comprehensive solution for a complex problem, but after nearly 4 full-time months, we feel that we have finally reached a point where we can confidently deliver results to the community. &lt;/p&gt;
&lt;p&gt;Why did it take so long?&lt;/p&gt;
&lt;p&gt;An important thing to remember when it comes to performance tuning is more of an art than a science, as an improvement in one area can very easily lead to a degradation in another. For example, the common methodology which developers use to improve the response time of an application is to reduce the number of calls to the database. Typically this is accomplished with caching. However, based on the information in my previous blog post, we know that memory is a gating resource on a web server; therefore, there is an upper limit to the amount of data you can cache before your application's working set ( memory footprint ) becomes too large and effects scalability. Another important thing to remember when it comes to performance is that although a small gain/loss in one area does not seem like a big deal, when you multiple it across hundreds of active sites on a server, it can make a huge difference. This are just a couple of many variables you need to contend with as you work towards optimizing a web application.&lt;/p&gt;
&lt;p&gt;So how did we do it?&lt;/p&gt;
&lt;p&gt;Code Refactoring&lt;/p&gt;
&lt;p&gt;Using the Red-Gate ANTS Profiler, we were able to profile both the code and memory footprint of the application. The ANTS Profiler is an incredible tool for identifying bottlenecks and providing actual metrics of the application working set. And since the tool is relatively easy to configure, it is simple to test the application under a variety of different scenarios. A good example is testing a new web site install versus testing a fully provisioned production web site - as an application can behave much differently depending on the data volume it is supporting ( ie. a new DotNetNuke install has 1 page, 1 user, and 3 roles whereas a site like dotnetnuke.com has 1000+ pages, 360000+ users, and 50+ roles ). Another important aspect of performance testing is that the largest gains are obtained by optimizing your primary code path ( ie. the code execution path which is followed in 90% of your web requests ). ANTS Profiler does a good job of identifying the methods in your primary code path, regardless of where these methods exist within your application architecture. A few of the big offenders were XML Document handling and Serialization and use of reflection in our CBO utility class.&lt;/p&gt;
&lt;p&gt;Caching&lt;/p&gt;
&lt;p&gt;Steven Smith created a useful custom free tool ( Cache Manager - http://aspalliance.com/cachemanager/ ) which allows you to granularly view the memory footprint for various objects in your environment. This tool ( along with the ANTS Profiler ) was important for identifying and verifying some issues with our caching architecture.&lt;/p&gt;
&lt;p&gt;Since DotNetNuke 2.0, we had been using the ASP.NET Cache for storing our commonly used application entities. This allowed us to reduce the number of database hits, resulting in better response time. Unfortunately, the area where caching was initially implemented was in the Begin_Request page event. This made a lot of sense in terms of optimizing the response time in the primary code path, but it ignored the fact that background threads and administrative interfaces could also benefit from the caching of these objects. Another issue with our caching implementation was that we were storing redundant objects in the cache. Typically we were storing both a collection of objects as well as each individual object under unique keys in the cache. As a result our working set was nearly twice as large as it needed to be.&lt;/p&gt;
&lt;p&gt;To address these issues, we moved the caching logic from the Begin_Request page event to the business applicaton layer ( domain ). This allowed the caching logic to benefit all data access scenarios. We also changed our caching logic to use a Dictionary collection rather than an ArrayList, allowing us to store the objects in a single collection which still allows us to access individual objects based on their ID. These caching improvements allowed us to improve response time as well as reduce working set.&lt;/p&gt;
&lt;p&gt;Assembly Management&lt;/p&gt;
&lt;p&gt;As I mentioned in my last blog, all assemblies in the /bin folder are loaded into the AppDomain when it starts up. So when you have optional assemblies which you distribute with your application ( ie. alternate providers, handlers, etc... ) that are not necessary in the 90% use case scenario, this obviously has bad side effects because these optional assemblies contribute to the memory footprint of the application ( and once they are loaded, they are never unloaded - even if they are never referenced ). As usual, there are many ways to deal with this problem - each with their own advantages or disadvantages. &lt;/p&gt;
&lt;p&gt;One solution we implemented in DotNetNuke 4.4.0 is a new "light weight" install model. Basically, DotNetNuke will only install a few basic modules by default. The other modules will exist in the /Install/Module folder ( with a different file extension ) and can be optionally installed through the Host / Module Definitions interface. The result is that you only need to install the modules which you need for your site - and the other modules will not unnecessarily contribute to your memory footprint.&lt;/p&gt;
&lt;p&gt;Another solution we have investigated is the use of the Relative Search Path in the CLR which allows you to reference assemblies stored outside of the /bin folder. This is accomplished through the &lt;probing&gt; node in the &lt;runtime&gt; section of web.config. The benefit of this technique is that the CLR will granularly load inidividual assemblies when they are referenced by your application ( rather than loading ALL assemblies on app start ). For core framework items such as Providers, HTTP Modules, etc... we have verified that there are performance gains ( we are still investigating the upgrade complications ). For custom modules, it is not so simple and it appears that module developers would need to follow some strict guidelines in order to support this model. We are still investigating this scenario.&lt;/p&gt;
&lt;p&gt;One other solution which is often suggested is the use of the Global Assembly Cache ( GAC ). In order to support GAC installs, all of the assemblies in DotNetNuke need to be strongly named and the APTCA bit needs to be set. However, the practical limitations of using the GAC really do not make sense for DotNetNuke. Most Hosters tightly control the components which are installed in the GAC ( since they run in Full Trust ), and would not consider installing an application like DotNetNuke. This is not because DotNetNuke is untrusted, but rather because DotNetNuke is a pluggable application framework which allows third party modules to be installed at runtime. The combination of these factors represent a significant security risk in a shared hosting environment. In addition, the GAC allows for side-by-side installs of different versions of the same assembly. Based on DotNetNuke's agile release schedule, the administration of different release versions in the GAC would extremely challenging to manage effectively. Use of the GAC in a Dedicated server or Intranet environment may be feasible but it would certainly require some due diligence prior to production use.&lt;/p&gt;
&lt;p&gt;Database&lt;/p&gt;
&lt;p&gt;Using the SQL Server Profiler as well as some custom profiling scripts created by Bert Corderman, we were able to capture database performance metrics for both a clean install scenario as well as a high traffic production scenario ( dotnetnuke.com ). This type of profiling identified the most frequent and slowest database queries. Optimization involved offloading some calls to the cache, tuning the database schema with strategic indexes, and rewriting some stored procedures to make them more efficient. &lt;/p&gt;
&lt;p&gt;Compression&lt;/p&gt;
&lt;p&gt;One of the things which many of us developers take for granted is the fact that not everyone in the world has broadband Internet access. The infrastructure in some countries has not been upgraded to provide the same data transfer rates which we have come to expect in North America. This results in latency issues where the amount of time to transfer a standard HTML page to a client browser can vary drastically. As a result, reducing the payload ( size ) of each web response becomes a critical aspect to delivering a responsive web experience.&lt;/p&gt;
&lt;p&gt;One of the common techniques for reducing payload is to leverage HTTP Compression. HTTP Compression uses an algorithm to compress the response stream and reduce its size. IIS 6.0 has an integrated GZIP compression service but most Hosters do not enable it by default for a couple of reasons. First, compression does have the possibility of increasing CPU usage as the compression algorithm is procesor intensive. Second, compression does not cooperate with certain web application activities such as streaming ( uploading/downloading ) which means that the generic IIS 6.0 compression feature has the potential to break ASP.NET applications ( resulting in support tickets for the Hoster ).&lt;/p&gt;
&lt;p&gt;More than 18 months ago we were privileged enough to get support from Ben Lowery in the form of a contribution of his popular HTTP Compression module. Unfortunately, as a seperate DotNetNuke project, this module did not get the attention it deserved from our team. As a result, the HTTP Compression module was never bundled with the standard DotNetNuke distribution, which severely limited its adoption within the DotNetNuke community. In DotNetNuke 4.4.0 we have made the HTTP Compression module a first class citizen and have integrated it directly with the core framework. The module has a couple features specific to DotNetNuke - a whitespace filter using RegExp and a simple configuration file and UI for managing "exclusions" ( URLs which should not be compressed ).&lt;/p&gt;
&lt;p&gt;Page State&lt;/p&gt;
&lt;p&gt;In the same vein as Compression, all ASP.NET applications use a technique known as ViewState for persisting state across web requests. ViewState is stored within the page payload and has the potential to bloat your response stream, resulting in latency issues in lower bandwidth scenarios. A common technique for dealing with ViewState is to remove it from the page payload and store it on the web server. ASP.NET 2.0 makes this very simple and we have now integrated an alternate Page State persistence mechanism into the core framework. &lt;/p&gt;
&lt;p&gt;As you can see, there has been significant focus applied to the theme of Performance in DotNetNuke 4.4.0. I think we all need to recognize Charles Nurse for his incredible effort during this development phase. An initial beta package will be released to Platinum Benefactors at the end of this week for early testing.&lt;br /&gt;
&lt;/p&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=6006"&gt;</description><author>Shaun Walker</author><pubDate>2006-12-05T00:00:00</pubDate><category>DotNetNuke</category></item><item><title>And then there was Search...Part II</title><link>http://softlogger.com/5919/DotNetNuke/and-then-there-was-search--part-ii.aspx</link><description>I know it has been over a week since the &lt;a href="http://dnnblog.venexus.com/And+Then+There+Was+SearchPart+I.aspx"&gt;last
post&lt;/a&gt;. Sorry to leave you hanging, but sometimes there are just not enough hours
in a day. Anyway, without further ado, here is part two…&lt;strong&gt;SEAMUS&lt;/strong&gt;. 
&lt;p&gt;
   At some point earlier this year, DNN Find became a different mission. We decided to
   build a full blown &lt;a href="http://www.venexus.com/Services/DotNetNuke/DotNetNukeSearch/tabid/1280/Default.aspx"&gt;search
   engine for DotNetNuke&lt;/a&gt;. Not one that would just index a single DNN site, but one
   that would allow you to index all portals in a DNN installation AND information from
   external sites. And how would external site indexing best be handled? …via RSS feed
   aggregation of course.&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.venexus.com/Services/DotNetNuke/DotNetNukeSearch/Seamus/tabid/1286/Default.aspx"&gt;Seamus&lt;/a&gt; is
   the first of the two modules that make up the &lt;a href="http://www.venexus.com/Services/DotNetNuke/DotNetNukeSearch/tabid/1280/Default.aspx"&gt;Venexus
   Search Engine&lt;/a&gt;. &lt;strong&gt;SEAMUS&lt;/strong&gt; = &lt;strong&gt;S&lt;/strong&gt;earch &lt;strong&gt;E&lt;/strong&gt;ngine &lt;strong&gt;A&lt;/strong&gt;ggregation &lt;strong&gt;M&lt;/strong&gt;odule &lt;strong&gt;U&lt;/strong&gt;tilizing &lt;strong&gt;S&lt;/strong&gt;yndication.
   On a side note, there is also an obscure Pink Floyd song that not many know from the &lt;a href="http://www.google.com/musicl?lid=ko2BrR_u7aL&amp;amp;aid=kteLDMrjybG"&gt;Meddle&lt;/a&gt; album,
   about an old hound dog by the same name. Our hound dog “fetches” data and stores it
   to a table that has enabled MS SQL Server full-text indexing. But before I go into
   the specifics, I think it is important to know about the framework.
&lt;/p&gt;
&lt;p&gt;
   We started with traditional DotNetNuke module development…until &lt;a href="http://www.entityspaces.net"&gt;EntitySpaces&lt;/a&gt; was
   released. I’m an old ASP/VB developer and personally, it took me a bit to get my head
   wrapped around how ES worked, but once I figured it out, I was hooked. ES saves the
   day by automagically generating all the CRUD (create, read, update, delete). While
   very similar to the logic of a BusinessController and InfoObject, ES uses Collections
   and Entities. But, where I found ES the most useful is the &lt;a href="http://www.entityspaces.net/portal/Documentation/QueryAPISamples/tabid/80/Default.aspx"&gt;Dynamic
   Queries&lt;/a&gt;&amp;nbsp;you can write directly into the business logic.
&lt;/p&gt;
&lt;p&gt;
   For example, in Seamus we need to check the domain to see if it matches one we are
   already indexing:
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;&lt;strong&gt;&lt;font color=#ff0000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   Dim colDomains As New VenexusDomainCollection&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colDomains.Query.Select(colDomains.Query.DomainName,
   colDomains.Query.DomainID)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colDomains.Query.Where(colDomains.Query.DomainName.Equal(GetDomainName(sURL)))&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colDomains.Query.Load()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If colDomains.Count
   &amp;gt; 0 Then&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#006400&gt; ‘a
   bunch of removed logic goes here..&lt;/font&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End IF&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   With the &lt;em&gt;colDomains.Query.Select&lt;/em&gt;, we are only returning the data we need
   rather than all columns. With the &lt;em&gt;colDomains.Query.Where&lt;/em&gt;, I eliminated the
   need to:
&lt;/p&gt;
&lt;ol style="MARGIN-TOP: 0in" type=1&gt;
   &lt;li&gt;
      Write a stored proc just to retrieve by DomainName 
   &lt;li&gt;
      Iterate through the entire table, every row of all domains, just to find the one I
      am looking for.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
   I won’t even go into the performance gain of not having to loop through those rows
   of all columns, nor the time (even though it would be simple) to write a stored proc
   to pass in DomainName and have it return the DomainID. 
&lt;/p&gt;
&lt;p&gt;
   Here is an example of adding a record to Seamus for a new feed:
&lt;/p&gt;
&lt;p&gt;
   &lt;font color=#ff0000&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim entFeed
   As New VenexusSeamus&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.AddNew()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.Url = txtURL.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.Title = txtTitle.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.Account = txtAccount.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.Password = txtPassword.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.CacheTime = txtCacheTime.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.FeedTimeOut = txtTimeOut.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.DateAdded = Now()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.DateUpdated = "1/1/1901"&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;If chkActive.Checked
   = True Then&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;entFeed.IsActive
   = True&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   entFeed.IsActive = False&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entFeed.Save()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   Easy enough, eh?
&lt;/p&gt;
&lt;p&gt;
   And here is an update of a feed for Seamus:
&lt;/p&gt;
&lt;p&gt;
   &lt;font color=#ff0000&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim entFeed As New VenexusSeamus&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.LoadByPrimaryKey(hidRSSID.Value)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.Url = txtURL.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.Title = txtTitle.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.Account = txtAccount.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed .Password = txtPassword.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.CacheTime = txtCacheTime.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.FeedTimeOut = txtTimeOut.Text&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.DateAdded = Now()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.DateUpdated = "1/1/1901"&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;If chkActive.Checked = True
   Then&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;entFeed.IsActive
   = True&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Else&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   entFeed.IsActive = False&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed .Save()&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   And a delete example:
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;&lt;font color=#ff0000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim entFeed As New VenexusSeamus&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.LoadByPrimaryKey(hidRSSID.Value)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.MarkAsDeleted()&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entFeed.Save()&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   Yeah, it’s that easy. Makes you want to fire up your IDE eh?
&lt;/p&gt;
&lt;p&gt;
   Sure, I have used DAL Builder Pro, which was a huge time saver, but EntitySpaces made
   me to never want to develop any other way. Plus, last I checked, DAL Builder Pro was
   still only for DNN 3 development. The ease of generating the DAL and the ability to
   easily REgenerate the DAL if the database schema changes, makes ES the tool of choice
   for all of our module development. I cannot even begin to count the hours I have previously
   spent hand coding changes in a DAL due to spec changes. Oh how I wish I had all those
   hours back! 
&lt;/p&gt;
&lt;p&gt;
   With the new &lt;a href="http://www.entityspaces.net/portal/Products/DotNetNukeASCXAdminGridTemplateSuite/tabid/134/Default.aspx"&gt;DNN
   admin grid templates&lt;/a&gt;, it is just ridiculous how much code is generated before
   having to write the first line. The new template will generate an editable grid of
   the table(s), with sorting, paging, and search. If you are interested in .Net development
   (this is not just a DNN tool, it works for all .Net 2.0 development and using C# or
   VB.Net), you must &lt;a href="http://www.entityspaces.net/portal/Login/tabid/147/Default.aspx?returnurl=%2fportal%2fDownloads%2ftabid%2f94%2fforumid%2f58%2fpostid%2f2076%2fview%2ftopic%2fDefault.aspx"&gt;check
   it out&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
   &lt;em&gt;NOTE: Just so you know, we do not have any affiliation or partnership with EntitySpaces,
   we just think their tool rocks.&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
   So, even though we had much of the initial Seamus development completed, we scrapped
   it and started development with ES. This will make future modifications and additions
   so much easier, saving time in the long run.
&lt;/p&gt;
&lt;p&gt;
   With that said, here is how Seamus works…
&lt;/p&gt;
&lt;p&gt;
   After you install Seamus, you can go into the module settings:
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://dnnblog.venexus.com/content/binary/seamus-setting.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   So in this example, the display for Seamus should show the top 10 items last indexed,
   each with a link to the actual item in the Title and using the “…More” link. A feed
   icon will also be displayed that provides a link to a RSS feed for the top 10 items.
&lt;/p&gt;
&lt;p&gt;
   Here is an example of the display:
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://dnnblog.venexus.com/content/binary/seamus-all.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   Now while the above example does not show any local items (tabs or modules from this
   site), it does have items indexed from other sites. All of these items were from RSS
   feeds that were aggregated. As a module editor, you have the ability to manage external
   feeds (or local feeds if so desired, but we will go into more detail about how Seamus
   works shortly). But, if there were local items visible, they would only be visible
   if you have the proper permissions. Seamus checks permissions on any local site at
   the module and tab level for the display and the RSS feed.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   Here is an example of the feeds we are are currently indexing on the Venexus Search
   Engine:
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://dnnblog.venexus.com/content/binary/seamus-edit-feed-1.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   Here is the interface for adding new feeds:
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://dnnblog.venexus.com/content/binary/seamus-edit-feed-2.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   Now we will get into how Seamus works…
&lt;/p&gt;
&lt;p&gt;
   First off, on the first load of Seamus, a dump of data from all modules supporting
   the IPortable interface (currently limited to DNN Core modules) is performed to ensure
   that there is data in the index. And every X hours (determined in module settings),
   the index is checked for new, updated, and deleted pages/modules.
&lt;/p&gt;
&lt;p&gt;
   Secondly, any feeds that have been added to Seamus are aggregated 5 at a time, order
   by last updated.&amp;nbsp; And, while the user is sitting on the page, every 30 seconds
   that pass, 5 more feeds are aggregated via AJAX. This user interactive aggregating
   decreases the load on the server, rather than running as a scheduled task like the
   core DNN Search. 
&lt;/p&gt;
&lt;p&gt;
   In order to save bandwidth, and to not tick off the owners of the websites you are
   aggregating data from, Seamus has what I call “smart caching”. &amp;nbsp;Each time a feed
   is requested, if the information in the feed as not been updated, Seamus will increase
   the cache time. If the feed has been updated, it will request the same feed sooner
   than it had previously, decreasing the cache time. Over time, and based on the “average”
   a feed it updated, Seamus learns when to check again for updates, all while obeying
   TTLs.
&lt;/p&gt;
&lt;p&gt;
   Seamus will also index the current page/tab it is sitting on. Now you may be asking
   why you would index a page that displays items that have already been indexed. Well,
   Seamus can be setup to not display the top X items and/nor the RSS feed. Here is an
   example:
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://dnnblog.venexus.com/content/binary/seamus-nothing.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   With the above Seamus settings and the module settings to display on all pages and
   set to not display the container or using an “invisible” container, when a user lands
   on any page of the site, the page is indexed. You can index your entire site by letting
   the users "crawl" the website. Also, when the page is updated, the index will be updated.
   Here is the module settings example:
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://dnnblog.venexus.com/content/binary/module-settings.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   So, not only does Seamus index all portals in the DNN installation by doing a dump
   of all modules that support the IPortable interface and individual page indexing based
   on user interaction, it will also aggregate and index data from other sites. This
   gives you the ability to create a full blown search engine for your niche. For example,
   let say you have a website about racing. You could have your entire DNN site indexed,
   along with aggregation of more racing data from the following sites:
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.sportsline.com/partners/feeds/rss/auto_news"&gt;http://www.sportsline.com/partners/feeds/rss/auto_news&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://rss.news.yahoo.com/imgrss/events/sp/042103autoformula"&gt;http://rss.news.yahoo.com/imgrss/events/sp/042103autoformula&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://rss.cnn.com/rss/si_motorsports.rss"&gt;http://rss.cnn.com/rss/si_motorsports.rss&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   Not only are you able to display a list of the last items indexed in order to keep
   a page from becoming stagnant, you can also provide a RSS feed for your users, giving
   them a reason to return to your site. I will save a Seamus and SEO discussion for
   another time, but here is an example site for a &lt;a href="http://search.truelawyers.com"&gt;legal
   search engine&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
   Speaking of time, I am once again out of it. Part III will be a discussion of the
   second module, the search form module. Stay tuned...
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://dnnblog.venexus.com/aggbug.ashx?id=1bc994fa-5443-4ea3-977f-7702786a5318" /&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=5919"&gt;</description><author>Venexus DotNetNuke Blog                                                                             </author><pubDate>2006-11-25T00:00:00</pubDate><category>DotNetNuke</category></item></channel></rss>