About Us

Why DotNetNukeBlogs.com? Our goal is to be the premier aggregator of DotNetNuke related materials. DotNetNukeBlogs.com was started by DotNetNuke Core Team member employee Chris Hammond with the intention to provide a place for the leaders in the DotNetNuke Community to push their content to those needing it most, the users.

If you're a DotNetNuke Expert be sure to get your feed added into our aggregate system. You can read more about us here

DotNetNuke Hosting

Hosting for this website is provided by AppliedI.Net. Be sure to visit them for all your DotNetNuke Hosting needs. 

Resources

DotNetNuke.com The DNN mothership.

Latest Community DotNetNuke Blog Posts

Engage
Thursday, May 31, 2012 12:45:00 PM

Move over Zuckerberg, every DotNetNuke client now has the power to take their site social.

Tags: new,6.2,social,social media
Views: 162 Comments: 0
The Mighty Blog
Wednesday, May 30, 2012 3:03:00 PM

Navin Nagiah and Shaun Walker

If you haven’t learned yet, the Day of DotNetNuke always has surprises that are only available to people that actually go to the event.  It’s always been my style to save the best for last in terms of announcing those surprises.  Also in that bucket is that I want for those that physically attend DotNetNuke events get the very best in value when these plans are made.  If this hasn’t taught you anything, it should teach you this…  DO NOT miss the Day of DotNetNuke.  This year, the surprise is not just one, but TWO surprises.  These surprises have been kept so quiet that that local event organizers and even people at DotNetNuke Corporation didn’t know. 

One of the many reasons that the Day of DotNetNuke is being held in Charlotte is because the enthusiasm of the Queen City DotNetNuke User Group (QCDUG), and especially the user group leaders.  This enthusiasm is seen world-wide on the various social networks on a monthly basis, but it was front and center when they brought the most attendees to DNN World 2011.  As a result, they won a DotNetNuke Corporation sponsored user group meeting including a visit by a speaker of their choice.  These folks are never ones to hold back or aim low.  They chose DNN Corp CEO, Navin Nagiah.  Navin was excited to visit the QCDUG.

DotNetNuke baseballLast month, the DNN Facebook page had some great artwork featured around the theme of baseball.  In fact, the profile avatar was a DNN-branded baseball.  Quite honestly, the number of people asking if that baseball was real and how to get one was overwhelming.  The community was incredibly fired up about the idea of having a DotNetNuke baseball.  I am not a baseball fan myself, but I am in that group of people too.

Surprise #1:  100% More Keynote Goodness

I am very excited to tell everyone that the keynote will indeed be Navin Nagiah as planned, but joining him will be Shaun Walker, the founder of DotNetNuke itself and a co-founder of DNN Corp.  This is sure to be an outstanding keynote.  Shaun always announces the super cool stuff!

Surprise #2:  Suh-weet and Unique DNN Swag!

I am not sure what I am more excited to announce, because this is pretty awesome!  Attendees at Day of DotNetNuke Charlotte 2012 will receive a DNN-branded baseball!  That’s right…  You will have your baseball, but it’s first come, first serve.  They are in limited quantity, so make sure you show up early! 

If you weren’t planning on showing up before, make plans.  Beg, borrow, and steal to make your way to Charlotte this weekend.  Well, please don’t actually do anything illegal, but do what you can to show up.  Not only will you be on the front line of learning all about the world’s only social CMS, but you will be able to network with fellow DotNetNuke users, enthusiasts, developers, designers, and more.  Learn best practices, tips, and tricks, and build long lasting and life changing relationships.  Once you get involved in the DNN community, there’s no turning back...

Views: 124 Comments: 0
ChrisHammond.com
Wednesday, May 30, 2012 12:34:52 PM

In case you missed it, DotNetNuke 6.2 was released today, check out Will Morgenweck’s blog post for more details on the release.

With some of the new features DotNetNuke 6.2 makes it easier to start to customize the listing of members on your site, and also the Profile display for users on the website. I started implementing DotNetNuke 6.2 on one of my racing websites last night (yeah, so I upgraded before the release happened, a benefit of working for the corp).

In doing so I configured the profile pages on the website to use some of the new 6.2 functionality, before I show you the code, here’s a link to my profile over there, so you can see what all I implemented. This is far from complete, plenty of more work to be done, but it provides far more information than the profiles did two days ago.

Views: 96 Comments: 0
iFinity.com.au - Bruce's Blog
Wednesday, May 30, 2012 2:34:20 AM

After a long gestation period and plenty of testing and development with experienced Catalook users, the iFinity Catalook Url Provider has been released.

This is a fully-featured Friendly Url and Url Rewriting solution for the Catalook store. It has a simple installation and configuration procedure that takes minutes to transform the Urls of your Catalook store.

This module is a plug-in to the Url Master module, and joins other Url Providers for popular core and third party modules now available for the Url Master module.

Before and After Catalook Urls

Catalook is a DotNetNuke store module known for power and flexibility in producing a fully-fledged e-commerce site.   But many people consider the Urls an area that can be improved, and that’s exactly what the Catalook Url Provider for DotNetNuke does.

The following table shows a before/after comparison of Catalook Urls.  The ‘before’ comparisons are for a standard DotNetNuke installation with the Catalook module installed on a page called ‘Store’.  The ‘after’ comparisons are with the Url Master module + Catalook Url Provider installed, including these options:

Url Master:

  • No page extensions
  • Replace spaces with ‘-‘
  • Convert to lower case

Catalook Url Provider:

  • Product Url Source : product name
  • Category Url Source : category name
  • Adv Category Url Source : category name
  • Hide page path for DNN page ‘store’

