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

Charles Nurse
Friday, March 30, 2012 2:58:06 PM

DotNetNuke has a rich eco-system of Modules, both Open Source and Commercial.  In many ways this is our biggest strength as a CMS platform.  No matter what you want to do with your site – there is often a module that already does it.

In my opinion this is due to the flexibility provided by the core DotNetNuke Framework.  Many other platforms are very prescriptive – as an extension developer you have to follow a fixed shopping list of rules – there is invariably only one way to create an extension, which may not work for what you want to do. 

But DotNetNuke places very few requirements on what must be done to build an extension.  This frees developers to be creative – to think outside the box – which I feel explains the rich ecosystem of modules that already exists and continue to be developed.

I have been working as a developer on DotNetNuke for nearly 8 years now.  During that time I have built many modules for personal use as well as a number of modules that are now part of the core distributions.  In addition, I have designed and created many of the hooks in the core which Module Developers can take advantage of.

Recently, I have heard comments that “Module Development with DotNetNuke is difficult”. 

I don’t agree with this sentiment – but, I think that our strength (flexibility) that I described above is also our weakness. There are a multitude of ways to build DotNetNuke modules -  and we don’t provide a prescriptive method of development.  While this provides flexibility, it can be somewhat daunting for new DotNetNuke developers – where do I start? is a common refrain.

My goal in this series of posts is to provide some guidance – from my perspective – for both the beginner module developer and for more advanced developers, who may not be aware of all the hooks/features that DotNetNuke provides. 

This is not “The Definitive Way of Module Development” – its not even “A Definitive Way of Module Development”, but (with apologies to Frank Sinatra) it is “My Way”.

Views: 358 Comments: 0
iFinity.com.au - Bruce's Blog
Friday, March 30, 2012 6:23:21 AM

Just last week I did a presentation to the South East Queensland DotNetNuke User Group, on the topic of ‘What’s new in DotNetNuke 6.2’.

The slides from this presentation are shown below:

About the User Group Meeting

This was a very fun event – generously sponsored by Power DNN Australia and held in South Brisbane.  Unfortunately we were in the grip of one of the worst rain events in recent history – while I was presenting, over 370mm of rain fell on my house – that’s 14 inches of rain - in the space of a few hours, which caused widespread flooding.  It wasn’t as bad in Brisbane where I was giving the presentation, but the weather was foul enough to keep a few people away.

The next SEQDUG meeting is already in planning – make sure you join the Linked In Group to be a part of the DotNetNuke scene in my part of the world!

About the Presentation

The two main areas that my presentation covered were the changes in DotNetNuke 6.2 that people are most interested in – these being the Social Networking features and the Services Layer that powers them (and will be available to all developers to utilise).

Earlier this week, Scott Schlesier posted a timely blog entry entitled DotNetNuke Services Framework - a little context.  This expands further on the brief introduction to the services layer that is in the linked presentation above.  I highly suggest any DotNetNuke developer reads it to get more information on what will be one of the biggest revolutions in DotNetNuke history.

I’ll be having a lot more to say about 6.2 in the coming months, so stay tuned for updates!


More ...
Views: 490 Comments: 0
Day of DotNetNuke
Wednesday, March 28, 2012 9:04:06 PM
Views: 404 Comments: 0
The Mighty Blog
Tuesday, March 27, 2012 6:32:30 PM

Simple Redirect Module for DotNetNuke

Search engine optimization (SEO) has been on the top of most minds in the website design and development for many years now, so I won’t bore you with details about what it is and why it’s important.  At this point, that should be obvious.  However, maintaining your SEO is a never-ending challenge.  This is never more apparent than when you switch platforms on the web, no matter how big or small that platform may be.  I have recently run into such a challenge.

In case you haven’t noticed, I have switched blog modules.  This post not only introduces my newest open source module, but it also clearly outlines the use case for why I built it, and why it might be of use to you as well.  While my use case involves blog modules, this could very well relate to other types of modules like announcements, forums, and any other module that creates dynamic pages based upon content you are creating.

As of Sunday, March 25, I am now using Live Blog by Mandeeps instead of the “core” blog module.  Don’t get me wrong, the core blog module is great.  I’ve used it for many years now.  It definitely fits the needs of most bloggers and blogging websites, but I really needed more, and Live Blog offers it to me right now.  Also, the difficulties I outline are not to pick on Live Blog or Mandeeps.  Both are truly great!  What I speak about here would most likely be experienced with any software, platform, or module when making a switch that affects URLs.

URLs Changing

Anyhow, this switch of modules was really the motivating factor behind building the Simple Redirect Module for DotNetNuke.  When migrating from one module to the next, the URL structure has changed.  The change was minimal on the surface, but it certainly has the potential to have a pretty significant impact on SEO one way or the other.  It really depends on how the URLs are handled now. 

This is an example of a core blog module URL for a blog post, assuming the blog module is on a page named “Blog”: 

  • http://domain.com/Blog/EntryId/123/This-is-Your-Blog-Title-in-the-URL.aspx

The Live Blog URL is very similar, and with very few differences in creating the page name – and sometimes no differences at all:

  • http://domain.com/Blog/PostId/123/This-is-Your-Blog-Title-in-the-URL.aspx

On a site like mine, you can also pretend the page extension isn’t there as well, since I am using URL Master.

Luckily, Live Blog does an incredibly great job of importing blog posts and comments from many places, including the “core” blog module.  That feature is a life-saver!

Once again, on the surface such a transition appears to be simple.  After all, the blog posts are imported, so the URLs should match up pretty nicely.  However, on an installation of DNN where there have been multiple blogs on multiple sites and multiple test posts from applications like Windows Live Writer, there are some subtle differences.

First, some posts would not have the same “page name.”  Let’s take a title like “Simple Redirect Module 01.01.01 Released.”  The resulting page names would be slightly different for each blog module, shown below.  Also shown is an example of the blog entry ID’s being slightly off since the new entries in the database no longer have the history of having had previous blog entries that are now deleted.  Both issues are bolded to make it easier to see.

  • Core Blog:  http://domain.com/Blog/EntryId/123/Simple-Redirect-Module-for-DotNetNuke-01-01-01-Released.aspx
  • Live Blog:  http://domain.com/Blog/PostId/118/Simple-Redirect-Module-for-DotNetNuke-010101-Released.aspx

And worse… Sometimes (and this will likely be fixed by the time you use the module), you might have a URL that is truncated like seen here:

  • http://domain.com/Blog/PostId/118/Simple-Redirect-Module-for-DotNetNuke-010101-Rele.aspx

As you can see, it is not very straightforward to perform any specific rewrite rules in this scenario.  At least, not easily and not without having some more information to more easily map blog entries between the two modules.

The Solution

I tried several things before finally resorting to writing a module.  I tried to find a rewrite method in URL Master, but nothing existed without writing a provider for URL Master.  I also tried using rewrite rules in SiteUrls.config, but not being able to predict the URL pattern changes consistently meant that there would need to be a direct 1-to-1 relationship in the configuration – and such a thing would adversely impact performance on every page load on the entire site and installation of DotNetNuke.

Finally, I warmed up to the idea of building a module for this.  Enter the Simple Redirect Module for DNN. 

This module allows you to simply enter a URL that no longer exists, and map that to a URL that does exist.  Easy stuff!  In the background, the module is not only pointing visitors to the right place, but it is also performing something known as a HTTP 301 Redirect, which also notifies search engines that the new page is the right one.  This instruction results in the search engine wiping out the original URL and replacing it with the new one.

This blog actually comes to you after 3 releases of the module.  While the first version worked fine, I found some performance issues when a certain number of redirects were loaded into the module.  That was release 2.  A significant amount of caching was added to address the performance issues.  Unfortunately, I had made a mistake in the packaging of the second release, so today’s release is the recommended download.

How Did I Map The URLs?

With over 700 blog posts, it wasn’t realistic to add a redirect record for every single blog post that I have.  Instead, I used Google Webmaster Tools to identify the most popular pages on my site that were impacted by the blog module change.  I mapped a redirect entry for every page that had 10 or more direct inbound links to it from another website.  Yes, that was quite a few pages.  I could have set a different benchmark to use, but that one seemed good to me.  For the rest, I am able to submit an XML Site Map to Google Webmaster Tools for indexing.  An XML Site Map is automatically generated for you by Live Blog.

In total, I’ve spent 4-5 hours working on the module, and another ~2 hours mapping URLs.  Of course planning, testing, and implementing the blog module itself took time too.  At the end of the day, that was all time well spent to retain traffic on my site, and put my best foot forward to minimize the impact to visitors that are visiting my site.

