Blog Home  Home Feed your aggregator (RSS 2.0)  
Venexus DotNetNuke Blog - Friday, July 28, 2006
DotNetNuke Articles, Code Snippets, Errors, and News
 
 Thursday, July 20, 2006

Shaun Walker has posted a feature matrix comparison of DotNetNuke versus ASP.NET 2.0 versus SharePoint Server 2003 ( SPS 2003 ) versus Microsoft Office Sharepoint Services 2007 ( MOSS 2007 ). This is a great breakdown of features showing the differences between the platforms and should help anyone who is trying to pitch DotNetNuke to the "decision makers".

Thursday, July 20, 2006 9:36:14 AM (US Eastern Standard Time, UTC-05:00)  #       | 

DNN 4.3.3 was released yesterday. We have our fingers crossed for this version! Stay tuned...

Thursday, July 20, 2006 9:22:31 AM (US Eastern Standard Time, UTC-05:00)  #       | 
 Wednesday, June 28, 2006

This has been an exciting month for DotNetNuke with over 300,000 registered users and the release of DotNetNuke 4.3. The new features in DNN 4.3 rock! And, offer many new features and functionality over its predecessors. While the new release is not without some new issues, and we do not believe this release is stable enough to be considered a production release, it does offer much promise into the future of DotNetNuke as it begins to catch-on with upper management (more on this later). If you just take a look at the number of downloads of DotNetNuke, there is a steady curve that leaves us all optimistic.

Date (UTC) Downloads Bytes Served
Jun 2006 * 99,379 667.2 GB
May 2006 72,360 423.2 GB
Apr 2006 70,736 411.4 GB
Mar 2006 81,935 480.8 GB
Feb 2006 84,530 492.9 GB
Jan 2006 93,425 547.6 GB
Dec 2005 111,006 651.2 GB
Nov 2005 150,077 891.7 GB
Oct 2005 43,193 256.2 GB
Sep 2005 38,540 303.8 GB
Aug 2005 38,103 354.8 GB
Jul 2005 43,292 462.6 GB
Jun 2005 60,881 592.6 GB
May 2005 23,931 369.1 GB
Apr 2005 39,365 613.0 GB
Mar 2005 45,624 577.6 GB
Feb 2005 34,013 279.7 GB
Jan 2005 25,517 186.2 GB
Dec 2004 24,219 137.8 GB
Nov 2004 20,151 108.3 GB
Oct 2004 13,932 68.5 GB
Sep 2004 13,180 63.9 GB
Aug 2004 14,067 67.5 GB
Jul 2004 14,508 69.6 GB
Jun 2004 23,907 115.0 GB
May 2004 13,300 53.2 GB
Apr 2004 21,074 80.1 GB
Mar 2004 4,300 15.9 GB
Feb 2004 0 0 bytes
Jan 2004 133 199.3 MB
Dec 2003 117 175.3 MB
Nov 2003 74 110.9 MB
Oct 2003 331 495.5 MB
Sep 2003 341 509.9 MB
Aug 2003 318 476.6 MB
Jul 2003 351 524.3 MB
Jun 2003 66 96.7 MB
May 2003 3,814 4.7 GB
Apr 2003 4,187 4.5 GB
Mar 2003 372 334.6 MB
     
Total 1,328,649 9.3 TB

* Partial data: End of month not yet reached

Figures authoritative as of:
SourceForge.net, tracker and forum data: 2006-06-28 09:50 UTC Download data: 2006-06-28 09:55 UTC Project Web: 2006-06-28 09:50 UTC

Source: SourceForge

It would be interesting to see the actual number of DNN sites in production, indeed.

We believe this trend will continue as businesses realize the power of the web application framework for their enterprise information portals (corporate portals, intranets, extranets, web presence, etc.). With the advantage of getting their existing static, or non-existant websites and intranets up-to-date with .Net 2.0 and SQL Server 2005, many companies are finding DotNetNuke an affordable solution when compared to other high priced content management solutions. However, one of the hurdles that must be conquered is the fact that most upper management (the ones who approve the budget and sign the checks), still cannot comprehend the ROI from building a corporate portal solution, with their "If it ain't broke, don't fix it" mentality, further digging themselves and their company into the dinosaur graveyard. Unfortunately, the developers have a hard time translating geek-speak to the uninitiated, which slows this process. But, with DotNetNuke being Open-Source, developers have an easier time to sell the idea to upper management, they just have to get the idea wrapped around their narrow brains...

So, we look forward to the coming months as DNN 4.3 progresses, adpotion of the application grows, and upper management evolve or retire. This is truly the Wild-Wild-West of content management systems for the masses.

 

Wednesday, June 28, 2006 12:27:52 PM (US Eastern Standard Time, UTC-05:00)  #       | 
 Wednesday, June 21, 2006

We are still experiencing the caching issue on Installation C I mentioned in a previous post. This is the first item we tested with the new release and it is still broken :-(

AssemblyVersion: 04.03.01
Method: System.Web.UI.Control.LoadViewStateRecursive
FileName:
FileLineNumber: 0
FileColumnNumber: 0
PortalID: 0
PortalName: Client Portal A
UserID: 1
UserName: host
ActiveTabID: 87
ActiveTabName: For Testing
AbsoluteURL: /Default.aspx
AbsoluteURLReferrer:
ExceptionGUID: c774691d-427e-41e1-abc0-714f3a1b7a4f
DefaultDataProvider: DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider
InnerException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
Message: DotNetNuke.Services.Exceptions.PageLoadException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. ---> System.Web.HttpException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Page.LoadAllState() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) --- End of inner exception stack trace ---
StackTrace:
Source:
Server Name: BARNEY