Assume in this comparison that Product Id 34 is a ‘Widget Handler’, and Standard Category Id 2 is ‘Widget Accessories’, and Advanced Category Id 9 is ‘Handlers and Accesories’.

[Sorry about the scroll – some of those old Urls sure are long]

Any existing ‘old’ style Url will be automatically redirected to the ‘new’ style Url, enforcing a canonical Url for each product and category.

The above options are easily selected by using the Catalook Url Provider configuration screen:

provider-settings

This is accessed from the Url Master Admin->Portal Urls->Module Providers section, where the provider is activated and assigned to a specific DNN Page.  There are no config files to manipulate, regex patterns to write.  Each portal in the site is handled differently, with separate settings.

Url Options for the Catalook Url Provider

There are three types of Urls that are improved by the Catalook Url Provider.

Products

You can choose between the Product Name, Product Description or the Meta Title for the product Url.   This gives a choice of ways in which to have the Urls for your products constructed, allowing for different Url strategies.

Categories

For Simple Categories, you can use either the Name or Description of the Category.  Simple Categories will automatically ‘nest’ each path if the category selection is more than one level deep.

Advanced Categories

Advanced Categories can use either the Category Name, Description or Meta Title to derive the Url.   Advanced Categories also automatically hide the /list/0 portion of the path, if it is present in the Url.

In all case a combined category/product Url will use both of the values.

Hiding the DotNetNuke Page Name

The Url Provider has an option of hiding the Page path for one DotNetNuke Page per portal.  This means that you can remove the DNN Page path from the resulting Catalook Urls.    The DNN Page path is required for the Url Master module to identify which DotNetNuke page a request is for.  Thus, all requests for pages in the site will have /pagename/ in them.  This option removes that path, and allows the category and/or the product name to be used straight from the site root.

Starting Friendly Urls from Product Id

Many established Catalook sites may not want or need to replace existing product Urls with new, Friendly Urls.  This is often the case when a large number of Urls are well established with incoming links and good search engine rankings.   The Catalook Url Provider handles this situation by allowing the Friendly Urls (and associated redirects) to apply from a certain product Id onwards. 

Getting your copy of the Catalook Url Provider

The module is now available for download from the Catalook Friendly Url Provider Product Page.   If you don’t already have the Url Master module installed, you need to download and install that first.  You can get the Url Master module from the Url Master Product Page.

Both of these modules are available as free trials.   If you wish to try them out on a live website, you can obtain a free trial licence from the licensing page.  You will need two separate trial licences – one for each module.

Once you have the module downloaded, installing is as simple as installing any DotNetNuke Extension.  Simply go to the Host->Extensions page and install the module as normal.

Once the Catalook Url Provider has been installed on your DotNetNuke site, navigate to the Admin->Portal Urls page, and configure the module from the ‘Module Providers’ tab.

For help and information, please go to the Catalook Url Provider Knowledge Base.

The Catalook Url Provider requires a minimum of DotNetNuke 5.2 and Url Master 2.5.

Have you used it?

This module is a new release, but has already been enthusiastically taken up by many Catalook store administrators.  However, most of the examples I have seen are still in development and not yet ready for public use.  If you have installed the module on a live site, please let me know via the comments and showcase your site!


More ...
Views: 60 Comments: 0
iFinity.com.au - Bruce's Blog
Tuesday, May 29, 2012 9:15:02 PM

Today is another momentous day in the history of the DotNetNuke project.   As announced in multiple places, DotNetNuke 6.2 has been officially released.

DotNetNuke 6.2 is an exciting release because of all the new functionality built into the platform.  6.0 was a momentous release for many factors, not the least the new UI and other groundwork-laying technology changes.   6.1 had plenty of new and interesting features for mobile platforms, but 6.2 is the one that really starts bringing new functionality online – functionality that gets module developers like myself pretty excited about the possibilities.

It’s easy to sound over the top about these things – but 5 years ago I was working on a project that, when complete, was functionally about the same as an out-of-the-box DotNetNuke 6.2 Community Edition install.   That project cost the investor a sum with 6 zeroes behind it, while a DotNetNuke 6.2 CE install will cost you a couple of minutes of download, install and setup time.  If only the physical world evolved at such a rate – I’d be able to download and build an open-source Ferrari in my garage in a couple of years for the price of some raw materials and busted knuckles.  Sadly I doubt that’s going to be the case but at least we can now set about building fully featured social websites in no time at all.

But the social features aren’t everything that’s new here.  One of the blocking points about DNN has been the difficulty in developing applications for other platforms (other sites, mobile platforms, desktop platforms) caused by a lack of an easy to use API to the DNN core.  I’ve had a few attempts at doing this myself but always ran into sticky problems that needed a lot of time and effort.  Well, that time and effort has been spent, and spent wisely, and there is now a DNN Services layer which you can use to not only access authenticated data from DNN, but you can also extend yourself.

But enough waxing lyrical about this revolution in social websites – this post is about compatibility with the Url Master module.

Changes in DotNetNuke 6.2 which Affect the Url Master module

There are a few changes in DNN 6.2 (unrelated to the social aspect) which affect all existing Url Master versions, prior to 2.5.3.   One of these is the change to the DNN Tabs Path, which is now calculated instead of being saved into the Tabs table.   You really don’t need to know any more than that if you’re not a developer, but it has a flow on effect.

Mostly these changes relate to new installs, and the adding of new portals to existing installations. 

Managing the upgrade to DotNetNuke 6.2 with the Url Master module

I recommend upgrading to at least Url Master version 2.5.3.4 – which is currently available from the Url Master downloads page.  This contains all the updates for DotNetNuke 6.2, plus some other bug fixes and improvements as well.  This version has been released for a several weeks and is proving to be stable.