I invite you to play with the module.  There are many different types of redirect modules out there.  This one was meant to handle a very specific use case, hence the name.  I hope you like it!

Download the Simple Redirect Module

Views: 528 Comments: 0
iFinity.com.au - Bruce's Blog
Tuesday, March 20, 2012 10:27:33 PM

One of the greatest strengths of the DotNetNuke framework is the ability to create many different websites with the one installation.   This means you only set up one IIS website, and then serve up as many individual sites from that as you like.  Personally I’ve seen DNN installs with thousands of sites, which is a bit of an eye opener if you’re used to running 2 or 3.

However, this power has a few small drawbacks, and one of the ones I’ve been mulling over for years has been the ability to serve up separate robots.txt files for separate sites in a DotNetNuke installation.

The robots.txt file is a pretty old protocol, and dates back as far as I can remember.  The basic idea behind the robots.txt file is that it tells ‘robots’ – such as search engine crawling bots – which parts of the site they can index, and which they should ignore.   While it’s a bit of a relic in that it’s a voluntary standard (those writing malicious bots for stealing content don’t exactly pay attention), all of the major search engines still read the robots.txt files, and some people still swear by their use.

What’s more, with the introduction of search engine sitemaps a few years back the use of the robots.txt file has jumped into the frame again, principally because you can list any of your search engine sitemaps within the robots.txt file.  By listing a search engine sitemap, search engines pick up the reference and will read and follow the urls laid out in the sitemap.  For more information on this, see the sitemaps.org site here : Informing search engine crawlers of search engine sitemaps.

In that linked reference, you’ll find that you should list the sitemap in the robots.txt file, like this:

Sitemap: http://www.example.com/sitemap.xml

(note: the sitemap entry is independent of the user-agent, so you can’t tell some user-agents to read it, and others not to)

So far, so good.  For DotNetNuke we drop a robots.txt file into the site root, and enter the default sitemap location, like this:

Sitemap: http://www.example.com/sitemap.aspx

But wait!  Those who have been nodding along will realise we have much more than just one domain in our site if we are running multiple sites (DNN Term: Portals) in our DotNetNuke installation.  

That’s where it starts to go wrong.  We can’t have a site (portal) specific sitemap, because there is only one site root.

