We all celebrate our various holidays differently. Some decorate the house, some sing songs and then there is the BlogEngine.NET team. They decided that the best way to celebrate Christmas this year was to release a new version of BlogEngine.NET. Also, they didn't need the sleep and thought what the heck. The previous version was downloaded more than 31 thousand times in just 2½ months, so it will be exciting to see how the 1.3 release will compare to that.

So what’s new?

The 1.3 release started out as a service release called 1.2.5, but we came to realize that it was much bigger than half a version normally would be, so we upgraded the version number. Almost every file in the code base has been changed since 1.2.

A lot of the changes are not very apparent or immediately visible, but some are so let’s start with those.

Extension manager

The new extension manager puts you in control over the extensions you use. You can enable/disable them and you can change the settings on the extensions that use the new settings mechanism. You’ll find the extension manager in the admin section.

Windows Live Writer (WLW) extravaganza

WLW has been supported since version 1.0, but this time we take full advantage of all the features it supports. You can now create and edit both posts and pages, set the Slug, keyword and description and a lot of other stuff as well from within WLW.

Mobile theme

Whenever a mobile device is browsing your site, you have the ability to choose an alternate theme that is more suited for mobile devices to be applied. This version has such a theme pre-selected and it is called Mobile. You can create your own themes and assign them to the mobile devices.

Editors have less permission

Non-admin users have been able to modify and delete posts they didn’t write. Also delete and approve comments on someone else’s posts. They cannot do that anymore. Now an Editor can only delete and edit her own posts.

Importer

We had some trouble with the original BlogML and RSS/ATOM importer tool, but now everything has been fixed and you should find it very easy to import your old posts to BlogEngine.NET.

Here is a list of some of the not so visible features.

  1. User control injection now supports properties.
  2. Mono is now fully supported out of the box.
  3. Trackbacks and pingbacks can now be turned on and off for both sending and receiving.
  4. Much prettier URLs for archived posts and the calendar.
  5. Slug now remove accents so e.g. ä becomes a automatically.
  6. Navigational links are added on top of each post in single post view (can be turned off).
  7. Comment and contact e-mails contain a lot more information about the author.
  8. Users and roles are much easier to manage. No more XML file editing.
  9. More events for extension builders including use of CancelEventArgs.
  10. The code has been refactored and is now even simpler.
  11. Default installation produces a YSlow score of 80 (B).
  12. TagCloud can remove tags containing less than n posts.
  13. Related posts now also contain pages.
  14. BBCode can be used when writing comments.
  15. A JavaScript HTTP handler compresses and minifies local and remote .js files.
  16. Referential integrity enforced in the SQL provider.
  17. IDataErrorInfo, INotifyPropertyChanged and IChangeTracking interfaces added to the base class.
  18. Non-admin users can now change their own password

And a lot more…

Go get BlogEngine.NET 1.3 now.

Happy holidays

I’ve been working on the URL structure on the upcoming version of BlogEngine.NET. In the current version, the URL wasn’t very pretty when viewing posts on certain dates or all posts in a month. It looked like this for a specific date:

example.com/blog/?date=2007-12-19

and like this for a specific month in a year:

example.com/blog/?year=2007&month=12

That’s the way they have looked since BlogEngine.NET 1.0 and I must admit they look awful. I just never gave it much thought to improve on them.

Then the other day I gave it some thought and for some stupid reason, I thought it would be cool to use the PathInfo part of the URL instead of the query string. So now the URLs looked like this:

example.com/blog/default.aspx/2007/12/19/

and

example.com/blog/default.aspx/2007/12/

This was of course an improvement since they became much more similar and used the same logical structure. The problem is that by using the PathInfo without some kind of URL rewriting at the same time, the relative root URL changes from /blog/ into /blog/default.aspx/2007/12/19/ which of course ruins a lot of things.

Today I finally saw the light. I have no idea why it took me so long, but I guess that late is better than never. The URLs now look like this:

example.com/blog/2007/12/19/default.aspx

and

example.com/blog/2007/12/default.aspx

and because I saw the light I’ve also added the next logical step, which is to display all posts in a given year like so:

example.com/blog/2007/default.aspx

What’s really stupid is that every other blog platform uses this URL structure. I must have had my head up my butt. When I was at it I also changed the calendar URL from

example.com/blog/default.aspx?calendar=show

to

example.com/blog/calendar/default.aspx

All the old URLs still work, so no links will be broken.

The .aspx extension

Now you might wonder why the default.aspx is needed at the end of the URLs. If I had a choice about it, trust me, it would be history. The thing is that on hosted servers where you cannot touch the IIS you will not be able to pass all incoming requests to the ASP.NET ISAPI filter. Only a few extensions including .aspx do. So in order to make sure the URL will work on those servers, we need the .aspx extension. It didn’t have to be default.aspx it could be anything ending with .aspx, but I thought default.aspx was one people had seen before and wasn’t confused about.

We’ll have to wait for IIS 7 to be released before we can construct URLs without the .aspx extension on hosted servers.

You can test the new URL on this blog.