Hashemian Blog

Web Tools, Financial Markets, Technology

Thursday, November 13, 2008

ASP.NET Response.TransmitFile File Locking 

If you use the Response.TransmitFile method in your ASP.NET pages, there is a good chance that the file being transmitted is locked and unavailable for writing during that operation. TransmitFile was introduced with .NET V2.0 and it's supposed to be a more optimized version of WriteFile.

For months I had been dogged with exception alerts when a scheduled program was trying to update files used in TransmitFile. As the alerts were intermittent and the files would eventually get updated by the program, I would just ignore the messages. But today I decided to take a closer look and discovered that TransmitFile is to blame for the files being locked.

As I understand, TransmitFile in ASP.NET makes use of the Windows TransmitFile API function which directly streams a file to an open socket. It is more optimized than WriteFile which buffers the entire content of the file before emitting it. In that sense, WriteFile consumes precious memory and processing resources, switching between kernel and user modes, to accomplish its work.

While TransmitFile API function is optimized, care must be taken to avoid having the streamed data getting mixed with other data and my hunch is that some locking mechanism is used to assure an orderly and sequential transmission of data under ASP.NET. That's all fine until one needs to write to the file which could get shot down while the lock is still active. I was able to reproduce this behavior in a loop where a file is continuously updated and then streamed via TransmitFile. Here’s a simple example:
void Page_Load() {
Response.Buffer=false;
for(;;) {
System.IO.File.WriteAllText(MapPath("/test.txt"), DateTime.Now.ToString());
System.Threading.Thread.Sleep(100);
Response.TransmitFile(MapPath("/test.txt"));
Response.Write("<br>");
}
}

Running this ASP.NET page invariably lead to an exception being thrown. I then changed the code as shown below:
void Page_Load() {
Response.Buffer=false;
for(;;) {
System.IO.File.WriteAllText(MapPath("/test.txt"), DateTime.Now.ToString());
System.Threading.Thread.Sleep(100);
// CHANGED LINE BELOW
Response.Write(System.IO.File.ReadAllText(MapPath("/test.txt")));
Response.Write("<br>");
}
}

I ran the page a number of times and no exception was thrown. I'm sure that ReadAllText is nowhere as optimized as TransmitFile, but I would readily take the performance penalty over the unpredictable exceptions. Incidentally, WriteFile proved to be no better than TransmitFile in locking the file.

Based on the simple test I have concluded that TransmitFile or WriteFile should be used when the file is never or rarely updated. If the file is to be updated frequently, ReadAllText (or other System.IO file reading operations) is the way to go. But if someone can disprove my tenuous theory, by all means.

,,,

Labels: ,

<ASP.NET Response.TransmitFile File Locking>

0 comments

0 Comments:

Post a Comment

This page is powered by Blogger. Isn't yours?