Of course, it is technically allowed to do cross submits through the sitemaps protocol (see http://www.sitemaps.org/protocol.html#sitemaps_cross_submits) because you implicitly own all of the various domains.  But it’s messy and rather shatters the illusion that a DotNetNuke portal is a separate site, rather than just a data partition in an overall DotNetNuke installation.  In my experience, website owners don’t like seeing references to other sites within their own.  But this still doesn’t solve the problem of wanting to ‘lock off’ parts of a site through the robots.txt file, because that’s a site-specific action which doesn’t fit with a one-size-fits-all robots.txt file.

And that’s the problem I’ve been mulling over ever since the sitemaps protocol was updated to include the robots.txt reference.   My original thinking was to incorporate it into the Google Sitemap Provider code that I’ve had for years.  But while it was possible to do so, it required people to modify their IIS configuration to associate the .txt file extension with ASP.NET.  From my experience with helping people redirect .html, .asp and .php Urls to DotNetNuke sites with the Url Master module, I knew this would result in a lot of people asking for a lot of help in navigating the waters of modifying their IIS configuration.  When you add in multiple IIS versions, multiple .NET versions, 32 bit and 64 bit, it becomes quite complicated.

So that’s the official reason why it was always on the ‘TODO:’ shelf for me (this is quite a crowded shelf, I might add).

Recently, Tom Kraak of R2i was asking me again why I hadn’t done this, and I gave him the standard response (which is a version of the paragraph above) and he wasn’t buying it anymore.  So I decided to re-think it, and then I realised that IIS7 had delivered all the tools needed with the IIS 7 Url Rewrite tool.  This is a rewriting/redirecting tool that now comes bundled with IIS as standard, and is available as an install for any IIS7 version that doesn’t have it.  You can get it at the IIS 7 Url Rewrite page.

How to serve individual robots.txt files for individual DotNetNuke portals using IIS7 Rewrite

The basic idea I had was that the IIS7 Rewrite tool could be used to rewrite any example.com/robots.txt Url into a domain-specific robots.txt file.

So, instead of placing a single robots.txt file into the root of your multi-portal DotNetNuke installation, instead, what you do is create a specific robots.txt file for each portal.

As an example, say we have a DotNetNuke installation with 3 portal on it, which are example1.com, example2.com and example3.com

In this case, we would create 3 robots.txt files:

  1. example1.com.robots.txt
  2. example2.com.robots.txt
  3. example3.com.robots.txt

Each of these files is a robots.txt file specific for the specific domain.  This means you can list any paths you don’t want indexed, as well as a specific sitemap location for the relevant domain.

So far, so good.  But a search engine looks for domainname/robots.txt, not domainname/domainname.robots.txt.  How can we serve up the correct robots.txt file to the search engine robots that come visiting?

The answer is in an IIS7 Rewrite Rule.   Here’s the steps how to do it:

1. Ensure that you have IIS7 Url Rewrite installed on your server.  You may have to confirm this with whomever administers your hosting server

2. Open up the web.config file, and in the section, add the following rule:



 
  
   
   
    
   

   
  

 

Note: if you already have existing rewrite rules in the section, just add the block between the opening and closing from above.

That's it. What this rule does is match an incoming request for the robots.txt file. It then rewrites that request so that it appends the domain name to the front of the robots.txt path, and changes it so that it looks for the domainname.robots.txt file, instead of the robots.txt file. Because you create separate domainname.robots.txt files in your site root, then each separate file gets served for each separate request. Problem solved!

Now, I’ve given this a test on my local development environment and it was working a-OK.  If you find a shortcoming in the approach, or it’s not working, please let me know via the comments.


More ...
Views: 704 Comments: 0
R2idnn
Tuesday, March 13, 2012 10:58:00 AM
Working with the DotNetNuke (DNN) platform, you probably are familiar with the pain of implementing Meta tags on individual pages. This blog will provide you with a real basic definition of Meta Tags, and an easier way to implement title and description tags on DNN websites with an easy to install module.
Views: 612 Comments: 0
The Mighty Blog
Wednesday, March 07, 2012 12:00:00 AM

DotNetNuke User Group Meeting Logistics

Some of you may be already running your DotNetNuke user group meetings.  If that is the case, let this be a refresher or a guide.  For the rest of us, this is meant as a reference to help you plan out your first meeting, or the ongoing logistics of future meetings.  If you’re doing the right things, holding the meeting should be the least amount of work for a user group leader every month.  It should begin to run itself…

Know the Venue Layout

Knowing your venue is important.  Every meeting place will have attributes that you will have to describe and know before announcing and holding your meetings.  For example, there may be multiple entrances that your members could enter.  There might be multiple hallways, stairs, or elevators for them to take.  There might be multiple meeting rooms with similar or same naming conventions.  The worst is when more than one group of people are meeting at the same time.  You need to expect and plan for these things.

Probably the easiest way to plan for these things is to have pre-made and re-usable signage to help point people in the right direct.  The signage should have arrows on it to guide your attendees all the way up to the right door. 

If you are meeting in a secure location that doesn’t allow anonymous people to enter on their own, make sure that you do one of the following:

  • Have a Greeter – Place an attendee or volunteer at the door(s) to let people in.  They should be there through any opening announcements to allow for stragglers to be let in.
  • Give Out a Phone Number – Have a phone number for people to be able to text and/or call you to be let in.  Most of us don’t want to have our private numbers displayed publicly, so services like Skype and Google Phone make this easy without costing money or compromising your privacy.
  • Attach a Wireless Doorbell – I’ve see a wireless doorbell work quite well. They are battery-powered, low cost, and allow you to temporarily have a way for people to let you know when they’ve arrived without permanently altering the door way or giving away your personal information.

The last thing to remember in this area is to keep an eye open.  You cannot expect your volunteers to stay at the front door for the entire meeting.  Instead, it will normally fall on your shoulders as a leader of the user group to keep an eye out on the phone and doorway to help stragglers gain entry to the meeting after it has begun.

Assign Common Tasks

There are a great number of things that you could possibly do at one or more meetings.  You should find a dependable volunteer to assign responsibility for any tasks that repeat from meeting to meeting.  This is a great way to make someone feel like they are part of the group, they have ownership in the group, and ensure that they will continue to show up at as many meetings as possible.  Informal leadership positions can change the dynamic in so many ways – and almost always for the better.

Here is a list of the most common things that you might need to consider assigning tasks to people:

  • Greeter – As mentioned above, this person would let attendees into the building where the meeting is being held.
  • Registration – If you keep track of who attended, this person would make sure that everyone signs in.  If you’re doing any kind of raffle, they would likely hand out raffle tickets as well.
  • Raffle – This person would do any of the following: call winning numbers, hand out prizes, record any required information for/from winners, report winners to sponsors as required.
  • Announcements – Announce any news about DotNetNuke that had occurred over the past month, as well as any member-related announcements.
  • Newsletters – Draft and send newsletters to known members of news and upcoming events.
  • Manage Events – Depending on where and how many places you post your events, it might be great to have a person who posts your events in the various places for you.
  • Post Session Information – Speakers usually have links, sites, slide decks, example code, and more that attendees would be interested in later.  This person could coordinate with the presenter and post it to your website for you.
  • Recruiter(s) – There are two different types of recruiters that you will want to have, and you can name them anything that you want.  You need someone to continually recruit new speakers, and someone to recruit and communicate with sponsors.

There could be any number of other duties that might need to get done.  These should just give you an idea.  Don’t be afraid to ask someone to do something either.  You’d be surprised at how many people really are willing to help if you ask them.

As a leader of the user group, it probably isn’t a good idea to do everything yourself. If for some reason you are no longer able to lead the user group as thoroughly as you were for any length of time, the people that were helping would generally be able to step up for you to make sure the meeting still took place.

The most important thing that you can do as a leader of a user group is to identify the various things that need to take place over the month, and assign those tasks to people as much as possible. 

What to Bring

Along with hopefully bringing some attendees to your meeting, there are some must have items that you should consider, as well as some optional things depending on how your meeting is formatted and what kind of support you have.

  • Pens & Paper – Sometimes you can get this donated as swag.  People won’t always remember to bring their own materials to take notes.  Sometimes accidentally, and other times they didn’t think that they would want to take notes.
  • Technical Equipment – This could include projectors, power cords, a wireless router, LAN cables, web cam, and more.  I am the type that likes the have a spare, just in case a piece of equipment goes bad.  Of course all of these items depend on the format of your meeting, what your venue is able to support, and what resources you have.  Many of these things could be purchased by a sponsor.
  • Cameras – It really is a best practice to take some pictures and post them online.  If you have the resources, recording the meeting is great too.  These two things can really add some interaction and exposure to your user group before and after a meeting.  It can even help during the meeting too if you’re updating Twitter and Facebook.
  • Sign-In Sheet – It would be great if you could do this online using a laptop or tablet, but you will usually see a standard paper sign-in being used.
  • Signs – This of course could be tasked out above, but know the number of signs you need to have and bring them.  Ideally, they should be laminated or in sheet protectors to make them re-usable.
  • Door Prizes – This of course depends on if you have sponsors or not.  But bring the prizes if you’re going to give them away.
  • Raffle Tickets – Raffle tickets are usually pretty cheap, but you only need them if you have something to give away.  You can get an entire roll for about $3-5.
  • Drinks – Ideally, you would have a sponsor bring the drinks, but otherwise, it’s a good idea to have some soda and water on-hand.  I’ve always bought a small case of water for a meeting anyway.  Lot of people prefer water, and most food that is delivered to a user group meeting doesn’t have the choice of water.
  • Food – I wouldn’t suggest that you purchase food on your own.  This could very quickly burn a hole in your budget in a way that you wouldn’t be happy about.  Get this sponsored or don’t provide food.  Though, if you have a disposable budget, feel free to donate some food.  In the past, I’ve even gotten restaurants to sponsor food.  All you have to do is ask. 

If you end up being as thorough in your meeting format as possible, you might end up with too many things to carry into a meeting.  This was certainly the case at the last user group I ran.  In the event that this happens, a large plastic bin, a cooler with ice, and some bungee cables will become your best friends. 

Hopefully, this blog post was able to identify some of the things you need to remember and do for your meetings – and maybe even give you a couple of new ideas!

Views: 572 Comments: 0
Brandon Haynes
Friday, March 02, 2012 10:12:57 AM
I am pleased to announce a beta release of my role-based control panel extension.  It may be downloaded via CodePlex on its project homepage.  As is all of my DotNetNuke work, this project is fully open-source and available under a liberal BSD license. The DotNetNuke content management system exposes a control panel to administrators, allowing for site and (in [...]
Views: 820 Comments: 0
ChrisHammond.com
Thursday, March 01, 2012 3:27:16 AM

freshbandThis week I started reading a new book. It is a book from a course I took in college. I left the book at the office today (mistakenly) so I can’t tell you the title of the book, but basically the book is about programming language design. I noticed that while reading it, it is like I am reading it for the very first time. To be honest, it probably is the first time I’ve read the book. I couldn’t even tell you what course it is for, or when I took that course in college, though I can probably guess the outcome of me taking it, I likely dropped the course.

I don’t know when I became a bad student, but I can tell you, I am a bad student. I don’t think I ever really learned how to study. In grade school, middle school, and high school, I didn’t have to study. I took AP classes, was enrolled in an IB program my freshman year (before moving to Indiana where it wasn’t offered), I was considered bright.

frenchclass95I got good grades, played football my final two years of HS (or watched mostly from the sidelines), played tennis one year, golf one year, was in band all throughout. Up through 12th grade school was easy, if anything I think the only class I really struggled with as Calculus. After high school everything changed.

I started college in 1995, planning on getting a BS in Mechanical Engineering from the University of Missouri – Rolla (UMR) (now known as Missouri University of Science and Technology, MST). I struggled at Rolla. I joined a fraternity, I met a girl, I went to class, I discovered this new thing called the Internet (this was in 1995, before going to college all I was exposed to was Prodigy).

15569_1182361751660_1006680206_30450552_6095236_nWhile at Rolla, I did okay in some classes, and poorly most others. Towards the end of my time there I was dropping half of the credit hours I was taking each semester, and not doing great in the classes I remained in. Needless to say I didn’t do well at UMR, after 4 years of school, with one semester off to work, I left Rolla and decided I was going to work full time and go to school part time.

I moved to St. Louis, lived with my parents for 6 or 7 months, until they up and moved to South Carolina. I stayed in St. Louis, took a few CS classes here or there at UMSL, but struggled in those as well, working full time wasn’t conducive to me getting good grades. Eventually I took a year or two away from classes at UMSL, but I talked myself into going back and meeting with a counselor to figure out what I could do to finish. We looked at my transcripts, and figured out what I needed to do to finish. With 110 or some odd credits under my belt, in order for me to get a BS in Computer Science at that point in time I needed another 70 credits, a lofty number at the rate I was taking classes.

We looked at switching to an MIS degree, that wasn’t that much better, maybe 63 credits remaining. Ultimately we figured out that I could get an economics degree in just 36 more credit hours, I had to take 6 hours of humanities (not something that Rolla had in the requirements) and then 30 hours of economics. I had taken two economics courses during my time at Rolla, they came easy, so I thought, what the heck, 30 hours of econ and I’ll have that degree I need (as in I wanted to complete A degree, which one wasn’t that important to me).

I think around 2006 I started taking UMSL seriously again, taking 2 classes in the evenings during the week so that I could get the credits I needed out of the way. I did fairly well in my studies at UMSL in Econ, better than I had done in CS at either UMSL or UMR. In May 2011 I was officially done, I completed my Bachelor of Science in Economics from the University of Missouri – St. Louis. I was rather proud of finishing. Did it change anything? The only thing it changed is I can now officially say I am a college graduate, not one other thing.

But here we are today, March 1st, 2012, I’m a college graduate, I have a good job, a wonderful wife, a beautiful daughter. But I still am a bad student.

A couple of weeks (months?) ago the CEO of DotNetNuke Corporation gave a presentation to some employees about learning. Pushing yourself to spend 30 minutes a day learning. After school, you really don’t do that, or at least most people I know don’t. I know I haven’t pushed myself to learn anything outside the scope of DotNetNuke in many years.

It is time to finally change that. I want to learn, I need to learn, about what? Everything. For now, I’m going back to my computer science dreams, I’m going to read the books I have on my bookshelf. I’m going to learn things outside of my current comfort zone. To start off I am learning how to build and program hardware. I’ve been working on the web since 1995, it is time to break into the real world.

I’ve dabbled in that a bit already, I’ve been working on a project that we call DNNFoos (www.dnnfoos.com) a black box that is used to keep track of the score of foosball games. I’ve been building and testing and debugging the project for a few weeks now, and I am now at the point where I need to learn more to make it work reliably. I need to learn threading, I need to learn how to write code that fits on a Netduino and doesn’t throw out of memory exception errors. Now is the time.

After that? Who knows, maybe I’ll learn a new language. That could be rather useful living in California where 43% of the population speaks another language at home (census stats)

What are you going to learn today?

Views: 716 Comments: 0
Mitchel Sellers DotNetNuke Blog
Wednesday, February 29, 2012 11:55:00 PM
Others have blogged about this, for example Brad Wilson Blogged about using the Developer Preview that was released at BUILD last year.  I used his tutorial as a stepping point to get my install up and running. In this post I'll go through the process that I went through to get the Community Preview up and running.
Views: 500 Comments: 0
The Mighty Blog
Tuesday, February 28, 2012 12:00:00 AM

ODUG Hackathon  2010

Yesterday I wrote a blog that introduced you to 4 new user groups that are having their first meetings very soon.  At the end of the blog there was also a question, “Do you want to start your own user group?”  As a result, I got a very good question that is very common.  “What’s the best way to find out if there is any interest for a user group in our area?”

I love this question, not for the answer, but because of the thought process and activity around it.  It’s also the tipping point of someone actually embarking on the rewarding journey of running a DotNetNuke user group.  This is the part that excites me the most.  Community is what we are all about, and user groups help our DNN family grow.

There are many ways to gauge interest in your area.  The exact methods you choose will depend on your level of effort and availability of these methods in your region.

Attend Other User Groups

Go to the other user groups in the area.  Microsoft .Net user groups, developer guilds, and SQL Server user groups are often the best ones to go to first, as there will likely be several people there that already use or know about DotNetNuke.  You can find these user groups quite easily by either contacting or looking up the website for the local Microsoft Developer Evangelist, or simple searches on your favorite search engine.

If you are looking for user groups in your area, here are a couple of example queries.  They assume you are in Dallas, Texas.

  • .net user group in dallas, tx
  • sql server user group in dallas, tx

When you attend, ask the user group leader if you can speak to the group for a couple minutes and poll the members about DNN.  You can even get into their opening announcement slide deck, newsletter, and more.  You’d be surprised at how helpful the area user group leaders will be.  The typical user group leader would jump a the chance to help someone else create a new user group.

Try to have an easy to remember website or email address to point everyone to.  A business card for the user group or yourself will work just fine.  If you don’t have any, services like Vista Print work quite well to allow you to create business cards online and sometimes for free.

It would be best to have a date set for the first meeting about a month in advance, even if you’re not sure if anyone would show.  If people express interest, then you have a meeting to set-up.  If not, then no harm – just don’t hold a meeting.

Forum & Social Networks

Use the DNN user group forum, Twitter, and the DNN Facebook Page to ask if there are any people in your same area looking to attend user group meetings.  Be sure to cross-promote your inquiry as well.  If you post in the forums, post a link to the forum thread on Twitter and Facebook.

Think outside of the box as well…  There are other social sites that can help advertise the existence of an existing or future user group leader and meetings.  Post your inquiry on places like Craigslist, and local bulletin boards at local newspapers.

Become the Leader on DNN

If available, make sure you become the leader of the user group on the DNN website.  This will allow you to point potential user group members to something and allow them to register for the user group.  This enables you to have a count of potential attendees, as well as a way to send a newsletter to everyone that has expressed interest so far.

If you have enough people registered, send newsletters at least once a month to find out how many people are willing to meet and what their preference is for a date, time, and area of town.

Real Life Venues

Go to your local community colleges, technical colleges, and universities.  Place your card or a flyer on the area bulletin boards (yes, and actual bulletin board), and ask the staff to include your user group in their own newsletters.  Sometimes you can even leave flyers in the libraries, labs, and more.

Like before, make sure you have a website or e-mail address to point people to.  This allows you to efficiently collect and archive their information for when you finally hold a meeting.

Website or E-Mail

I have said a few times to point people to a website or e-mail address.  The average person is more likely to register on a website than send you an e-mail expressing their interest.  E-mail is often perceived as being much too personal – so you will likely not get as many people contacting you.

Instead set-up a website if you have the resources.  With DotNetNuke, it doesn’t take much effort to do so.  Just have people register on the site.  That’s easy enough for most people and it gives you their contact information and the ability to build up a contact list for newsletters.

If you don’t have the resources to build a website, then simply point these people to the user group profile page on the DotNetNuke site.  The URL isn’t very easy to remember, so I would suggest using a service like bit.ly to create a shorter URL, and maybe even a short URL that is easy to remember.  Bit.ly allows you to specify the end portion of the URL. 

Whatever you do… Have a SINGLE ENDPOINT to collect potential user group member information.  Point everyone there on your cards, flyers, forums, social networks, and elsewhere.  This will make your life easier by leaps and bounds.

Do this even if you are not the current leader of the user group.  This will show interest and you can still end up being the leader later, or assist the existing leader now that enough members have been recruited.   There are many options from this point.

The Biggest Mistake You Can Make

Nearly everyone that I have met that ended up running a user group has made the same mistake. They continually go through their process of gauging interest, and if they don’t like the number of responses, they put off plans until the next round of communications. DO NOT do this!

There isn’t a magic number. There isn’t a minimum number of responses. There isn’t a better time to start your first meeting than now. A large number of people will not respond to your for any number of reasons. However, if they know a meeting is scheduled, quite a few more will show up than respond.

Schedule your first meeting. Invite the entire list of people you’ve gathered up to this point. People will show. And if you’re consistent, more people will show at each meeting.

Summary

You have nearly an unlimited number of options available to you when trying to recruit user group members and interest.  Even if you’re in a rural area that has few if any other technology-minded people, there’s nothing stopping you from creating a virtual user group.

Use as many of the available options that you can without expending all of your energy.  The more feelers you have out there, and the more exposure you create, the more real your prospective user group seems.  People will respond to that.  People gravitate to others that project that kind of positive energy.  That’s the core of what makes user groups great to begin with.

Here are is a summary of the steps I’ve outlined:

  1. Create or join a user group on the DNN site
  2. Create short or memorable URLs to your user group
  3. Create a business card and flyers for the user group
  4. Post and leave the user group information in as many places as you can
  5. ENSURE that all flyers, cards, and verbal recruitment points to a single place

I hope this gives you a greater insight into how to get started.  There’s no magic formula to get started.  You just start.

Views: 464 Comments: 0
The Mighty Blog
Monday, February 27, 2012 12:00:00 AM

Chris Hammond visits the ODUG in 2009

User groups in general are great.  They do for the average person what few other venues and mediums can…  They connect people in meaningful ways.  Sure, you can log onto your favorite social network and find people with similar interests, but you have to build a relationship first.  That takes time.  At a user group, everyone is there for the same reason.  They all want to learn more about the overall topic.  Once you share a slice of pizza or a drink with your fellow user group members, you have quite possibly built a meaningful relationship for life.

You may or may not know, but I assist in managing the user group program for DotNetNuke.  Over the past month or two, there have been a greater number of requests for helping people find user groups, but also people wanting to run a user group in their area.  This is very exciting!  There are numerous reasons that we could point to as possible reasons for this increase in activity.  Regardless to the reason, I just wanted to highlight some of the new user groups that are forming.

Queensland, Australia

The SE Queensland DotNetNuke User Group is being run by Ian Sampson (@glantonian), Director of Glanton Solutions.  He is a long time DNN user and supports some very impressive DNN websites for some of the higher profile customers any of us can hope for.  They have landed a heck of a first speaker too…  Bruce Chapman (@brucerchapman) of iFinity Software.  If that doesn’t ring a bell, iFinity’s flagship product is URL Master.

Their first meeting is on March 22, and their topic is “What’s New in DotNetNuke 6.2?”  This is certainly a must-see topic and presenter!

Portland, Oregon

The west coast of the US in general doesn’t have as much user group activity as I would like. I am not sure of the exact reasons why, but Greg Griffin hopes to be the catalyst to change that. He and the previous leader spoke and chose to handoff the responsibility. I don’t have quite as much information about the plans for this group, but if Greg’s emails are any indicator, Portland should have some great meetings very soon, beginning March 15.

Tampa Bay, Florida

Tampa Bay had a user group in the past that began to catch some momentum.  It had several great meetings and included Joe Brinkman and myself as speakers.  However, it ended up having to cease having meetings.

Bernadette McCarthy has eagerly asked to take over this user group, and I am extremely glad that she has.  She brings a very high level of excitement to the group, and they haven’t even met yet!  This user group has great potential, considering that it is so close to the ODUG, and Tampa is a hot bed of Microsoft-related user groups.  I hope to see them grow quite quickly.

Their first meeting is a meet & greet on May 2

Central Ohio

The Central Ohio DotNetNuke User Group has an extremely motivated individual taking the reins. He is quite simply the most excited person that I’ve spoken to about user groups in the recent past, and he cannot wait to meet all of the people in his area. Dustin Eastman is the new leader of this user group and has scheduled their kick-off meeting on March 15.

Do YOU Want to Run a DNN User Group?

With all of this renewed interest in user groups, I have to ask… Are you interested in running a user group? If you are, please let me know.  I’d love to talk to you about the user group in your area.

Discuss Running Your Own User Group

Views: 498 Comments: 0
The Mighty Blog
Sunday, February 26, 2012 12:00:00 AM

Content Slider Module for DotNetNuke

It’s always kind of difficult to tell what modules will become popular when you create them.  For the most part, I really don’t care because usually the modules I release to you and the rest of the DotNetNuke community are those that I built specifically for server a need I had anyway.  However, Content Slider module was meant to fulfill a need.  There was a gap in the Forge.  As a result, this module has had over 3,500 downloads in about 6 months.  THANK YOU for enjoying this module so much!

Well, no one can ignore that kind of interest, so I spent quite a bit of time working on a new release this week.  I was able to close all of the reported bugs and suggestions, and I even added a couple of my own.  The highlights are below.

  • Feature:  One-Click Enabling of Pager Setting
  • Feature:  Cache Sliders for Performance
  • Feature:  Configurable Cache Setting
  • Enhancement:  Transitions can be Selected
  • Bug:  Secure Folder Images not Viewable
  • Bug:  Sliders Disappear on Postback
  • Bug:  Remote Images Cause Errors
  • Bug:  Deleted Images Case Errors

These updates have helped to solidify this module to be higher performing, easier to use, and more stable than it ever has before.  In my opinion, its simplicity makes it competitive to most of the commercial options you have today.

Pager Setting

This is probably the most exciting update to this module.  Prior to this release, implementing the pager setting was quite difficult to do and required some general technical understanding of how the module and the jQuery cycle plugin worked.  This was obviously not a good thing for any module. 

As a background, the “pager” I am speaking of is simply the navigation element that can go with a banner slider.  See the example below.

Content Slider: Pager

Now, you can enable that functionality within a click!  All you have to do is make it look pretty, or at least make it look like it belongs in your site.  A little bit of CSS magic is all you need. 

Caching Enhancements

While tracking down some other bugs and issues, I stumbled across the need to cache a bit more for performance and stability.  If you’re not familiar with the term “cache,” it is simply a technical term used to describe the ability to save program information into memory for quicker retrieval.  Done right, caching can make even the most sluggish applications look speedy-quick. 

Bruce Chapman of iFinity SoftwareThis release not only explicitly caches the slider information above and beyond what the module will do, but it also allows you to custom define the amount of time that your cache will remain relevant.  However, it is also smart enough to override the cache when you add new sliders and save the settings.

Before moving on, I do want to give a little blog love to Bruce Chapman of iFinity – the maker of the favorite URL provider for many of us.  During my testing for this feature, I stumbled upon his free Cache Master module.  This module is incredibly useful for any developer that is performing explicit caching in DotNetNuke.

Selectable Transitions

The last update I want to specifically dive into is the ability for end-users to now be able to select their own transition.  This was a huge usability snafu by myself.  Until this release, you had to know the exact words to use for the transitions you wanted.  This is a lot easier said than done for nearly all users.  You don’t have to worry about that anymore…  Now, simply select an available transition, and save your settings to see how it looks!  Easy as pie.

That’s about it.  I hope you enjoy the Content Slider Module for DotNetNuke.  It’s certainly an honor to maintain this module for you all.

Download the Content Slider Module now!

Views: 612 Comments: 0
DNNDaily.com
Thursday, February 23, 2012 4:36:59 PM

For the March meeting of the Bay Area DotNetNuke User’s Group (3/6/12)at the DotNetNuke World Headquarters Adam Humphrey from Adammer LLC will be presenting “Pushing Pixels in the DotNetNuke Ecosystem Principles of DotNetNuke Skin Design

You must RSVP via Meetup.com

Category: Community
Category: Events
Category: User Groups
Views: 1050 Comments: 0
The Mighty Blog
Tuesday, February 21, 2012 12:00:00 AM

Content Injection Module for DotNetNuke

Today, I finally dedicated some time to give the Content Injection Module for DotNetNuke some much needed love.  Fortunately, there aren’t too many reported issues or requested features, so the update went quickly and smoothly.

If you are new to the Content Injection Module, this module was built to allow you to inject literally any text, content, scripts, or anything at all into the header or footer of your DNN website.  It can be quite useful to inject things like Open Graph Protocol, JavaScript libraries, CSS, startup scripts, and more. 

There are a total of four (4) updates made to the module for this release.  They are listed below:

  • Feature:  Windows Azure Support
  • Feature:  DotNetNuke Icon API Support
  • Enhancement:  Increase Width of Content Injection Text Field
  • Bug:  Content Injection Truncated

Windows Azure support will only affect a small subset of those using this module.  Up until now, you would not be able to successfully install the Content Injection Module on instances of DotNetNuke running on Azure.  Now you can successfully install and use this module on Azure.

The Icon API support is really only a cosmetic change, and most people won’t notice that this has even changed.  However, if your instance of DNN is more advanced and chooses to use its own icon set, this module will work seamlessly with your instance.

The content injection field in edit view was quite small for some content administrators.  It was too small for larger content injections – especially if they were over 100 characters or so.  Now, you have a much larger view for this module.  This enhancement was done completely client-side too, so you can change the height and width of this field on your own site as you see fit.  Just override the following two CSS selectors in your portal.css.  Your portal.css can be updated in your Admin > Site Settings page.

The final update was an unfortunate bug.  A while back I had increase the number of characters for a content inject to be unlimited.  However, the data access layer (DAL) that did the actual save to the database was still observing the original 2,000 character limit.  This would result in your content injection being trimmed to the first 2,000 characters.  This bug has been fixed.  You can now save content injections of any size safely.

Views: 664 Comments: 0
iFinity.com.au - Bruce's Blog
Monday, February 20, 2012 7:00:03 AM

The new DotNetNuke store arrived last week – and what a momentous day for vendors like myself who use the platform extensively.    The old Snowcovered store had remained quite stagnant for a long time, and while it had many strengths, there were a lot of weaknesses that needed to be fixed.  This  has been done, and everything is good!

Well, almost everything.  One feature that vendors use extensively is the ability to track visitors to both their product page and their vendor page.  While a vendor like myself has no idea overall what sort of traffic the site gets, we have the ability to create a Google Analytics account and see traffic to ‘our’ specific pages in the site.

One of the big changes with Snowcovered to DotNetNuke store was, of course, the domain name.  And anyone who knows anything about Google Analytics should know that it works on a combination of your tracking ID and the domain name. 

So it should be no surprised that many people will see analytics graphs that look something like this:

image

Oh dear-  all my customers disappeared about the 13th of February!

To fix this, it’s quite simple, you just need to change the tracked domain name so that it looks at the new store Url.

To do so, just follow this guide:

1) Click on the little ‘cog’ icon on the top right of the page

2) You will get to the profile page.  Click on the ‘Profile Settings’ tab:

image

Where you see ‘www.snowcovered.com’, change it to ‘store.dotnetnuke.com’.

Click the ‘Apply’ button at the bottom of the page.

That’s fixed that.  But the profile is still named ‘snowcovered’.  We’re all going to be using the term ‘DotNetNuke Store’ from here on in, so better get that fixed.

3) Click on the ‘Property Settings’ tab:

Where it says ‘snowcovered.com’ change it to ‘store.dotnetnuke.com’.  Of course, you can put anything in the ‘Property Name’ field – you don’t need to stick to the domain name.

image

Click on ‘Apply’, then refresh the page, and you’ve fixed it all up!

The changes will take up to 24 hours before traffic starts appearing again. 

Bonus : Better Tracking

In the old Snowcovered store, the plethora of Urls each page could be found under meant that tracking a canonical page was a bit of a dark art when it came to Google Analytics.  However, this could easily be done by viewing pages by title – no matter what the Url, the title was always the same.

Alas, when the new Google Analytics came out, the old ‘content by title’ report disappeared (or was buried further than I was inclined to look).   This was most frustrating.

However, salvation is at hand – the new and improved store uses the Url Master module with a custom Url Provider to deliver the store Urls.  No more messy, duplicate Urls, now each product listing has a canonical Url that all traffic will use.