You can check the Url Master version by going to the Host->Friendly Url Settings page and looking at the bottom of the page, which shows the version.

The upgrade procedure should be done as follows:

1) Backup your database and your current installation files.  Don’t skip this step thinking it will be ‘alright on the night’.  Just do it, OK?

2) Install the Url Master version through your host->extension as normal.

3) Do a quick test to make sure the site is still working OK with the upgraded version.

4) Do another backup

5) Proceed with the DotNetNuke upgrade.  Note: the 6.2 upgrade process requires your host username and password to complete it.  Make sure you have noted this down before starting.  If you don’t have your host password, you’ll need to get it reset before commencing the upgrade.

Found a problem?

If you find a problem with either a new DNN 6.2 install, or a DNN 6.2 upgrade, please report it in the Url Master support forum.

Other Modules

I recommend contacting the vendors of other modules to check for 6.2 compatibility if you think there may be an issue.

Shameless Plug

Do you use a Catalook store on your site?  I have released a new Url Provider for Catalook which is a plugin for the Url Master module.  See the Catalook Url Provider page for more details.


More ...
Views: 70 Comments: 0
DNNDev_Blog
Tuesday, May 29, 2012 2:11:00 PM

Hot on the heels of the 4.0 release, we've got a new feature release and patch for you: v.4.1. Here's what's new, fixed, and changed since 4.0.3:

Views: 102 Comments: 0
iFinity.com.au - Bruce's Blog
Sunday, May 27, 2012 10:36:32 PM

As DotNetNuke turns 10 years old this year, there are an increasing number of old websites out there with some very old Urls.  Sometimes these Urls are well linked and represent a significant legacy for a website that needs to be maintained.   Keeping old links working is a vital aspect of maintaining a website, as old links mean both visitors and search engine rankings. 

The very oldest DotNetNuke links are of the type /default.aspx?TabId=xx, but you don’t see too many of these around these days.   More common is the style / format of example.com/pagename/tabid/xx/default.aspx  - this was the default representation for DotNetNuke urls from about version 3 to version 4.8 (correct me if I’m wrong here, working from memory!).

Now, the Url Master module is very good at redirecting these old style Urls to newer, more human friendly versions.   It simply matches the TabId contained in the Url (say, TabId/89) and then looks up the ‘correct’ Url for TabId 89 and redirects the request to the newer Url.    This is as simple as activating the option called ‘301 Redirect and ‘old’ style Urls to the newer, Friendly Urls?’.   By checking this box and saving the changes, all this is handled for you.

However, there is one area where this approach falls down.   That is where the TabId in the Url to be redirect no longer exists.

The case of Orphaned Tab Urls

The Url Master module handles the case where a tab is deleted (but still remains in the ‘recycle bin’) by either allowing a 404 or a 301 redirect to the home page to be returned.  So far, so good.     However, when a tab has been ‘hard deleted’ – meaning the record no longer exists – then the Url Master module can’t work out what the ‘redirect to’ Url should be (as there is no equivalent).  

On an old site, this tends to happen frequently as people go through and manage and prune content, often leaving dead links either internally or out on the internet.

These will often be in the format of example.com/pagename/tabid/789/default.aspx – assuming that TabId 789 has long been deleted by a content manager.

A request for a Tab that doesn’t exist anymore is allowed to process as before, and generally results in a 200 being returned, for the home page of the site.  This is because the Url gets rewritten to /default.aspx?TabId=789 (using the above example) and DNN, if it doesn’t find a matching tab, just returns the /default.aspx page, which, by design, returns the home page of the site.

In order to handle a request like this, the administrator of a site with an orphaned Url needs to set up an explicit redirect for it.  This means identifying another page in the site that the visitor should be forwarded to if they request or follow that Url.

Redirecting Orphaned Tab Urls in Url Master

The first thing to do is to enter a redirect for the Url.   This is straightforward – just go to the Admin->Portal Urls page, and select the page you wish to redirect the Url to.

Then, click on the ‘Add New Url’ button at the bottom of the page.

add-new-url-redirect-large

Above : adding the redirect.

The Redirect format you should enter is the pagename/tabid/789/default.  Note that the module will automatically remove the .aspx from the end if you add it.  This is because it always adds the .aspx to the end by default when processing the urls, and in doing so, avoids a case where you end up with .aspx.aspx as the extension on the redirect.

With the above redirect entered, it should just be a case of requesting the /pagename/tabid/789/default.aspx and being redriected to /our-services.

But there’s a wrinkle in that.

In a case of chicken-and-egg programming, the Url Master module looks for the classic DNN pattern of something/tabid/xx/ in the Urls, and, if found, routes the Url through the siteurls.config file.  By doing this, it avoids matching requests where the /pagename/ part of the Url has been re-used somewhere else.   So if you try and match the path, you end up with problems redirecting Urls where the pagename has been re-used.  If you match on the tabid, you end up with no matching tabs and thus no redirect because the current path can’t be determined.

(Trust me on this, a lot of hours and neurons have been dedicated to working this out*)

Pre-identifying the Orphaned Tabs for Separate Treatment

To short-circuit this circular problem, there is a regex pattern in the ‘regex settings’ of the module.  This is called the ‘useSiteUrlsRegex’.

This pattern is checked against any requested Urls.  If it matches, the Urls are first evaluated against the set of rules in the siteurls.config file, which contains the rules to process the /tabid/xx style Urls.

By default (as of writing this entry) the regex pattern looks like this: (warning : scary regex ahead!)