Links
  • Hashemian Blog Feeds
  • Add to Google
  • Read Hashemian.com/blog/ with Bloglines
  • Subscribe to Hashemian.com/blog/ with My Yahoo!
  • Technorati Profile
  • TMCnet.com
  • ARCHIVES
  • 09/01/2003 - 10/01/2003
  • 03/01/2004 - 04/01/2004
  • 04/01/2004 - 05/01/2004
  • 05/01/2004 - 06/01/2004
  • 06/01/2004 - 07/01/2004
  • 07/01/2004 - 08/01/2004
  • 08/01/2004 - 09/01/2004
  • 09/01/2004 - 10/01/2004
  • 10/01/2004 - 11/01/2004
  • 11/01/2004 - 12/01/2004
  • 12/01/2004 - 01/01/2005
  • 01/01/2005 - 02/01/2005
  • 02/01/2005 - 03/01/2005
  • 03/01/2005 - 04/01/2005
  • 04/01/2005 - 05/01/2005
  • 05/01/2005 - 06/01/2005
  • 06/01/2005 - 07/01/2005
  • 07/01/2005 - 08/01/2005
  • 08/01/2005 - 09/01/2005
  • 09/01/2005 - 10/01/2005
  • 10/01/2005 - 11/01/2005
  • 11/01/2005 - 12/01/2005
  • 12/01/2005 - 01/01/2006
  • 01/01/2006 - 02/01/2006
  • 02/01/2006 - 03/01/2006
  • 03/01/2006 - 04/01/2006
  • 04/01/2006 - 05/01/2006
  • 05/01/2006 - 06/01/2006
  • 06/01/2006 - 07/01/2006
  • 07/01/2006 - 08/01/2006
  • 08/01/2006 - 09/01/2006
  • 09/01/2006 - 10/01/2006
  • 10/01/2006 - 11/01/2006
  • 11/01/2006 - 12/01/2006
  • 12/01/2006 - 01/01/2007
  • 01/01/2007 - 02/01/2007
  • 02/01/2007 - 03/01/2007
  • 03/01/2007 - 04/01/2007
  • 04/01/2007 - 05/01/2007
  • 05/01/2007 - 06/01/2007
  • 06/01/2007 - 07/01/2007
  • 07/01/2007 - 08/01/2007
  • 08/01/2007 - 09/01/2007
  • 09/01/2007 - 10/01/2007
  • 10/01/2007 - 11/01/2007
  • 11/01/2007 - 12/01/2007
  • 12/01/2007 - 01/01/2008
  • 01/01/2008 - 02/01/2008
  • 02/01/2008 - 03/01/2008
  • 03/01/2008 - 04/01/2008
  • 04/01/2008 - 05/01/2008
  • 05/01/2008 - 06/01/2008
  • 06/01/2008 - 07/01/2008
  • 07/01/2008 - 08/01/2008
  • 08/01/2008 - 09/01/2008
  • 09/01/2008 - 10/01/2008
  • 10/01/2008 - 11/01/2008
  • 11/01/2008 - 12/01/2008
  • 12/01/2008 - 01/01/2009

  • Read Financial Markets  |   Home  |   Blog  |   Web Tools  |   News  |   Articles  |   FAQ  |   About  |   Contact

    © 2001-2009 Robert Vahid Hashemian
    Support the effort
    Liked this page?
    Please consider creating a link to it
    from your Web site.

    hashemian.com
    هاشمیان.com

     Home

     Blog

     Web Tools Add Free Web Tools custom Google Toolbar button (Requires Toolbar >V4)
    Usage

     News

     Articles

     FAQ

     About

     Contact

     Financial Markets Book
    Read Complete Book



    BOOK
    The ASP.Net 2.0 Anthology: 101 Essential Tips, Tricks & Hacks
    Phil Haack
    $39.95


    BOOK
    ASP.NET 3.5 Enterprise Application Development with Visual Studio 2008: Problem Design Solution (Wrox Programmer to Programmer)
    Vincent Varallo
    $49.99


    BOOK
    Pro ASP.NET 3.5 in C# 2008 [PRO ASPNET 35 IN C# 2008 2/E]
    Matthew(Author) ; Szpuszta, Mario(Author) MacDonald


    BOOK
    Beginning ASP.NET 3.5 in VB 2008: From Novice to Professional [BEGINNING ASPNET 35 IN V-2 -OS]
    Matthew(Author) MacDonald

    BOOK
    ASP.NET 3.5 Ajax Unleashed   [ASPNET 3.5 AJAX UNLEASHED] [Paperback]
    Robert Hill(Author) Foster

    |aspnet-responsetransmitfile-file|

    more…




    Get Kindle, $259

    aStore - Hashemian.com on Amazon

    Visits: Powered by hashemian.com

     

     

     

     

     

    Search Hashemian.com





    SUPERSAFE MINT SHEET FILE (24 PAGES)
    $22.49
    Ends: Wed Nov 25, 2009 08:28:50 EST


    5 pc. diamond needle file sets
    $5.75
    Ends: Wed Nov 25, 2009 08:33:07 EST


    ROLODEX OPEN TRAY CARD FILE DESK ORGANIZER # 67367 NIB
    $2.00
    Ends: Wed Nov 25, 2009 08:40:55 EST


    SUPERSAFE MINT SHEET FILE (32 PAGES)
    $25.99
    Ends: Wed Nov 25, 2009 08:51:52 EST


    AYANO YAMANE clear file holder promo mint!/BL YAOI
    $5.00
    Ends: Wed Nov 25, 2009 08:58:03 EST

    more…