You can see the difference in this pageview excerpt.  The duplicate Urls are highlighted in yellow, and the canonical, friendly Urls are shown in Green.  The old Urls were driven by the Product ID, while the new Urls are driven by the product name.  This makes it easier to track what they are for, are nicer to look at, and rank better in search engines to boot.  Chalk up another great use of custom module providers and Url Master.

image 

By next months reporting period, the old snowcovered Urls will gradually dissappear into history.  But, because we can re-use our same Analytics account, we can still look at multi-year trends in pageviews, referrals, and all the other deeply interesting data you can slice and dice with Google Analytics. 

So if you’re a store vendor, and you haven’t yet fixed your Analytics, get clicking!


More ...
Views: 582 Comments: 0
The Mighty Blog
Wednesday, February 15, 2012 12:00:00 AM

Lightbox Gallery Module for DotNetNuke

It’s that time again…  This is one of my more popular modules, so I need to make sure it gets some attention from time to time.  There was plenty to do too.  Thankfully, all of the scoped updates for this release were fairly easy to implement, requiring minimal time.  Don’t tell anyone I said that though…  It was really, really hard work!  Hahaha!

Just prior to opening Windows Live Writer to write this post, I took a quick glance to see how many downloads this module has had over it’s nearly 2.5 years in existence.  Amazingly, this module is just under the wire for 10,000 downloads over its lifetime!  I cannot express to you how flattering that is – especially considering that this module was simply meant as a proofs of concept for a demo.  Thank you! 