/rss\.aspx|Telerik.RadUploadProgressHandler\.ashx|BannerClickThrough\.aspx|(?:/[^/]+)*/Tabid/\d+/.*default\.aspx

Without scaring the horses, this pattern simply looks for the /tabid/xx pattern (as well as the rss and some telerik + banner Urls) and sends them through the siteurls.config rules first.

Here’s where the difficulty lies : this pattern matches the Url we’re trying to redirect.  This means that /tabid/789 is rewritten to /default.aspx?tabid=789.   That’s all fine, except that TabId 789 no longer exists.  So the Url Master module can’t determine where to redirect, and no redirect happens.

But wait!  Didn’t we already add in a Url to match this and redirect to ‘our-services’?  Yes, that did happen, but once a match was found in the siteurls.config, that logic was no longer checked.  This has to do with creating an efficient code path through the module which runs as little code as possible.  It would be easy to just brute force these things and check out every last possible combination for a url – but you’d end up with a slow-running resource hog for a Url Rewriter, and that would officially  be _a bad thing_.

So what we need is a way to say : look, when you find ‘/tabid/789’, don’t use the siteurls.config rules – pass it on in the code and check it against the list of redircts.

And the way we tell that to the module is to modify the ‘useSiteUrlsRegex’ pattern.  In this case we want to modify the regex pattern to say ‘match all the /tabid/xx patterns, except for the ones looking for tabid 789.

This is pretty easy to do, and the results are below:

/rss\.aspx|Telerik.RadUploadProgressHandler\.ashx|BannerClickThrough\.aspx|(?!.*/tabid/789/.*)(?:/[^/]+)*/Tabid/\d+/.*default\.aspx

What this basically says is ‘find anything matching the /tabid/xx pattern, except if it is /tabid/789’

When this is applied, the code no longer matches in the siteurls.config file, and the urls go on to find the matching redirect already added, and the redirect is completed.  Too easy!

Summing Up

Here’s the basic steps to follow:

1.  Select the page you want to redirect to

2. Add in the Url, in the form of /pagename/tabid/xx/default (if the Url you’re redirecting doesn’t include the pagename, add as tabid/xx/default)

3. Modify the ‘useSiteUrlsRegex’ patten in the ‘Regex Settings’ section, by copying this pattern, changing ‘789’ to whatever tabid you need:

/rss\.aspx|Telerik.RadUploadProgressHandler\.ashx|BannerClickThrough\.aspx|(?!.*/tabid/789/.*)(?:/[^/]+)*/Tabid/\d+/.*default\.aspx

4. Save the changes.  It should start now redirecting as required.

If you have more than one tab to redirect, you can use the pattern as follows:

/rss\.aspx|Telerik.RadUploadProgressHandler\.ashx|BannerClickThrough\.aspx|(?!.*/tabid/(789|969|125)/.*)(?:/[^/]+)*/Tabid/\d+/.*default\.aspx

Where 789, 969 and 125 are all TabIds that no longer exist, and that you wish to redirect.

*Extra Supplementary Section

Now a good debate to be had is to what to do with TabId requests for tabs that no longer exist.  Plenty of people have made the case to me that a request for a no-longer existing tab should result in a 404, or an automatic redirect to somewhere.   I can see all sides of this argument – those with a serious SEO bent believe that no Url should end up where it shouldn’t be.   Those of a serious ‘clean data’ persuasion are horrified of any invalid Url that doesn’t return a 404.  Those with a ‘let it be’ approach would rather the visitor ends up somewhere – anywhere – rather than being redirected or, worse, 404’d. 

My approach on all these issues is always to let the user decide.  I probably lean towards the ‘let it be’ approach in that it’s better to do little harm when slightly-askew Urls arrive.  If you need to handle specific Urls that should be redirected or returned as 404, then provide the tools to do so, but don’t automatically assume one of these responses.    There’s probably a good case for the DotNetNuke platform itself to have an option on what to do with orphaned TabIds, but it’s one of those nuanced arguments where there is no perfect answer, just the messiness of reality.


More ...
Views: 116 Comments: 0
iFinity.com.au - Bruce's Blog
Wednesday, May 23, 2012 6:46:55 AM

Ever since I went to a full dedicated server for my websites a little over 6 months ago, I’ve had zero problems.   Zero as in none.  100% uptime for months on end.  This has been great, so good in fact that I almost forgot what it was like doing battle with shared hosting services.  If you’re at the point where you are questioning whether to go from shared services to a dedicated server (and by this I mean shared as in VPS or shared as in ‘all on one server’) – do it now.  Even though it costs a little bit more, the savings in less downtime more than offset the difference.

But all good things come to an end, and about 12 hours ago, my site started going up and down like a yo-yo.   Once all the usual suspects have been sorted out (did I forget to renew the domain?) it became clear that this was a software issue on the server itself.

If you use DotNetNuke as your platform of choice, and you’re faced with this situation, the first place to always go and look is the DotNetNuke scheduler.

This is a great piece of software that allows even people on shared hosting to run scheduled services.  I posted a couple of weeks back the horror of having to work with a web platform that doesn’t have something like this built in. 

But with great power comes the possibility of bad things happening.  And so it can with the scheduler.

The problem with all scheduled services (and by this I mean the universe of unattended software, not restricted to any one platform) is that they can go rogue.  By rogue I mean consuming all of the resources of the host machine, and generally causing crashing and destruction.

And so it goes that this would appear to be the cause in this case.

This blog post is going to be about the troubleshooting process that I went through, to solve this problem.  Why post this?  So that others, if they find themselves in the same situation, might find the information and manage to solve the problem themselves. 