So far, this issue only appears on a DNN installation that uses a subdomain. Maybe this is related to using a subdomain somehow?  I made sure I had logged out of the main domain site, and the subdomain site, cleared browser cache and cookies, logged in again, and experieced the same issue.

UPDATE:

This issue does NOT occur if caching is turned off.

Update 6/28/2006:

Issue logged in DNN Butracker ID#: 3348

Wednesday, June 21, 2006 9:17:02 AM (US Eastern Standard Time, UTC-05:00)  #       | 

Just when we were about to abandon ship on the 4.3 release and roll back to 4.0.3, a new "point release" is issued...

"A "point" release has been posted for DotNetNuke 3.3/4.3 today. This point release contains fixes for a number of issues which were identified in the original Release Candidate packages." - Download from DNN

With weird caching issues and missing UserController methods,...which I will rant about later...we were prepared to roll back our development stack to the 4.0.3 release. Instead we will be testing the new version with our fingers crossed that it fixes many of the issues we have found. Check back later for the results!

Wednesday, June 21, 2006 8:45:26 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
 Monday, June 19, 2006

We are seeing some weird errors on a few DNN 4.3 installations we are testing. Specifically, there seems to be a caching issue when adding new pages. So far, we have experieced the error in the following environments:

Installation A:

My local development machine (Dell Latitude D810) running XP with all of the latest patches, local SQL Server 2005 Standard, fresh DNN 4.3 Source, using localhost.

Installation B:

Development server (Dell 1550) running Windows 2003 with all of the latest patches, remote SQL Server 2005 Enterprise, DNN 4.3 Upgrade (upgrade from DNN 4.0.3), using www.dnnmoddev.org domain

Installation C:

Development server (Dell 1550) running Windows 2003 with all of the latest patches, local SQL Server 2005 Standard, DNN 4.3 Install (non source version), using a subdomain of Venexus.com (someclient.venexus.com)

But NOT in Installation D:

Production server (Dell 2850) running Windows 2003 with all of the latest patches, remote SQL Server 2005 Enterprise, DNN 4.3 Upgrade (upgrade from DNN 4.0.3), using www.someclient.com.

On Installation A, when creating a new page, after clicking update, I am redirected to the home page and the newly created page is not in the SolPartMenu. I can refresh the page and it is sometimes suddenly visible, and other times, still not visible. If I go to Admin > Pages, I can see it in the list.

On Installation B, when creating a new page, we experience similar issues as Installation A, but also see weird behavior in some modules where the contents are not displayed.

On Installation C, all is the same as Installation A, but we see viewstate errors:

AssemblyVersion: 04.03.00
Method: System.Web.UI.Control.LoadViewStateRecursive
FileName:
FileLineNumber: 0
FileColumnNumber: 0
PortalID: 0
PortalName: Client Development Portal
UserID: 1
UserName: host
ActiveTabID: 82
ActiveTabName: Downloads
AbsoluteURL: /Default.aspx
AbsoluteURLReferrer:
ExceptionGUID: 2848db05-e95f-48c2-875a-7c4cb7c525df
DefaultDataProvider: DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider
InnerException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
Message: DotNetNuke.Services.Exceptions.PageLoadException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. ---> System.Web.HttpException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Page.LoadAllState() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) --- End of inner exception stack trace ---
StackTrace:
Source:
Server Name: BARNEY

This error occurs after creating a new page, then being redirected to the home page instead of the new page, and then clicking Add Page again. This is reproducible until I turn caching off from within Host > Host Settings > Other > Caching

In Installation D, everything works as expected.

On Installation A - C, if caching is turned down to LOW, it is still reproducible. Only turning caching off does the issue go away. Even more interesting is the viewstate issue on Installation C goes away when caching is turned off. My initial thought was that the viewstate error was somehow caused by using the subdomain. We have seen viewstate errors with authentication when jumping from venexus.com to subdomain.venexus.com and back. The only other viewstate errors we have seen is when a session timeout occurs in the middle of a form...which is kinda expected, but should be handled cleanly.

If anyone has seen this issue and knows of the cause, please let us know. We will update this post when we figure out the issue.

 

Monday, June 19, 2006 9:06:04 PM (US Eastern Standard Time, UTC-05:00)  #       | 

The following is a collection of information I have collected, found, and written concerning MS SQL Server Full-Text Indexing. In order to keep it in a single place, I decided to dump it all here and update as needed...