Lightbox Gallery Downloads as of 02/14/2012

This module had quite a few updates applied to it for this release.  They include:

  • Search support for Community Edition for albums and images
  • Saved audit information to see who last updated an album or image (through the module itself)
  • Implementing the new DotNetNuke Icon API
  • Improved error trapping and reporting

As much as it pains me to say it, this module is not unlike any other software…  There were a few bugs to fix.  They include:

  • Graceful handling of errors due to file locking
  • Admin icons missing on child sites
  • Folder provider compatibility issues
  • Observing the Hide Title & Description setting

This module currently supports all versions and editions of the version 6 series of releases of DotNetNuke.  This means that it also requires ASP.Net 3.5 SP1 or 4.0 and SQL Server 2005 or newer.

Download Lightbox Gallery Module!

Views: 696 Comments: 0
Peter Donker
Monday, February 13, 2012 5:37:33 PM

This blogpost is about disk permissions and asp.net applications like DotNetNuke. Although there are probably many posts like this I write this because permissions, or more precisely the lack of them, are the root cause of many support requests. And a little knowledge is all that would have been needed to avoid the situation.

Background: the worker process and its app pool

An asp.net application is just that: an application. It is a program running on your server calculating what HTML to spew out to the requesting browser. This is quite different from serving html in the classic way. There the server just streams files from your server’s hard disk over the wire. No processing as such. Just “serving”. But asp.net applications (and their predecessor ASP and alternatives such as PHP) require the server to process instructions of a program that will tell it what to send to the client. This has given us the data driven web site and the whole Web 2.0 revolution.

To do this processing the server starts up the so-called worker process. You can actually see this process in action if you’re on the server which is serving asp.net pages and bring up the Task Manager and flip to the “Processes” tab:

Task Manager

They’re called “w3wp.exe” (for WWW Worker Process) and in this screenshot you can see two of them. By the way: this is a really useful place to check the health of your site. It is probably always my first stop. You can quickly see if the worker process is clipping the CPU (i.e. it’s at 99% CPU) meaning it is consuming all processing power of your server, or if it is consuming a lot of memory (usually not a reason to panic).

The worker process encapsulates the code that is running for asp.net. Because the server is starting this up autonomously based on http requests, this process is boxed into an App Pool. The app pools are kept in a list in your IIS manager:

app pools

The app pools govern how much the worker process can consume from the server like in terms of memory for instance (lest they complete consume the server and bring it down). The app pool, therefore, protects the server from potentially hazardous code in the asp.net application. The app pool also gives the worker process its identity. It is the latter we are concerned with here but we’ll come back to this in a bit. What you need to know at this point is the existence of the worker process and the app pool, the relationship between the two and where you can find them.

Windows disk permissions

This should not be a big mystery. All items on your server’s hard disk (folders, files) have a set of permissions that commonly inherit down the folder/file tree. Right click on any folder on your server and select properties and you get a popup of that folder’s properties with a “Security” tab. Go to this tab and you’ll see something like this:

folder props

The concept is simple here. You can specify users and roles with the level of access to this resource. So giving someone Read but not Write access will allow them to see and download/open documents, but not change those documents or upload new ones. This paradigm is pervasive in computing. What you may not realize is that when the worker process (i.e. the asp.net code) accesses the hard disk it needs to have a “face” for the system to authenticate. It’s “identity” needs to have the right access level to what it wants to do on disk. The way that is implemented is through the identity of the aforementioned App Pool that is responsible for taming the worker process.

App Pool Identity

The app pool a worker process belongs to specifies which identity it will assume when it goes to Windows. Check out the advanced settings in IIS Manager for an App Pool:

adv

Adv settings

So this app pool runs as “NetworkService” when accessing the disk. Note that the default for this depends on the IIS flavour. Commonly you’ll see “NETWORK SERVICE”. What is important to keep in mind though is that these default accounts are local to your server. I.e. NETWORK SERVICE on server SERV-A in your network is a different account than NETWORK SERVICE on SERV-B on your network. Even though they have exactly the same name. Well, actually their full names would be “SERV-A\NETWORK SERVICE” and “SERV-B\NETWORK SERVICE” but we don’t always see it like that in the UI. Keep this in mind!

The bottom line is that your app pool should have access to the files of your ASP.NET application. And write access as well in the case of an app like DotNetNuke as it is able to install extensions (modules, skins etc) which means writing files to the application’s file system. Let’s examine that in more detail.

DotNetNuke and its Installer

DotNetNuke’s most powerful feature is its ability to install and upgrade extensions which are uploaded as zip files. DNN’s installer unzips those and, based on the information presented in an XML manifest, it begins to write the contents of that zip file to the server’s hard disk. It will write files only inside it’s own application’s directory. Never beyond that. And that’s good. You want the server to encapsulate the application and not have the risk of some rogue module writing executable code to your Windows files. The installer typically writes ascx files to a folder it will create under DesktopModules. These files are template files that tell the server how to flow the HTML. Next to these ascx files it will also typically write one or more dll files to the bin folder. This folder is the most important folder of your asp.net’s application. It is where the compiled code sits. Waiting to be invoked by the worker process as the ascxs tell it to go to them and do some fancy processing.

The installer performs another very important function which will have some bearing on the problems we will describe below. That is the running of SQL scripts. The module programmer packages the zip file with a bunch of scripts that prepare the database so that the application may do its work. These scripts are incremental. That is: they are run in order and during an upgrade DNN’s installer works out which scripts it needs to run to upgrade the module. Keep this nugget of info in mind as we examine the common failure scenarios.

What you need to know by now is that the installer writes files to disk and very importantly to the bin folder of the DotNetNuke application.

Common Failure Scenarios

The focus of this post is on errors in disk permissions. These permissions can lead to serious malfunctions in your application.

After Server Migration

Servers die. Or you need a bigger/better etc server. There comes a moment in the life of your website that you’ll need to move it. So you (x)copy over the files of the asp.net app, register the app in IIS and away you go. But this is where the problem begins. The files with FULL permissions for “SERV-A\NETWORK SERVICE” are now running on SERV-B. And the asp.net app is now running as “SERV-B\NETWORK SERVICE” although all you saw was “NETWORK SERVICE”. If you’re lucky (or not depending on how you look at it) your site will still have read access for the new identity and the site will fire up correctly. But what will now happen when we try to install, or worse upgrade, a module? Check below.

After Restored Backup

Murphy’s law has it that a site will only die when we haven’t got a backup. But just in case you do have one please read this. Your backup might not have the full permission set of the files stored with it. It all depends a bit on your backup solution. What is also common is a combination of this and the above. I.e. a server has died and we restore to a new server from our last backup (pfew). Again what you need to keep in mind is that the permission set may not be right for the worker process’ identity.

Common Failure Effects, Symptoms and Solutions

These are common results from mishaps after the above.

Module Install Failure