Finding out what is wrong with your non-responsive DotNetNuke website

The first thing to do is get the server to the point where you can actually access it. Sometimes this might require a reboot – if so, get that done.

If you can get a remote desktop connection to the server, or even just a remote Sql Server connection, get that going.

If you can get an FTP connection going to the server, upload an ‘app_offline.html’ file to the website root.  This essentially shuts down further traffic to the site.  See here for more information about app_offline.htm.  The first thing to do is to stop the server crashing again.

Once you’ve got the ability to look at your DNN install, try and ascertain the size of both the ScheduleHistory and EventLog tables.   If these are large, you’ve probably identified your problem.

In my case the ScheduleHistory table had grown to over 4 million rows.  Yikes.  Now that’s a problem.  It should be in the thousands, not the millions.  Note there is no exactly correct number, because the number depends on traffic and how many scheduled items you have, as well as how many errors you get.

When your ScheduleHistory or EventLog tables grow to this size, they basically can’t be deleted properly, because deleting that amount of data from the tables fills up the transaction logs in your database.   The DNN Scheduler has two tasks in it, one which deletes excess rows from the SiteLog table, and one which deletes excess rows from the ScheduleHistory table.   And when you try and run a backup on that size of data, the backup can take forever and also consume too much CPU and memory.  Result : dead server.  The Scheduled task can’t delete the rows, and it kills the server stone dead while trying to.  It’s in a death spiral, and the only solution is to clean out those tables.

But before you do that, you need to know what is causing the error.  If you’ve got a Sql Connection, I recommend selecting the top 50 or so rows from both the ScheduleHistory and the EventLog tables.

The commands are these:

select top 50 * from dnn_EventLog order by LogCreateDate Desc
select top 50 * from dnn_ScheduleHistory order by startDate Desc

Note: dont’ do a ‘select *’ from these tables, or you’ll just cause more grief.  It’s imperative to limit the size of the result set.

When doing this, I recommend copy/pasting the ‘LogProperties’ column of the EventLog table into a text file, and renaming it something like ‘errors.xml’ in your local machine (put it in a temp directory).  Then open that file by double clicking on it – this will open up the xml output in a browser window.  Reading raw XML with no formatting is an exercise in generating headaches, so I recommend doing it this way to save you grief.  You can copy/paste the LogProperties from multiple rows into the one Xml file, and have a way of viewing a selection of the errors.

Of course, if you can still actually log onto your server and view the Admin –> Log Viewer page, then do it that way!

The Discovered Issue - PurgeModuleCache Failure

What I found from all of this was this error appearing over and over again:

5/22/2012 8:24:12 PM

Scheduler Event Failure

THREAD ID 20 TYPE DotNetNuke.Services.ModuleCache.PurgeModuleCache EXCEPTI

THREAD ID: 20

TYPE: DotNetNuke.Services.ModuleCache.PurgeModuleCache

EXCEPTION: String was not recognized as a valid DateTime.

RESCHEDULED FOR: 5/22/2012 8:24:42 PM

SOURCE: STARTED_FROM_BEGIN_REQUEST

ACTIVE THREADS: -1

FREE THREADS: 2

READER TIMEOUTS: 0

WRITER TIMEOUTS: 0

IN PROGRESS: 0

IN QUEUE: 9

Just below it, in every case, were two other exceptions, which looked like this:

DefaultDataProvider: DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider

ExceptionGUID: 5965365b-9f4c-40ab-b3fc-1b3268ded02e

InnerException: String was not recognized as a valid DateTime.

FileName:

FileLineNumber: 0

FileColumnNumber: 0

Method: System.DateTimeParse.Parse

StackTrace:

Message: System.FormatException: String was not recognized as a valid DateTime. at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) at DotNetNuke.Services.ModuleCache.FileProvider.IsFileExpired(String file) at DotNetNuke.Services.ModuleCache.FileProvider.PurgeExpiredItems(Int32 portalId) at DotNetNuke.Services.ModuleCache.PurgeModuleCache.DoWork()

So, from this it was pretty obvious that the ‘Purge Module Cache’ scheduled task was failing every time it ran.  Each time it failed,  it added 3 exceptions to the event log, and another two entries to the ScheduleHistory table.    Eventually so many errors are logged that the PurgeHistoryLog scheduled items start failing as well, which then sets off a snowball effect, the end result of which is an unresponsive server.

