4.5 KiB
created_at | title | url | author | points | story_text | comment_text | num_comments | story_id | story_title | story_url | parent_id | created_at_i | _tags | objectID | year | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2015-07-11T18:38:51.000Z | Zombie Operating Systems and ASP.NET MVC (2009) | http://bitquabit.com/post/zombie-operating-systems-and-aspnet-mvc/ | kreeben | 78 | 15 | 1436639931 |
|
9871014 | 2009 |
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.
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.