Keeping in mind the application is unable to write to one or more places of the application’s file system it is easy to see that the installer would run scripts but not be able to write files. Although the installer is pretty smart this is still something that can happen and I’ve had customers report in with installation problems resulting from this. The biggest problem here is that DNN’s installer will have already run the SQL scripts to install the module but the actual installation failed. Now, when the user tries to install again the installer will re-run the scripts leading to all kinds of spectacular SQL failures as the SQL objects are already there that the installer should be creating. This is messy but ultimately easily solvable. Manually rip out all objects related to the module from SQL and correct the disk permissions then install again.

The main reason this scenario is not that dangerous is that (1) modules are usually (if well programmed) encapsulated so they will not damage other bits of the system and (2) there is no user data yet as we are just installing. So you can afford to horse around with the bits that came with the module provided you don’t touch the rest of the application.

Module Upgrade Failure

This is the real nightmare scenario. And it is not uncommon. This is also the main reason that I advocate making a backup of your installation before you upgrade a module. Why is this scenario so bad? Let me explain. The installer will begin to upgrade the database objects of the module first. At this time the data may well be transformed (columns being deleted, added and data being moved to other tables for instance). In short this is typically irreversible. DNN has no concept of uninstall largely due to the complexity of this bit. The scripts run first and then the file copying begins. So now the server has to begin adding files, overwriting files and possibly deleting files. Presuming this has become impossible due to a permissions issue, we are now left with module code (in the bin folder for instance) that thinks it is version A and the database tables thinking we are now version B. The installer will bomb out of the install process with “cannot overwrite file XYZ” or “cannot access ABC” and it won’t register in DNN that the module updated. Even though the scripts have run just fine.

The effects are generally that the module will fail spectacularly with messages of the kind “Column XYZ could not be found in table ABC” etc. The error is easy to spot but harder to solve. In fact you are going to have to do one of two things. You can mimic the DNN installer and continue where it left off. But for that you need a lot of DNN knowledge. In short you’ll need to (1) copy the files from the zip to their correct destination, (2) update the versions in Packages and DesktopModules tables and (3) update the module definitions if there are any changes. The latter can be quite elaborate work. And then we don’t know if upgrade code should be run from within the module. If it does then … well, we’re stuck. But this is relatively rare, as are changes to the module definitions, so just doing 1 and 2 above might do the trick.

But really the best way out of this is to roll back to the last backup. As you followed my instructions you have a backup ready to be restored. And then you just set the permissions correctly and try the upgrade again.

Internal Module Failures

Many modules use the file system. Certainly my Document Exchange does so. So having permissions on disk can be crucial to the operation of these modules. Keep this in mind. Typically you’ll see error messages starting with “Could not find a part of the path” or “Could not access”.

Setting Disk Permissions

So how to set these permissions correctly?

  1. Look up the identity of the worker process in the app pool settings
  2. Open up the folder of your DNN installation and select properties and go to the “Security” tab
  3. Click “Edit …”
  4. Click “Add …”
  5. Type in the name you looked up under 1 (you may need to Google on alternatives at this point if you are still not having luck)
  6. Make sure to transfer these new permissions to all children
  7. Verify a couple of levels down on a random file. Are permissions as they should?

Final Note

First and foremost I am a programmer and not a Windows administrator. What is in this post is the result of me having to solve installation issues over the years. I will not claim this is the definitive guide to asp.net permissions debugging. But it is a good overview of the causes of a number of issues I’ve dealt with in DNN/DMX support. And it is not uncommon unfortunately. Though the above may at times be considered common knowledge, I know it is not. And I also know it is hard to explain in a paragraph or two. Hence this post so I can point you here.


More ...
Views: 562 Comments: 0
DotNetNukeFool
Monday, February 13, 2012 4:34:19 PM

While this is well documented just about everywhere in the forums (and the DotNetNuke wiki) I find myself continually running into this issue and forgetting about it… So… I decided to write a blog post as a way of reminding myself each time. You know… it’s that parental thing like writing 10000 times “I will not play with fire or stop an uncontrolled fire out with my bare feet”…hoping that it if you write it enough times it will “sink in” Smile

Category: DotNetNuke
Views: 596 Comments: 0
iFinity.com.au - Bruce's Blog
Sunday, February 12, 2012 5:35:00 PM

The 13th February, 2012, marks 10 years since the .NET Framework 1.0 was released, well, according to Wikipedia, anyway.  I don’t recall the specific date, but I remember the general period vividly.

This little point of achievement will probably pass most people by as they spend another day creating new software based on this platform, or use one of millions of websites that the platform provides, or any number ways of interacting what has become an incredibly successful framework by any standard to measure.  But I thought it might be fun to just pause for a minute and reflect back on the last decade.

Is ten years such a long time?  Realistically, in computer industry years, it’s an absolute eternity.  The internet has really only been around for most people since the late ‘90s. The Windows 95 platform only lasted for 5 or so years before being dropped.  Visual Basic (the original version) went from 1.0 to 6.0 in 7 years, before being shelved to make way for .NET.  Many programming languages have come and gone in less time than a decade.

The way we were

It’s all too easy to take for granted the powerful tools we software developers have at our disposal.   It’s very easy to forget the kind of world Microsoft-technology developers had 10 years ago.   But let’s just cast our minds back to the late 1990’s and early 2000’s.    If you wanted to build a website using Microsoft kit, you’d probably have been using:

- Either C++ or VB6 to build back end components.

- SQL Server 6.5, or, if you were lucky, SQL Server 2000.

- Windows NT 4.0 server, or, if you were lucky, Windows 2000 Server

- Microsoft IIS 4.0 or IIS 5.0 running ASP pages.

In reality, in any fair comparison with alternative web development tools at the time, it wasn’t ideal.  In fact, many frustrating times, frankly, it was painful to get things done.  You’d spend half you day producing something, peppered with thoughts like ‘there has to be a better way’.

The Genesis of .NET

I was working on a large development project for a financial services company at the time.   It was a sophisticated setup, where VB6 components plugged into a business layer which was all based on DCOM, written in C++ and somehow connected it all up and made sure it scaled.  I say somehow, because it really was an obscure black box of dark arts, and there was only one guy on the floor who really knew what was going on.  He was brilliant in the way an older developer with a bushy beard can be.  But he wasn’t good at explaining what was going on in that layer.  You just had to take it on faith that it all worked, which it did, most of the time. 

The problem was in deploying to production.  In those days, IIS had a tendency to eat up a pile of memory and then freeze up.  The notion of automatically dropping an application pool on a periodic basis hadn’t happened yet.  And all those COM/DCOM components had to be installed on the server.  I don’t mean sent via FTP to the \bin directory, I mean, create an installer package, log onto the server, and run the installer.  And hope over all hopes that someone didn’t include a bad reference and send the entire team to “DLL Hell”, as it was known.

And that’s just the deployment part.  I was employed as a VB6 programmer, which I knew well, having come up through the VB ranks from 16bit Visual Basic 3.  While you’d never find me defending VB in an online forum, it wasn’t a bad way to quickly build software. But the not-quite-OO patterns in VB6 really made a developer do some unsavoury things.  And if you had a friend who was programming on the hot-new-language ‘Java’ they’d always guffaw, and talk about the language purity of Java.  Yes, never sit around with a bunch of developers discussing programming languages.

As the company I was working at was quite a large one with a substantial IT budget and a pure Microsoft technology platform, it got very good treatment from the Redmond HQ.  And one of those things was an early look at what was called ‘Next Generation Windows Services’.

This sounded like the answer to the frustrated VB/IIS developers requests.  This was going to be an entirely new programming platform, one that you could get enthusiastic about.   Gone would be COM/DCOM – although you could still use it if you wanted to (I didn’t ever want to, again).   Gone would be the VB6 platform, gone would be the VB IDE.   In would be an entirely new programming language called C# as well as a total rewrite of VB to make it a proper language.  This was going to be a proper object oriented language in either the less-verbose C style, or in the more verbose VB style.  Funnily enough, on first inspection C# looked exactly like Java.  Hardly a coincidence, one would suspect.   All new was a event-driven web page programming style, which smelled a lot like VB forms.  There was to be ‘xcopy deployment’ so you could just copy the program up to the server.  DLL Hell was to be banished forever by keeping the component metadata in the component itself, rather than in the operating system registry.

Funny thing – in true Microsoft style – they had a melange of names for it.   When I first heard of it,  the new version of ASP was going to be called ASP+.  And that’s why it has the .aspx extension – you couldn’t have a + in a Url, so they rotated it 45 degrees, and you had an ‘x’ on the end of the old .asp extension.    And C# itself, was basically C++,+ – with another ‘+’ thrown in for good measure.  Arrange 4 + in a square and you get #.  And thus C# was named.