Now, in my particular case I just happen to have a copy of the source code of the particular DNN version I was running (6.0.1, as it happened to be).   So I went into the DotNetNuke.Services.ModuleCache.FileProvider.IsFileExpired source, and took a look at what was there:

        private bool IsFileExpired(string file)
        {
            StreamReader oRead = null;
            try
            {
                oRead = File.OpenText(file);
                DateTime expires = DateTime.Parse(oRead.ReadLine(), CultureInfo.InvariantCulture);
                if (expires < DateTime.UtcNow)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            finally
            {
                if (oRead != null)
                {
                    oRead.Close();
                }
            }
        }

Straight away, I could see that there was a looming bug in this code - there is no handled exception if the first line of the read file doesn't contain a valid date.

So, next thing to do was to check the source code of the latest version of DotNetNuke available (6.1.5 at time of writing).

        private bool IsFileExpired(string file)
        {
            StreamReader oRead = null;
            try
            {
                oRead = File.OpenText(file);
                DateTime expires = DateTime.Parse(oRead.ReadLine(), CultureInfo.InvariantCulture);
                if (expires < DateTime.UtcNow)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
	    catch
  	    {
	        //if check expire time failed, then force to expire the cache.
		return true;
	    }
            finally
            {
                if (oRead != null)
                {
                    oRead.Close();
                }
            }
        }

Here we can see that the bug has been fixed - there is now a catch statement to catch an exception if the file doesn't exist, can't be read or doesn't include a valid date/time.

The Easy Fix!

Once you have worked out what the problem is, then you no longer need the records in the EventLog or ScheduleHistory tables. But you can't just delete them - deleting records puts them into the transaction log file of the database, so the deletes could be reversed if necessary to rollback the database. This is what causes half the problems in the first place. Instead you need to Truncate the tables. In Sql Server, 'Truncate' is the command used to delete the rows from the table and don't bother with adding them to the transaction log. Think of it like deleting something from your computer and not putting it in the recycle bin.

The commands for this are:
truncate table ScheduleHistory
truncate table EventLog

Now you've identified the error, cleaned out the oversized database tables, but you still haven't fixed the original problem.

At this point, it's obvious that the correct solution is to upgrade DotNetNuke to the latest version. So that's what I did. Problem solved - no more logs filled up with errors, site not crashing, everyone happy. All that was needed was to delete the app_offline file, and let visitors back onto the site.

Thanks goes to Antony Slater of WEBPC for both the server and the useful help in determining the problem.

Summary

If you face a problem like this:

  • 1. Stop it from happening by restarting your server if possible, and upload an 'app_offline.htm' to your site
  • 2. Ascertain it if is a schedule / event log oversize table related issue
  • 3. Assuming (2) above is the correct diagnosis, work out what is filling the log and/or schedule history
  • 4. Fix whatever that problem is (in this case, fixed by upgrading DNN to the latest version)
  • 5. Truncate any oversized database tables
  • 6. Remove the app_offline.htm file again
  • 7. Closely monitor the server to make sure it's running OK again

More ...
Views: 160 Comments: 0
ChrisHammond.com
Tuesday, May 22, 2012 1:31:59 AM

I am proud to announce that we have officially renamed Team Ride With Chris, to Team ITM America, for our ride at the Team LIVESTRONG Challenge Davis, this June 24th, in Davis, California. You can continue to donate to the individuals on the team via the team page.

We have been looking for a new team name for a while now, and were approached by ITM Consulting out of Germany about helping to promote their new brand being launched in the United States later this summer, ITM America (www.itm-america.com)

ITM has stepped up with a large donation to the team, and has currently put us into the top 20 teams in terms of fundraising for the LIVESTRONG Challenge Davis.

I have known the folks at ITM for a couple of years now through the DotNetNuke ecosystem. They provide a wide array of IT services, including DNN integration with SAP and mobile solutions, custom module development and workflow implementations, and providing security assessments and risk abatement.

Stay tuned for more information from ITM America on their website, www.itm-america.com, while they get things together over there you’ll find a picture of Natalie and myself at a recent bike ride we did in Santa Rosa, California.

As part of the agreement we will be sporting brand new “kits” for the ride in Davis. Check out these fly threads!

image

Views: 286 Comments: 0
Engage
Monday, May 21, 2012 5:26:00 PM

Join Brian, Jason, Oliver, and myself for this year's FREE Day of DotNetNuke in beautiful Charlotte, NC. Enjoy a full day of sessions packed with tips and techniques from DotNetNuke core team members, community members, and industry experts. This year's theme is "DotNetNuke Goes Social," and many of the session tracks will focus on the features of the latest release of the DotNetNuke application, version 6.2.

Views: 136 Comments: 0
DotNetNukeFool
Sunday, May 20, 2012 9:13:22 PM

What was once a community event started by the honorable and great Will Strohl in Tampa Florida a few years ago…DayofDNN has grown into an ongoing series of events where the brightest minds in the DotNetNuke community gather to discuss all things DNN. Here are 10 great reasons to attend this year’s event in Charlotte NC on June 2nd 2012.

Views: 256 Comments: 0
TressleWorks
Wednesday, May 16, 2012 6:49:00 PM

While I completely agree with the recent focus of DotNetNuke on the Cloud, Mobile and Social aspects of DotNetNuke V6 as a way to increase the adoption of the product, I believe there is an alternative focus that the more technical among us can consider. This “other” focus is centered on strategic changes to the framework of DotNetNuke – the underlying bones.

For many years, DotNetNuke was referred to as the DotNetNuke Framework that supported the creation of a Content Management System. For end-users, the term framework was lost – DotNetNuke was a Content Management System. However, that framework provided a standardized way to build web pages with a defined plug-in infrastructure, security and underlying database. Over the years the framework aspect of the product(s) has been down played.

More...
Views: 546 Comments: 0
DNNDev_Blog
Friday, May 11, 2012 1:24:00 PM

One of the un-sung heroes of the 3.0 release of XMod Pro was the Feeds feature. Sure you could use it to create CSV and Excel spreadsheet downloads for your DotNetNuke site. You could create RSS or customer XML feeds. You could even use a feed to display a printer-friendly HTML page that pops-up outside the DNN skin. Beginning in version 4, we’ve made leveraging feeds easier and more powerful than ever

Views: 204 Comments: 0
DNNDev_Blog
Wednesday, May 09, 2012 1:51:00 PM

XMod Pro 4 is packed with new features. Among them is a brand new ability to leverage the customizable, highly flexible forms of XMod Pro to create a custom login form for your DNN website.

Views: 178 Comments: 0
DNNDev_Blog
Tuesday, May 08, 2012 12:12:00 PM

XMod Pro makes it a pretty painless process to add, edit, delete, and view your data in a DotNetNuke website. However, until XMod Pro 4, you couldn't integrate that data with the built in site-wide search DNN offers. Now you can.

Views: 158 Comments: 0
The Mighty Blog
Monday, May 07, 2012 12:32:26 PM

Writing a Blog

Since WillStrohl.com has been up and running, its primary function or purpose has been to host my personal blog about many things, but mostly DotNetNuke.  During this time, it has always run on the “core” Blog Module.  Say what you want about the core blog module, but it has always been a very functional way to build and maintain a blog presence on DNN.  There has always been a way to accomplish anything you wanted using it, whether it was adding other modules to the page, adjusting the design, or simply recompiling the module with any adjustments I’ve needed.  I’ve traditionally had time to do this, all with the intention of helping to make the blog module a better module.  Though, I recently changed blog modules, and that’s what this article is about.

Disclaimer:  First, I work for DotNetNuke Corporation, if you didn’t already know.  So, even though I have it posted everywhere, I should mention that this blog entry contains comments and opinions that are my own, and have no endorsement whatsoever from DNN Corp.  Second, I am doing a thorough write-up of my experience with a specific blog module.  While I feel that I have tried to not make this come off as an advertisement, I want you to know outright that I am not advertising for them. 

The “core” blog module has had a very exciting, long, fun, and rough past.  At some points it was simply misunderstood.  Other times it was missing features.  And yet other times, it was laying dormant, waiting someone to give it some long overdue TLC (tender loving care).  Such is the nature of a purely open source project.  It’s always at the mercy of those that hopefully have the necessary time needed to keep it updated.  I’ve always been very patient with the module myself because I love doing things with “core” modules first before going to the ecosystem.  After all, how else can the project know where and how to proceed if people are not using it and offering feedback, requests, fixes, code, and more?

Well, these days I have much less time to dedicate to helping that project than I used to.  I mean, I already run or contribute to more than 15 other projects on CodePlex.  This entire time I was basically working on a fork of the blog module anyway, since I had some specific requirements (or ideas) about how I best wanted my blog to do things on my site.  After all, this is one of the many benefits of using an open source module to begin with.  Unfortunately for the module itself, I needed to take that off of my plate, so the search for other blog modules began…

The Blog Selection Process

The DotNetNuke ecosystem has several modules that are either built to support blogging, or can be configured to support a blog.  Whether it comes from the Store or the Forge, you’re given many quality options.  Among them are some really great choices, and even some very flexible ones that aren’t a blog out-of-the-box, but can be after some configuration (some requiring more configuration than others). 

Mandeeps SoftwareAfter a bit of research, I decided to use Live Blog by Mandeeps.  Mandeep Singh heads up Mandeeps, has long been in the DotNetNuke community, and their solutions have always had a positive reputation during this time.  All of their modules have regular releases and very responsive support.  I tested this through the Store before moving forward.  This was the first step to feeling better about choosing Live Blog as my solution. 

Next, with very few exceptions, all of his extensions that have been reviewed continue to have 5 star reviews.  Whether I looked there, on twitter, or in the DNN forums, Mandeeps overall has had great feedback from those that use their modules.

The final piece that really sealed the deal was that it seemed that no matter which blog solution I was coming from, Live Blog had the hardest part of the migration path already solved for me.  It would simply import all of my blog posts and comments for me, maintaining the original integrity of by blog with nearly no effort at all.  I tested this several times in a staging environment, and it always worked great!  This alone is highly impressive.

The three components mentioned above were the critical first steps in my selection process.  Mandeeps Live Blog had very responsive support, great reputation & reviews, and it allowed me to easily migrate my content to it.

My Feature Requirements

Not every blog is created equal.  Although many blogs are created or used for the same general purpose, they all have their own agendas and goals.  My main goal is SEO.  I want to make sure that by blog entries can be found by people, regardless to whether those people were coming from Google, Bing, or {Gasp!} Yahoo.  Yes.  Yahoo is still around.  ;)

Since my main goal was SEO, I needed a solution that practiced some very specific key things in order to not hurt whatever goodness my SEO had already attained.  I needed H1’s and H2’s in the right places, great looking page titles and URLs, categories with friendly URLs, site maps, and so on.  Live Blog has all of these features and more. 

Comments are important to any blog.  I have wanted to transition to use Disqus for my blog comments for a long time because their comment engine is unmatched in capabilities and stickiness.  Unfortunately, I’ve either been too busy or too lazy to write the code to export my comments using their WP standard.  There were two great things about Live Blog in this area…  First, it already has them implemented as a forward only feature.  However, a very recent release also allows you to export your existing comments to Disqus, allowing you to choose to use their comment engine at any time!  Suh-weet!

I also track my own feed status through Feedburner.  I have really grown to like this service and didn’t want to move away from it for my RSS links.  Live Blog doesn’t get in the way here at all.

The final requirement I had was to be able to make the new blog fit into my own design.  Luckily, my design isn’t terribly complicated.  Regardless though, the template feature in Live Blog makes generating your own template to suit your needs incredibly easy. 

Any Bells or Whistles?

If you’re not familiar with the term “bells and whistles,” it is simply a slang way of talking about really cool add-ons or features.  Live Blog has plenty of them. 

Beyond what I’ve already mentioned, you get some really cool things like deep Windows Live Writer integration.  You can choose your own URL structure for each new blog post.  It has an easy to use control panel-style settings view.  It will automatically “ping” some common ping services for you such as blog search and feedburner.  You can simply paste in social bookmark code from sites like AddThis or ShareThis.  It will also allow you to automatically post new blog entries to twitter, but I have to admit that I haven’t tried using this feature yet.

I am sure that you will find some other things to be your own bells and whistles, but these few things are what stood out to me.

Is It Missing Anything?

Unfortunately, like with many 3rd party extensions, Live Blog has the need to fill the use case requirements of a large range of customers, including customers on many different versions of DotNetNuke.  As a result, this prevents Live Blog from implementing newer DNN features and APIs, such as editing pop-ups, client dependency framework, integration with the taxonomy API, cloud folder providers, mobile-friendly displays, and more.  This is not a deal-breaker (yet), but it will likely be frustrating for me moving forward since I always like to be on the latest version of DotNetNuke.

Did I Have Any Problems?

First, I would like you to know that I tested this module thoroughly in a staging environment before deploying this on my own website.  And even then, I made sure to retest everything since I was on my production website.  I highly recommend that you do this as well.  You never know what might creep up as a problem if you don’t.  I was able to do this side-by-side on my production site with the core blog module still actively in use.  However, in order to test on my own site and to mitigate any need to re-sync the data, I made sure to cease any blog posts during the testing phase, and I turned off comments during this time frame as well.  This made the migration path one that only needed to be followed once.  I wouldn’t categorize this as a problem, but you definitely need to be aware of this as well.  Otherwise, you will need to manually import and new blog posts or comments when you do the same thing.

There was one specific problem.  Unfortunately, the URL structure in Live Blog did not match that of my original URLs.  This is not an uncommon issue when switching module vendors or creating a new section on your website.  In this case, the original URLs used EntryId to denote the blog id number used to generate the blog post page dynamically in DNN.  Live Blog does this same thing, but uses PostId instead.  Unfortunately, there is no way to change this in Live Blog.  Along the same lines, the imported blog content did not respect the original ID numbers.  So a blog post that was previously 123 could be another value like 119 after import.  Finally, the URLs that are generated by Live Blog follow a different set of rules when created.  Basically, this could result in a scenario where your new URLs are essentially very different from their original URLs.

Initially, I looked to IFinity’s URL Master to fix this since I use this on my site, but without a bit of development by Mandeeps, a solution wasn’t available here.  However, if you do have a vendor ready and willing to do so, Ifinity has a module provider solution that allows you as a module vendor to map and generate URLs on sites that use URL Master.

Simple Redirect Module for DotNetNukeAt the end of the day, I couldn’t use a built-in or existing feature to re-map URLs to ensure that when search engines visited or visitors clicked on existing inbound links, the visitor would not only get the content they were looking for, but they would also get the SEO-friendly HTTP 301 redirect.  So, in order to fulfill this requirement, I ended up writing a slick little module called Simple Redirect.  It’s sole purpose in life was what you just read – and, to keep things simple in doing so.

What About the Future?

One of the things I am going to miss deeply is the ability to immediately support the latest and greatest features in DotNetNuke for the reasons mentioned above.  However, the convenience of being able to not need to maintain a separate code base right now is too great to ignore.  Mandeeps has been incredibly responsive to feature requests so far though. 

Summary

So that’s it.  I wanted to have a supported blogging solution that didn’t require me to have a forked and self-maintained version of the code base to achieve my blogging platform requirements.  I also wanted to see active releases that incorporated more and more features without the need for me to merge my codebase.  In looking for possible blog solution providers that could give my site what it needed and more, I found and moved forward with Live Blog.  It was able to meet all of my needs, has great support, actively releases, and is extremely reactive to feedback.  At this point, I couldn’t be any happier with my chosen path.

Views: 646 Comments: 0
DNNDev_Blog
Monday, May 07, 2012 11:48:00 AM

XMod Pro 4 leverages jQuery in myriad ways. Some are flashy, but this small feature is so useful, I wonder why we didn't add it earlier

Views: 196 Comments: 0
Mitchel Sellers DotNetNuke Blog
Monday, May 07, 2012 2:35:00 AM
It is quite often that when working on a new version of a site that you will have a development, test, upgrade copy of the site that might be around for a while.  It is also possible that if you are working for a third-party that you might stage client sites on your server for a period of time before go-live.  At first glance this all seems common place and not something that you would be concerned about.  However, that is not the case.  Search engines have become overly aggressive in indexing sites, including those that have no direct back links but have been e-mailed to individuals or similar processes. In this post I'll discuss some important considerations when working with these "non-production" installations to help you ensure that search engines will NOT index the content and cause confusion.
Views: 658 Comments: 0
Mitchel Sellers DotNetNuke Blog
Friday, May 04, 2012 2:31:00 PM
Recently I have been getting a lot of questions regarding the DotNetNuke login and why when you go to login that "auto complete" is disabled on the username/password fields.  The typical follow-up question to that is "how can I change that behavior".  So after answering this question individually around 5-6 times I though it would be best to get this out here, at least my opinion on the issue.
Views: 724 Comments: 0
DNNDev_Blog
Friday, May 04, 2012 9:48:00 AM

DoDNN_Banner_MedOn June 2nd, DotNetNuke Corp. will be releasing DNN 6.2. I doubt the numerology is lost on anyone. This year, they've chosen to announce this new release at the Day of DotNetNuke (DoDNN) being hosted by the Charlotte DotNetNuke User Group (QCDUG).

It's not surprising the QCDUG is hosting the event this year. They're group is really gaining traction in the area and brings a lot of positive energy to the DotNetNuke community.

If you've never been to a DoDNN and you're anywhere near Charlotte, NC, you should definitely go... free sessions, free networking, and free food! It's a fabulous deal. Of course, the only way these events can be free is if they find sponsors.

I'm happy to announce the DNNDev.com is proud to support the QCDUG and DotNetNuke by sponsoring the Day of DotNetNuke. So, check it out and eat some of the food we helped pay for :)


More ...
Views: 220 Comments: 0
RSS URL