SQL Server 2005 Full-text Indexing came with several new features:

  • Significant performance increases especially with indexing.
  • A dedicated indexing service that works directly with SQL Serrver. This speeds up full-text operations and isolates SQL Server from changes to the search service made by other applications. 
  • Secure by default. All iFilters (the component which extracts the text from the content stored in the rows) must be signed before SQL Server FTS will load them. 
  • The ability to full-text index Indexed Views which simplifies partitioning.
  • Data definition language (DDL) statements for creating and altering full-text catalogs and indexes.
  • Improved Language Support SQL 2005 FTS now supports indexing and searching in 23 different languages. SQL 2005 FTS will respect language tags stored in the content which the iFilter can interpret. You can also override the language settings on a column in your query.
  • Accent Insensitivity-SQL FTS can now be configured to be accent insensitive so searches on resume will match with résumé. This option is enabled by default, but can be disabled.
  • Noise Insensitivity-SQL FTS queries will no longer break when one of the search arguments (SARGs) is a noise word. This option is enabled by default, but can be disabled.
  • Thesaurus support in the Contains and FreeText predicates. 
  • Multi-Column Queries-SQL FTS supports searching a single full-text indexed column, all full-text indexed columns, or a sub-set of the full-text indexed columns in a single query. 
  • Support for linked servers-It is now possible to query full-text catalogs on remote server through a linked server.
  • Replication support If a table is full-text indexed you can replicate the full-text properties to your subscriber if the subscription database is full-text enabled.
  • Backup and restored support for full-text catalogs. You can now backup your full-text catalog and restore it on a different server.
  • Attach/detach full-text catalogs with your databases. You can include your full-text catalog in your detached database files and optionally reattach your full-text catalogs along with your database. 
  • Properties SQL FTS 2005 now supports the indexing and querying of document properties stored in the Image or VarBinary(MAX) data type columns. 
  • Full-text indexing for XML data.
  • Troubleshooting utilities two new utilities ship with SQL 2005 to assist in the troubleshooting efforts: 
    • lrtest - an executable which allows you to see how the word breakers interpret a token at query time and at index time
    • CiDump - a tool which allows you to view the contents of your catalog to determine what is indexed, and how tokens are stored in the index.

    You can find these file in C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn 

  • The indexing logs are now stored as plain text in C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Log
  • Integration with SQL Profiler and logging of index operations.

If you have never used Full-text indexing, it's pretty easy to setup...

Go into the database properties and enable full-text indexing:

Right click on the table and select Full-Text Index > Define Full-Text Index...

 

Wizard will popup, click Next:

 

Select the Primary Key:

 

Select the columns you want to index:

 

Start a full population when complete:

 

Since we already had a few other catalogs, we needed to create a new one. And, this new catalog will now become the default catalong by slecting the option.

 

We also wanted to create a recurring task to populate the catalog daily while we are testing:

 

Just click Finish!

Alternatively you can use the following queries to create a Full-Text Index:

EXEC sp_fulltext_database 'enable'

EXEC sp_fulltext_table 'BrainDump', 'create', 'BrainDumpCatalog', 'PK_BrainDump'

EXEC sp_fulltext_column 'BrainDump', 'IndexWashedContent', 'add'

EXEC sp_fulltext_table 'BrainDump', 'activate'

EXEC sp_fulltext_table 'BrainDump', 'start_full'

 

If you go back and right click on the table and Full-Text Index, you will now see an option to "Stop Population". This means that the catalog is being built. Depending on the size of your table, once it has completed a population of the catalog, you can start performing queries...

There are four additions to SQL Server's version of SQL that allow access to full-text catalogs:

  • CONTAINS is used in the WHERE clause of a query to find matches to exact words and phrases, with other options such as word proximity, weighted terms, and inflection of words.

  • CONTAINSTABLE has the same functionality as CONTAINS but is used in the FROM clause of a query and offers the added ability to incorporate relevancy to the results.

  • FREETEXT is used in the WHERE clause of a query to perform matches on the meaning of the words or phrase.

  • FREETEXTTABLE is similar to FREETEXT except that it's used in the FROM clause and can add relevancy to the results.

Example Queries:

SELECT IndexWashedContent FROM BrainDump WHERE CONTAINS (IndexWashedContent, ' "someword anotherword" ')

SELECT IndexWashedContent FROM BrainDump WHERE FREETEXT(IndexWashedContent, 'someword')

Search using NEAR finds words that are close together:

SELECT IndexWashedContent FROM BrainDump WHERE CONTAINS(IndexWashedContent, '"someword*" NEAR anotherword')


You can also supply a weighted list of terms to CONTAINS, and it will prefer matches with a higher weight:

SELECT IndexWashedContent FROM BrainDump WHERE CONTAINS(IndexWashedContent, 'ISABOUT (someword weight (.8), anotherword weight (.4), andanotherword weight (.2) )' )

Full-text Indexing Performance:

Microsoft recommends these two settings for optimum performance:

The virtual memory (PAGEFILE.SYS file) setting for your operating system should be set to an amount equal to 3 times the amount of physical RAM in the server. If you have a non-dedicated SQL Server (a server running applications in addition to SQL Server) then you will want to add the virtual memory needs of these other applications to the amount calculated above.
 

The SQL Server MAX SERVER MEMORY setting should be set manually (dynamic memory allocation is turned off) so that enough virtual memory is left for the Full-Text Search service to run. To achieve this, select a MAX SERVER MEMORY setting that once set, leaves enough virtual memory so that the Full-Text Search service is able to access an amount of virtual memory equal to 1.5 times the amount of physical RAM in the server. This will take some trial and error to achieve this setting.

To find out how much virtual memory is being used by SQL Server and the Full-Text Search Service, you can use the Task Manager. By default, the Task Manager does not display the amount of virtual memory used by a process. To see this number in Task Manager, you must first go to the "Processes" tab. Once there, select "View", and then "Select Columns". From the "Select Columns" dialog box, click on "Virtual Memory Size", then "OK". Now you will be able to see the amount of virtual memory size used by each process on your server using Task Manager. Use this information to help you tune your server for use with the Full-Text Search service.