I don’t remember when I officially heard the name .NET – it was probably closer to the launch – by that time I no longer worked at that company, and so lost access to the stream of new announcements from Microsoft.  It’s hard to believe today, but back then Microsoft didn’t do a lot of public BETA testing.    But at some point it was announced, then released.   And the .NET world was born.

.NET Leads the Microsoft Developers out of the Wilderness

It’s hard to understate the difference this change made in my life and career.  At the time, a lot of developers (and companies) I knew were jumping ship, and moving across to Java.  This generally meant a change in web server, programming tools and probably database platform for good measure.  And none of those were provided by Microsoft.  I’m sure the board reports at Redmond had some metric for measuring this.   One of the biggest secrets of success for Microsoft has always been the support of developers.  Having an operating system without third-party developer buy-in means failure.    The original success of Visual Basic was the ease in which people could build ‘GUI’ apps quickly, in an era when DOS based programs and mainframe terminals were still the norm in companies.  Users would have fits of delight when they could use drop-down boxes and update buttons instead of command line driven programs.

But the sea change from Windows GUI to Web was fast, and the tide was running away from Microsoft.   The challenge was on – how to take all those experienced and Microsoft-trained VB developers and turn them into web developers?

The answer was ASP.NET Webforms.  Now, to some web purists, the way in which this was solved still makes them go cross-eyed with indignation, but the simple matter was that it not only worked, but it did so in which it didn’t take a massive retraining for an efficient VB developer (or even a C++ developer, for that matter) to start being productive.

Of course, some of the bloated buggy and run-at-a-crawl sites that resulted are probably not excusable, as too many desktop developers didn’t really take the time to learn that programming for the web really did require a new mindset.  But, for Microsoft, it worked.  Within a short time, websites with the now-familiar .aspx extension were popping up all over the web.   The flow of companies and developers to Java was stemmed.   People like myself stayed on board.  It wasn’t necessarily that someone like myself couldn’t see the faults in Microsoft – clearly I could – but it’s crazy to pretend that no platform or environment is free of shortcomings.   As always, it’s about getting something that works, to market, in the quickest possible time.  By 2005/6, it was very common to find jobs looking for ‘3 years C# experience’ – which meant you had to be on board from the get-go.  Having conducted interviews around this time myself, I found that many people were being quite liberal with the truth on their experience, but .NET was here to stay, and anyone looking for a future in Microsoft platforms had to start collecting experience, fast.

.NET grows and grows

Despite the busting of the ‘internet bubble’, in reality, web developers were about to enter a golden age.  The truth of it was that the cost of building websites and launching them was falling quickly.  Part of that was cheaper hardware, and part of that was the growing stack of frameworks that added layer upon layer, each abstracting away a previously difficult and troublesome task, and making it a simple job.  Open source was, and remains, a huge part of this.   Of course, the leading web server, Apache, has always been an open source product.  But little by little, Open Source made it’s way into Microsoft as well.  But even without Open Source, there were plenty of free things that were getting added to the .NET family.   

Of course here is the appropriate point to mention DotNetNuke.  This is not to belittle other open source .NET projects, but it’s the one I work on and know most about.   Given that ‘.NET’ is part of the name, it should be obvious to all how intertwined these two things are.  DotNetNuke was (and remains) an open source framework which allowed you to quickly create websites, without having to build all the associated messy bits like authentication, logging, not to mention the killer app of DotNetNuke which was the ability to easily install third-party modules to infinitely expand the site with new functionality.

It sounds so simple and expected now, but this was such a massive jump in productivity it is hard to believe the old way of working.  In the heady days of the ‘internet bubble’, if you did find someone building an ASP based site, they would have had a team of developers working for 6 months to produce an approximation of what you could get from a DNN install in 6 minutes.  And it probably would crash too frequently, especially at dreaded upgrade time when it was time to release new code and find out if a trip to DLL Hell had been unwittingly scheduled.

I worked on one project that was building a social network site.  This was just before Facebook exploded out of it’s college niche and out to the greater public.  This was a sophisticated site that had blogs, forums, chat, video and photo uploads, and all the social features you’d expect including friends, groups and all the rest.   I’ve never know the exact figure, but my guess is that a 7 figure sum was spent in an 18 month period with developers to create this site, myself being one of them.   And without a shadow of doubt, I could build that same site today in DotNetNuke with a few third-party modules for more like $7000 and 18 days, and most of the money would probably go to a talented designer.

It’s easy to nod your head and say ‘yeah, that’s true’, but in few industries does this type of productivity leap occur.  Of course, this is nothing special with regards to a Microsoft platform – indeed many open source advocates would argue that anything built on a Microsoft platform is not truly open source.  But for a person who is tasked with producing a website that matters little.  But what shouldn’t be skipped over is that DotNetNuke wouldn’t exist without the .NET platform.  And I don’t mean that obviously because of the inclusion of the name, but more that the old VB6/IIS 5/ASP era was just not a good enough design to produce a modular masterpiece like DotNetNuke.  It just wouldn’t have been possible.

.NET Did it Right

The reason that great solutions like DotNetNuke can be built is because of the inherent correctness of the .NET platform.  It’s a true object-oriented platform.  The way the programming languages were designed dumped out all the nasty workarounds and hangabouts caused by trying to maintain backwards compatibility.   This was a true masterstroke of Microsoft, and one which they copped a lot of criticism for.  To build a good .NET application, you had to build it from scratch, you couldn’t upgrade your old code (well, you could, but the results were usually awful).  But by forcing people to start from scratch, everyone could start with a clean sheet of paper.  And, as anyone who has accidentally deleted a first draft will know, the second draft is not only better, it’s written faster as well.

From the in-built memory management to the well-executed ability of .NET code to ‘reflect’ upon itself, .NET was a really good platform to build with.  It’s like the difference between a toolbox full of half-broken, unsuitable tools, and a toolbox full of shiny tools designed exactly for purpose.   Having the ability to select the right tool for each little job, no matter how trivial, means that the finished product always comes out better, with fewer rough edges, and always with a more elegant feel.

And we can tell .NET has been a success.  Not because Microsoft tells us so, but because they’ve never changed the name (well, not since it was released, project names and working titles notwithstanding).    The easiest way to detect a floundering Microsoft product is to look for frequent name changes.    We all can rattle off several products that go through a series of names before quietly being shelved (the various old versions of Microsoft phone operating systems being a prime example).   But .NET is still there, still being used, not being tinkered with.  Visual Studio is still Visual Studio, C# is still C#, with most people being blissfully unaware of how the name came about.  The true measure of developer stickiness, however, is a quick peruse of a jobs site.  And there are still plenty of jobs to be had working in .NET.  Sure, there are newer, ‘hotter’ platforms out there, I’m not a one-eyed Microsoft supporter in the least.  But can I still deliver a cost effective solution to someone who has chosen to use Microsoft based operating systems?  I sure can.  Are there still plenty of people choosing Microsoft Operating systems?  There sure is.  IIS is still the second-highest Web serving platform on the internet, and the best way to deliver websites through IIS is by building an ASP.NET website.

The next 10 years

10 years ago a lot of people I knew were either moving, or seriously considering moving from Microsoft products into Java as a platform.   I haven’t heard someone say that in years.  In fact a couple of the Java people I know are starting to dabble in other platforms and languages, and they tell me that they feel Java has lost its way.  I couldn’t say myself – I’ve been deep into the .NET stack for a decade and haven’t spent much time exploring outside of that.  There has never been a shortage of opportunities for me, there has never been a point where I’ve felt that the platform was going nowhere.   In fact, every time I look up, I find lots of new and interesting stuff coming down the road.

There’s an entirely new Windows version coming along which is destined to bust out of the traditional desktop and onto other devices, there’s lots of new ways of building traditional ASP.NET websites,  there’s Azure cloud services to build, as well as plenty of traditional desktop applications.   The next 10 years is going to see the explosion of web-enabled mobile platforms, either through on-device apps or mobile-optimised website apps.   There’s still a long ways to go in terms of building websites on platforms like DotNetNuke.   Yes, it’s fair to say I still feel the same level of optimism about the future as I did 10 years ago.   I guess I’ll see you in a decade!

What do you think?  Did .NET get it right 10 years ago?  Will it still be around in 10 years time?  What’s your experiences in the last 10 years – please feel free to share in the comments.


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