---
created_at: '2015-07-11T18:38:51.000Z'
title: Zombie Operating Systems and ASP.NET MVC (2009)
url: http://bitquabit.com/post/zombie-operating-systems-and-aspnet-mvc/
author: kreeben
points: 78
story_text: ''
comment_text: 
num_comments: 15
story_id: 
story_title: 
story_url: 
parent_id: 
created_at_i: 1436639931
_tags:
- story
- author_kreeben
- story_9871014
objectID: '9871014'

---
In 1973, an operating system called CP/M was born. CP/M had no
directories, and filenames were limited to 8.3 format. To support input
and output from user programs, the pseudofiles `COM1`, `COM2`, `COM3`,
`COM4`, `LPT1`, `LPT2`, `CON`, `AUX`, `PRN`, and `NUL` were provided.

In 1980, Seattle Computer Products decided to make a cheap, approximate
clone of CP/M, called 86-DOS. 86-DOS therefore had no directories,
supported 8.3 file names, and included the pseudofiles `COM1`, `COM2`,
`COM3`, `COM4`, `LPT1`, `LPT2`, `CON`, `AUX`, `PRN`, and `NUL`. Further,
because many programs always saved their files with a specific
extension, [any file with these names and an extension was treated as
identical to the filename without the
extension](http://blogs.msdn.com/oldnewthing/archive/2003/10/22/55388.aspx).

In 1981, Microsoft Corporation purchased the rights to use 86-DOS,
renamed it MS-DOS, and shipped it to customers.

In 1983, Microsoft Corporation released MS-DOS 2.0. MS-DOS 2.0 supported
hierarchical directories. To maintain backwards compatibility with
applications designed for MS-DOS 1.0, which had no concept of
directories, Microsoft placed the pseudofiles `COM1`, `COM2`, `COM3`,
`COM4`, `LPT1`, `LPT2`, `CON`, `AUX`, `PRN`, and `NUL`, with all
possible extensions, in all directories.

In 1988, Microsoft began the development of a modern, preemptively
multitasked, memory-protected, multiuser system loosely based on VMS,
called Windows NT. Windows NT supported a completely new file system
design, called NTFS, modeled on OS/2’s HPFS, which allowed for arbitrary
file names in Unicode UCS-2. To maintain backwards compatibility with
DOS applications running under the new operating system, some of which
were written before DOS had hierarchical directories, Windows NT placed
the pseudofiles `COM1-9`, `LPT1-9`, `CON`, `AUX`, `PRN`, and `NUL`, with
all possible extensions, in all directories. Windows NT shipped to
customers in 1993.

In 1998, Microsoft released the Option Pack to the two-year-old Windows
NT 4.0, containing a new technology called Active Server Pages, or ASP.
ASP allowed the creation of dynamic websites via COM scripting. Because
ASP was file-based, URLs by definition could not include `/com1-9.asp`,
`/lpt1-9.asp`, `/con.asp`, `/aux.asp`, `/prn.asp`, or `/nul.asp`.

In 2002, Microsoft announced the imminent release of the .NET framework.
One component of .NET was ASP.NET, a vast improvement over ASP. Although
ASP.NET provided vastly superior ways to write web pages than those
provided by ASP, the mechanism was still completely based on per-file
web pages—and although this mechanism could be overridden by various
means, for backwards compatibility reasons, ASP.NET always checked for
the existence of a file first before attempting to execute a custom
handler. Thus, web pages could not contain `/com[1-9](\..*)?`,
`/lpt[1-9](\..*)?`, `/con(\..*)?`, `/aux(\..*)?`, `/prn(\..*)?`, or
`/nul(\..*)?`.

In 2009, Microsoft released ASP.NET MVC, a thoroughly modern, orthogonal
web framework supporting the most up-to-date understanding of how to
architect well-factored, scalable web applications. ASP.NET MVC broke
free of the per-file emphasis of previous frameworks, instead
emphasizing regex-based URL dispatching, similar to popular scripting
frameworks such as Django, Rails, and Catalyst. These URLs did not map
to files; they instead mapped to objects that were designed to handle
the request. Thus, URLs could be built entirely on what made logical
sense, rather than on the confines of what the file system dictated.

But ASP.NET MVC was based on ASP.NET. Which checks for the existence of
a file before running any scripts. Which means it will check directories
that have `COM1-9`, `LPT1-9`, `CON`, `AUX`, `PRN`, and `NUL` in them,
with any extension.

And that is why, in 2009, when developing in Microsoft .NET 3.5 for
ASP.NET MVC 1.0 on a Windows 7 system, [you cannot include
`/com\d(\..*)?`, `/lpt\d(\..*)?`, `/con(\..*)?`, `/aux(\..*)?`,
`/prn(\..*)?`, or `/nul(\..*)?` in any of your
routes](http://stackoverflow.com/questions/987105/asp-net-mvc-routing-vs-reserved-filenames-in-windows).