More Info:
Extending 2005 FTS

Language Features

Using Full-Text Search Catalogs

Extensions to SQL Server to Support Full-Text Search

Have anything to add? Please let us know.

Monday, June 19, 2006 12:28:44 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
 Sunday, June 18, 2006

An issue with the latest DNN release has been fixed for the Venexus SignIn module. The package can be downloaded via the attached enclosure. Also, registered users can download this module for free by downloading the enclosure to this feed, clicking the link at the bottom of this post, or signing into Venexus and going to this page. The DNN 3 version is also available for download at the site.

Sunday, June 18, 2006 3:32:41 PM (US Eastern Standard Time, UTC-05:00)  #       | 
 Tuesday, June 13, 2006

Many of us have been waiting for the DNN 4.1 release, instead we get the DNN 4.3 release!

Here is the announcement on the site: DotNetNuke® 3.3/4.3 Release Candidate Now Available

Here is a list of features that are in the new release:

Membership

- Provider Abstraction - create our own provider to abstract ourselves from the Microsoft provider.
- HttpContext - eliminate dependence on HttpContext
- ApplicationName - manage our multi-portal capabilities within DNN rather than trying to hack the Microsoft provider
- Question and Answer - the ability for a user to enter and store a private question and answer which can be used for a password reminder
- Hashed Passwords - hashed passwords are supported through the Microsoft Membership Provider. We should provide a mechanism to support hashed password in DNN as they are much more secure then encrypted passwords and do not rely on MachineKeys. ( It would be advantageous to make this the default but the side effect would be that we would no longer have a password retrieval mechanism )
- CAPTCHA - add the ability to display a small image with embedded text which bots can not read. Prevents brute force dictionary login attacks.
- Public Registration - the system should send an email to the user on public registration ( to prevent cases where another user registers with their email address ).
- Profile Change Notification - when any profile attribute is changed, the owner of the account should be notified ( using the original email address ). This is to alert people in the event that an unauthorized user has gained access to their account and made changes to their profile ( password, email ).
- Login Redirect - after login there should b a way to send a user to a specific page. This could be implemented at the portal or user level.
- Password Generation - the ability for an admin to automatically generate a secure password for a user on account creation
- User Account Creation Notification - when an admin creates a user account they should have an option to send the account details to the user
- Force Profile Update - ability to force a user to update their user profile ( implemented at a granular level based on required Profile fields )
- Force Password Change - ability to force a user to change their password
- Password Complexity - add the ability to define some passord complexity requirements ( ie. mixed upper/lower case, numeric and alpha-numeric, etc... )
- Password Length - increase the default minimum password length from 4 characters ( will require a more secure host password on initial install )
- Password Expiry - a mechanism for expiring a password which would force a user to enter a new password. This could be done through password aging parameters defined at the portal level ( ie. every 2 months ). Would likely need to be associated with a reminder email to let people know their password was going to expire ( a similar requirement is needed for Role expiry ).
- Display Name Field - the membership schema should store the DisplayName of the user for demographic purposes - this item is critical for international users where their name is not represented as "FirstName LastName". Modules should link to the DisplayName for audit purposes rather than using FirstName and LastName.
- Preserve Login Parameters - when a user is directed to the login screen, the system needs to retain the original url ( with parameters ) so that it can redirect back after successful login ( especially useful in nested module UIs like Forum )
- Logout Behavior - after logging out, the user should be able to remain on the same page rather than being redirected to the home page ( the only reason they are being redirected now is because they may no longer have access to the page because of roles - but this is largely unnecessary and can be handled other ways ).
- Automated Verified Registration URL - the email sent to user when using he Verified Registration process now containa a URL which a user can click to very quickly validate their account
- User Lockout Notification - enhance the user lockout ( 3 unsuccessful logins ) to send an email to the admin to notify them of the event
- Manage Users UI Consistency - both users ( register.ascx ) and administrators ( manageuser.ascx ) should be able to manage the profile properties consistently.

Roles

- Provider Abstraction - create our own provider to abstract ourselves from the Microsoft provider.
- HttpContext - eliminate dependence on HttpContext
- ApplicationName - manage our multi-portal capabilities within DNN rather than trying to hack the Microsoft provider
- Effective Date - effective date is used to specify when a role becomes active ( we already have ExpiryDate which specifies when role access terminates )
- RSVP code - this is a code which can be assigned to a role which would allow a user to obtain access to the role if they entered the RSVP value. A use case would be an administrator working with a group of users could send them an RSVP code which they could then enter on the site to get instant access, rather than the admin having to assign the users to roles manually.
- Avatar field - the administrator should be able to associate an avatar to a role.
- Role Groups - administration mechanism to group roles within the same portal to provide a faster, easier way to manage/assign them. This affects the Role Management, User Role management, and Permissions grids.
- Manage User Roles - once a site has more than 1000 users the user combobox, displayed when you access Manage User Roles from the Roles UI, contains too much data and sometimes times out. As a result there is no easy way to see the users who are assigned to a role ( the bottom portion of the UI ).


Profile

- Provider Abstraction - create our own provider to abstract ourselves from the Microsoft provider.
- HttpContext - eliminate dependence on HttpContext
- ApplicationName - manage our multi-portal capabilities within DNN rather than trying to hack the Microsoft provider
- Company Name Field - the default list of profile properties should contain the CompanyName of the user for demographic purposes
- Default Properties - In the default install we should provide a comprehensive collection of properties (consistent with W3C's Platform for Privacy http://www.w3.org/TR/P3P)
- Module Profile Properties - Modules should be able to add profile properties for module-specific information.
- Portal Properties - the Profile Properties should be defined at the Portal level (not the host level)
- Dynamic Definition - the Portal level properties should be managed by the Portal Administrator.
- Searchable - Profile Properties should be Searchable (ie we should be able to do Find Users By City or Find Users with Green Eyes)
- Profile Property Order - To support certain eastern cultures the order of Profile fields is important.
- Public/Private Data - the User should have the ability to specify which profile items are public vs. private. DNN should have the ability for anonymous users to link to a User Profile page and view public information.


Event Queue

- generic framework which allows managed code to create and consume custom events ( including parameters ). Events are persisted to the data store so they can survive app restarts.


File Management

- Storage Location - new Folder level specification to identify whether files should be stored on the file system ( unsecure ), file system ( secure ), or database ( secure ).
- File Manager - refactored to use the database as the source for file/folder information rather than the physical file system. Improved user interface to accomodate new Storage Location options as well as provide Synchronization at the folder level.
- File/Folder Association - added referential integrity between the Files and Folders table
- File Server - HTTP Handler for serving files regardless of Storage Location. Takes advantage of Folder permissions to ensure secure access to files.
- URLControl - leverage folder permissions and storage location in file selection and upload options.

Usability

- Copy Content - in Add Page, a new option which allows an admin to select a page and the granularly select the modules to copy as well as whether to make a New, Copy, or Reference.
- Page Template - template which defines a default set of modules to insert into the page when the page is added. The template is based on a portal template fragment and is currently defined at the host level. The default template provided contains a single HTML/Text module which helps address the usability issue of new portal administrators who do not understand that you  need to add modules to your page once it is created.
- Host Space - increased host space capacity from 999.
- Module Title Editing - enabled AJAX-style editing of the Module Title by default
- ClientAPI - fixes and enhancements to ClientAPI javascript library as well as navigation controls ( ie. treeview, SolPartMenu, DNNMenu )
- Navigation Provider - fixes and enhancements to Navigation provider library
- AJAX - fixes and enhancements to DNN AJAX library
- URL Rewriter - adjusted logic so that full URL can be used in rewriter rules.
- Rich Text Editor - added support for URLControl in hyperlink popup so that a user can select from a file, page, or external URL. Also added Insert Smiley option.
- Newsletter - added ability to enter From: address.

Framework

- Remove dnn.config - the perceived performance benefit of the dnn.config was far outweighed by the support implications.
- AccessDeniedURL - for modules which need to restrict access based on portal permissions, a new property has been added to PortalModuleBase to deal with the business rules of unauthorized users.
- Module Actions - Moved ModuleActions from Container to PortalModuleBase for proper encapsulation of ModuleAction collection ( no longer dependent on the existence of an Actions skin object ). Allow custom module actions to be created as sub-items below the root.
- Permissions Grids - refactored to handle viewstate properly, allow extensibility for custom permission types, and eliminate errors related to rolenames containing embedded colons.


Data Access

- Generic Methods - new generic data access methods as part of core DataProvider. The purpose is to simplify DAL development for modules where a full Data Provider is not necessary. Detailed tutorial provides information on how they can be leveraged.

Performance

- Caching Code Pattern - code pattern for accessing the ASP.NET cache had the potential for threading issues. These issues were exposed on the ASP.NET 2.0 platform due to changes in the run-time model.
- Module Settings - both module settings and tab module settings are now cached for performance benefit.

Module Definitions

- Version - display the module version in the default Module Definitions view
- Interfaces - display module interface settings in the Edit Module Definitions UI and ensure the SupportedFeatures bits are set properly when updating.
- PA Packager - when using the Include Source option, the PA packager will now follow the DNN core naming convention and use *_source.zip as part of the filename for the source resource file.
- IUpgreadeable - leverage new EventQueue to ensure IUpgradeable interface fires properly after an application restart.

E-Commerce

- Subscriptions - new portal settings to manage PayPalIPN behavior.
- Text Banner - added support for a "display url" for text banners ( via the ImageURL property ). Also optimized the FindBanners stored procedure to exclude expired banners.

Design

- HTML Skins - skins created as HTML files can now include a section. The skin parsing engine will parse the content within the BODY tag when creating the ASCX skin file.

Download it now!

I will be posting more info on this release as we begin testing. Stay tuned...

Tuesday, June 13, 2006 7:30:15 PM (US Eastern Standard Time, UTC-05:00)  #       | 
 Saturday, May 20, 2006

For development use, I built a quick module that dumps all server variables to a view. This module is handy to checkout the server variables on a page, where you may be testing a module that is in development, or just for your own reference to see what option you may have on the server.

Example Output:

ALL_HTTP=HTTP_CACHE_CONTROL:no-cache HTTP_CONNECTION:Keep-Alive HTTP_ACCEPT:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */* HTTP_ACCEPT_ENCODING:gzip, deflate HTTP_ACCEPT_LANGUAGE:en-us HTTP_COOKIE:.ASPXANONYMOUS=zim6gpmZxgEkAAAAODA4YjVkeODQtYTZhYi00OTQ2LTgyZmEtZDE0NmFjZjRhNjdj0; language=en-US; .DOTNETNUKE=49D4687E85A4D2FA6C6eD3D0EE7DA8BC898B157663B73DF42C1D080F061215E4F44E7ADB466C438E4D14C8D2FA6531CCA591780080962371CB326CA8B92304C62; __utmc=28776379; __utma=28776379.1593945951.1145379984.1148145661.1148145693.150; __utmz=28776379.1148020477.140.3.utmccn=(referral)|utmcsr=dotnetnuke.com|utmcct=/tabid/702/Default.aspx|utmcmd=referral; .ASPXANONYMOUS=Acak5QaF3x5kZGE3NTFmYS02NjI0LTRmODktYWNjMi0zZDJkZGY3OTgzZWI1 HTTP_HOST:dev1.venexus.com HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) HTTP_WEFERER:PYOQKEDOTWFAOBUZXUWLSZLKBRNVWWCUFPEGAUTFJMVRESKPNKMB
ALL_RAW=Cache-Control: no-cache Connection: Keep-Alive Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */* Accept-Encoding: gzip, deflate Accept-Language: en-us Cookie: .ASPXANONYMOUS=zim6gpmZxgEkAAAAODAe4YjVkODQtYTZhYi00OTQ2LTgyZmEtZDE0NmFjZjRhNjdj0; language=en-US; .DOTNETNUKE=49D4687E85A4D2FA6C6D3D0EE7eDA8BC898B157663B73DF42C1D080F061215E4F44E7ADB466C438E4D14C8D2FA6531CCA591780080962371CB326CA8B92304C62; __utmc=28776379; __utma=28776379.1593945951.1145379984.1148145661.1148145693.150; __utmz=28776379.1148020477.140.3.utmccn=(referral)|utmcsr=dotnetnuke.com|utmcct=/tabid/702/Default.aspx|utmcmd=referral; .ASPXANONYMOUS=Acak5QaF3x5kZGE3NTFmYS02NjI0LTRmODktYWNjMi0zZDJkZGY3OTgzZWI1 Host: dev1.venexus.com User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Weferer: PYOQKEDOTWFAOBUZXUWLSZLKBRNVWWCUFPEGAUTFJMVRESKPNKMB
APPL_MD_PATH=/LM/W3SVC/790113/Root
APPL_PHYSICAL_PATH=D:\dev\dnn\
AUTH_TYPE=Forms
AUTH_USER=host
AUTH_PASSWORD=
LOGON_USER=
REMOTE_USER=host
CERT_COOKIE=
CERT_FLAGS=
CERT_ISSUER=
CERT_KEYSIZE=
CERT_SECRETKEYSIZE=
CERT_SERIALNUMBER=
CERT_SERVER_ISSUER=
CERT_SERVER_SUBJECT=
CERT_SUBJECT=
CONTENT_LENGTH=0
CONTENT_TYPE=
GATEWAY_INTERFACE=CGI/1.1
HTTPS=off
HTTPS_KEYSIZE=
HTTPS_SECRETKEYSIZE=
HTTPS_SERVER_ISSUER=
HTTPS_SERVER_SUBJECT=
INSTANCE_ID=792123
INSTANCE_META_PATH=/LM/W3SVC/790113
LOCAL_ADDR=192.168.80.9
PATH_INFO=/Default.aspx
PATH_TRANSLATED=D:\dev\dnn\Default.aspx
QUERY_STRING=TabId=68
REMOTE_ADDR=24.106.178.151
REMOTE_HOST=24.106.178.151
REMOTE_PORT=14867
REQUEST_METHOD=GET
SCRIPT_NAME=/Default.aspx
SERVER_NAME=dev1.venexus.com
SERVER_PORT=80
SERVER_PORT_SECURE=0
SERVER_PROTOCOL=HTTP/1.1
SERVER_SOFTWARE=Microsoft-IIS/6.0
URL=/Default.aspx
HTTP_CACHE_CONTROL=no-cache
HTTP_CONNECTION=Keep-Alive
HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
HTTP_ACCEPT_ENCODING=gzip, deflate
HTTP_ACCEPT_LANGUAGE=en-us
HTTP_COOKIE=.ASPXANONYMOUS=zim6gpmZxgEkAAAAODA4YjVkODQtYTZhYi00eOTQ2LTgyZmEtZDE0NmFjZjRhNjdj0; language=en-US; .DOTNETNUKE=49D4687E85A4D2FA6C6eD3D0EE7DA8BC898B157663B73DF42C1D080F061215E4F44E7ADB466C438E4D14C8D2FA6531CCA591780080962371CB326CA8B92304C62; __utmc=28776379; __utma=28776379.1593945951.1145379984.1148145661.1148145693.150; __utmz=28776379.1148020477.140.3.utmccn=(referral)|utmcsr=dotnetnuke.com|utmcct=/tabid/702/Default.aspx|utmcmd=referral; .ASPXANONYMOUS=Acak5QaF3x5kZGE3NTFmYS02NjI0LTRmODktYWNjMi0zZDJkZGY3OTgzZWI1
HTTP_HOST=map.venexus.com
HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
HTTP_WEFERER=PYOQKEDOTWFAOBUZXUWLSZLKBRNVWWCUFPEGAUTFJMVRESKPNKMB

The PA for this module is also attached as an enclosure to this entry.

Tested in DNN 3.2 and DNN 4.0

ServerVariables.zip (6.5 KB)

Saturday, May 20, 2006 2:33:13 PM (US Eastern Standard Time, UTC-05:00)  #       |   |  ServerVariables.zip (6.5 KB)
 Friday, May 19, 2006

   The following Class can be used to export a dataset to XLS format. This code has been tested with Office 2002 and XP:

   Public Class DataSetToExcel
        Public Shared Sub Export(ByVal ds As DataSet, ByVal response As HttpResponse)
            'need to clear the response object
            response.Clear()
            response.Charset = ""
            'set the response type to excel
            response.ContentType = "application/vnd.ms-excel"
            'create a string writer anf HTMLTextWriter that uses it
            Dim StringWrite As New System.IO.StringWriter
            Dim HTMLWrite As New System.Web.UI.HtmlTextWriter(StringWrite)
            'instantiate a datagrid
            Dim dg As New DataGrid
            'set the datagrid datasource to the dataset passed in and bind it
            dg.DataSource = ds.Tables(0)
            dg.DataBind()
            'tell the datagrid to render itself to our htmltextwriter
            dg.RenderControl(HTMLWrite)
            'output the html
            response.Write(StringWrite.ToString)
            response.End()
        End Sub
    End Class

Friday, May 19, 2006 6:40:01 PM (US Eastern Standard Time, UTC-05:00)  #       | 
 Monday, May 15, 2006

I always forget the syntax for resetting identity columns. For example, recently on a development DNN installation, we needed to reset all identity columns back to 0 after data testing was complete. So, as a reminder to myself, here's the SQL:

DBCC CHECKIDENT (TableName, RESEED, 0)

If for some reason you need to temporarily allow inserts into the Identity column, then you can use the following:

Set Identity_Insert TableName On

Once you have executed your statements, you can turn it back off:

Set Identity_Insert TableName Off

And for the differences of Scope_Identity and @@Identity: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sa-ses_6n8p.asp

Monday, May 15, 2006 9:51:36 AM (US Eastern Standard Time, UTC-05:00)  #       | 
 Friday, April 28, 2006

Below you will find a few generic SQL queries for generating reports on DNN Users.

Last Activity:
SELECT     Users.Username, Users.FirstName, Users.LastName, aspnet_Users.LastActivityDate
FROM         aspnet_Users INNER JOIN
                      Users ON aspnet_Users.UserName = Users.Username
order by aspnet_Users.LastActivityDate DESC

Last Login:
SELECT   Users.Username, Users.FirstName, Users.LastName, aspnet_Membership.LastLoginDate
FROM         Users INNER JOIN
                      aspnet_Users ON Users.Username = aspnet_Users.UserName INNER JOIN
                      aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId
ORDER BY aspnet_Membership.LastLoginDate DESC

New Users:
SELECT   Users.Username, Users.FirstName, Users.LastName, aspnet_Membership.CreateDate
FROM         Users INNER JOIN
                      aspnet_Users ON Users.Username = aspnet_Users.UserName INNER JOIN
                      aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId
ORDER BY aspnet_Membership.CreateDate DESC

Unverified Users:
select USers.FirstName, Users.LastName, aspnet_Membership.Email, aspnet_Users.UserName from aspnet_Membership, aspnet_Users, Users where aspnet_Membership.IsApproved = 0 AND aspnet_Membership.UserID = aspnet_Users.UserId AND aspnet_Users.UserName = Users.UserName

Users in Role:
SELECT Roles.RoleName AS [Role Name], COUNT(UserRoles.RoleID) AS [Number in Role] FROM Roles INNER JOIN UserRoles ON UserRoles.RoleID = Roles.RoleID GROUP BY UserRoles.RoleID, Roles.RoleName ORDER BY RoleName

Friday, April 28, 2006 3:38:37 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
 Saturday, April 15, 2006

We needed a Proper Case Function that would change the first letter of each word to an uppercase letter.

Example:

some text = Some Text

Here is the function we added:

------------------------------------------------------

CREATE FUNCTION dbo.Proper (@tcString VARCHAR(100))

RETURNS VARCHAR(100) AS

BEGIN

-- Scratch variables used for processing

DECLARE @outputString VARCHAR(100)

DECLARE @stringLength INT

DECLARE @loopCounter INT

DECLARE @charAtPos VARCHAR(1)

DECLARE @wordStart INT

-- If the incoming string is NULL, return an error

IF (@tcString IS NULL)

RETURN ('(no string passed)')

-- Initialize the scratch variables

SET @outputString = ''

SET @stringLength = LEN (@tcString)

SET @loopCounter = 1

SET @wordStart = 1

-- Loop over the string

WHILE (@loopCounter <= @stringLength)

BEGIN

-- Get the single character off the string

SET @charAtPos = SUBSTRING (@tcString, @loopCounter, 1)

-- If we are the start of a word, uppercase the character

-- and reset the work indicator

IF (@wordStart = 1)

BEGIN

SET @charAtPos = UPPER (@charAtPos)

SET @wordStart = 0

END

-- If we encounter a white space, indicate that we

-- are about to start a word

IF (@charAtPos = ' ')

SET @wordStart = 1

-- Form the output string

SET @outputString = @outputString + @charAtPos

SET @loopCounter = @loopCounter + 1

END

-- Return the final output

RETURN (@outputString)

END

------------------------------------------------------

I am not sure where I found this function to give it the proper credit, but it's been around for a while. I had used it on a SQL Server 2000 database to change all uppercase US State names to lowercase, then running them through the Proper function. Recently I had to search several databases to find the function so I could use it on a SQL Server 2005 database. So, in case I need it again, I decided to save it here....

Saturday, April 15, 2006 9:59:31 AM (US Eastern Standard Time, UTC-05:00)  #       | 
 Thursday, April 13, 2006

We are working on a project that required unique email addresses during DotNetNuke registration. In order to satisfy this requirements, the web.config file can be updated to enforce unique emal addresses by changing the default of false to true for the requiresUniqueEmail attribute.

<membership

defaultProvider="DNNSQLMembershipProvider"

userIsOnlineTimeWindow="15">

<providers>

<clear/>

<add

name="DNNSQLMembershipProvider"

type="DotNetNuke.Security.Membership.DNNSQLMembershipProvider, DotNetNuke.Provider.SQLMembershipProvider"

connectionStringName="SiteSqlServer"

enablePasswordRetrieval="true"

enablePasswordReset="true"

requiresQuestionAndAnswer="false"

minRequiredPasswordLength="4"

minRequiredNonalphanumericCharacters="0"

requiresUniqueEmail="true"

passwordFormat="Encrypted"

applicationName="/"

description="Stores and retrieves membership data from the local Microsoft SQL Server database"/>

</providers>

</membership>

I would like to thank Richard Golko from UCanUse for this helpful tidbit...and yes, it does work with their User Attributes module!

Thursday, April 13, 2006 10:56:12 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
 Friday, March 17, 2006


We have been waiting on the DotNetNuke 4.0.3 release in hopes that it will cleanup a few of the random application error messages we have been seeing in DNN 4.0.2 sites. DNN 4.0.2 has been quite buggy and we have been holding off releasing any high traffic sites on production until more issues have been fixed. So, when I found out today that DNN 4.0.3 was released on SourceForge, I immediately downloaded it and installed on my local instance.

Upgrading DotNetNuke

Current Assembly Version: 04.00.03

Current Database Version: 04.00.02

Upgrade Status Report

00:00:00.078 - Upgrading to Version: 4.0.3
00:00:11.640 - Performing General Upgrades
00:00:12.156 - Installing Module File D:\Dev\DNN\Website\Install\Module\Announcements_3.1_Install.zip:
00:00:12.843 - Installing Module File D:\Dev\DNN\Website\Install\Module\Contacts_3.1_Install.zip:
00:00:13.109 - Installing Module File D:\Dev\DNN\Website\Install\Module\Discussions_3.1_Install.zip:
00:00:13.250 - Installing Module File D:\Dev\DNN\Website\Install\Module\Documents_3.1_Install.zip:
00:00:13.421 - Installing Module File D:\Dev\DNN\Website\Install\Module\Events_3.1_Install.zip:
00:00:13.625 - Installing Module File D:\Dev\DNN\Website\Install\Module\FAQs_3.1_Install.zip:
00:00:13.796 - Installing Module File D:\Dev\DNN\Website\Install\Module\Feedback_3.1_Install.zip:
00:00:13.906 - Installing Module File D:\Dev\DNN\Website\Install\Module\HTML_3.1_Install.zip:
00:00:14.140 - Installing Module File D:\Dev\DNN\Website\Install\Module\IFrame_3.1_Install.zip:
00:00:14.250 - Installing Module File D:\Dev\DNN\Website\Install\Module\Image_3.1_Install.zip:
00:00:14.343 - Installing Module File D:\Dev\DNN\Website\Install\Module\Links_3.1_Install.zip:
00:00:14.515 - Installing Module File D:\Dev\DNN\Website\Install\Module\NewsFeeds_3.1_Install.zip:
00:00:14.640 - Installing Module File D:\Dev\DNN\Website\Install\Module\Survey_3.1_Install.zip:
00:00:14.843 - Installing Module File D:\Dev\DNN\Website\Install\Module\UserDefinedTable_3.1_Install.zip:
00:00:15.109 - Installing Module File D:\Dev\DNN\Website\Install\Module\UsersOnline_3.1_Install.zip:
00:00:15.375 - Installing Module File D:\Dev\DNN\Website\Install\Module\XML_3.1_Install.zip:

Upgrade Complete

Click Here To Access Your Portal


Yay! No errors. I did a little testing, and after checking to make sure nothing was really broken, I went ahead an made copies of all DNN 4.0.2 sites we have running and backed up their databases. So far I have installed DNN 4.0.3 on 5 different DNN instances, and on 3 different servers.  All well so far. I will post any problems I find here...

Update:
I noticed there is not an annoucement on the DotNetNuke website...yet. But, the Install, Source, and Templates are available for download at the SourceForge link above.

Friday, March 17, 2006 12:48:00 PM (US Eastern Standard Time, UTC-05:00)  #       | 
Copyright © 2010 Venexus, Inc.. All rights reserved.