ASP.NET 2.0/C# Response to client is masterpage instead of file.

Discussion in 'ASP .Net' started by Michael D. Ober, Jul 31, 2007.

  1. When I single step through the code below, it sends back the PDF file that
    is retrieved in the line fm.GetAccountPDF(...). When I run without single
    stepping, I get the master page for this page. I have actually saved the
    file returned by IE 7 as a text file and opened it in notepad, so I have
    confirmed that it is indeed the page master being returned. The code is in
    the code behind file for the aspx page and is called directly from a link on
    the page. In all cases, the PDF file is correctly created on the server and
    I can open it directly from Windows Explorer. This code is actually
    slightly modified from the code in MS TechNet article 812406
    http://support.microsoft.com/kb/812406/en-us.

    What am I doing wrong?

    Thanks,
    Mike Ober.


    protected void StreamFile(object sender, EventArgs e)
    {
    const int ChunkSize = 8192; // Use a cluster size multiple for performance
    FileManager fm = null;
    System.IO.Stream iStream = null;
    try {
    fm = new FileManager((ASPNET2VAX.Core)Session["vax"]);
    try {
    System.IO.FileInfo fiPDF =
    fm.GetAccountPDF(Request.QueryString["id"]);
    // Total bytes to read:
    long dataToRead = fiPDF.Length;
    Response.Clear();
    Response.AppendHeader("Content-Disposition", "attachment; filename=" +
    fiPDF.Name);
    Response.AppendHeader("Content-Length", dataToRead.ToString());
    Response.ContentType =
    ASPNET2VAX.SupportRoutines.LookupMIMEType(fiPDF);
    // Now write the file
    // Buffer to read sytes in chunks:
    byte[] buffer;
    // Length of the file:
    int length;
    // Open the file.
    iStream = new System.IO.FileStream(fiPDF.FullName,
    System.IO.FileMode.Open,
    System.IO.FileAccess.Read,
    System.IO.FileShare.Read);
    // Read the bytes.
    while (dataToRead > 0) {
    // Verify that the client is connected.
    if (Response.IsClientConnected) {
    // Read the data in buffer.
    buffer = new byte[ChunkSize];
    length = iStream.Read(buffer, 0, ChunkSize);
    // Write the data to the current output stream.
    Response.OutputStream.Write(buffer, 0, length);
    // Flush the data to the HTML output.
    Response.Flush();
    // Update our position
    dataToRead = dataToRead - length;
    } else {
    //prevent infinite loop if user disconnects
    dataToRead = -1;
    }
    }
    Response.End();

    } catch (Exception ex) {
    hgc_outputMsg.InnerHtml += ex.Message;

    } finally {
    if (iStream != null) {
    iStream.Close();
    }
    }

    } catch {
    Response.Redirect(SingularityLibrary.config.CoreConfiguration.appPath(Request).ToString()
    + "/" + Wakefield.Core.Config.WakefieldConfig.ClientLoginPage);
    }
    }
     
    Michael D. Ober, Jul 31, 2007
    #1
    1. Advertising

  2. Updated information - the content I get back is the HTML (up to the length
    of the file size) of the page requesting the file. Here's the new code that
    uses the Response.TransmitFile() function.

    protected void StreamFile(object sender, EventArgs e)
    {
    System.IO.Stream iStream = null;
    try {
    FileManager fm = new FileManager((ASPNET2VAX.Core)Session["vax"]);
    System.IO.FileInfo fiPDF =
    fm.GetAccountPDF(Request.QueryString["id"]);

    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment; filename=" +
    fiPDF.Name);
    Response.AddHeader("Content-Length", fiPDF.Length.ToString());
    Response.ContentType =
    ASPNET2VAX.SupportRoutines.LookupMIMEType(fiPDF);
    Response.TransmitFile(fiPDF.FullName);

    } catch (Exception ex) {
    hgc_outputMsg.InnerHtml += ex.Message;
    } finally {
    if (iStream != null) {
    iStream.Close();
    }
    }
    }

    Mike.

    "Michael D. Ober" <obermd.@.alum.mit.edu.nospam> wrote in message
    news:...
    > When I single step through the code below, it sends back the PDF file that
    > is retrieved in the line fm.GetAccountPDF(...). When I run without single
    > stepping, I get the master page for this page. I have actually saved the
    > file returned by IE 7 as a text file and opened it in notepad, so I have
    > confirmed that it is indeed the page master being returned. The code is
    > in the code behind file for the aspx page and is called directly from a
    > link on the page. In all cases, the PDF file is correctly created on the
    > server and I can open it directly from Windows Explorer. This code is
    > actually slightly modified from the code in MS TechNet article 812406
    > http://support.microsoft.com/kb/812406/en-us.
    >
    > What am I doing wrong?
    >
    > Thanks,
    > Mike Ober.
    >
    >
    > protected void StreamFile(object sender, EventArgs e)
    > {
    > const int ChunkSize = 8192; // Use a cluster size multiple for
    > performance
    > FileManager fm = null;
    > System.IO.Stream iStream = null;
    > try {
    > fm = new FileManager((ASPNET2VAX.Core)Session["vax"]);
    > try {
    > System.IO.FileInfo fiPDF =
    > fm.GetAccountPDF(Request.QueryString["id"]);
    > // Total bytes to read:
    > long dataToRead = fiPDF.Length;
    > Response.Clear();
    > Response.AppendHeader("Content-Disposition", "attachment; filename="
    > + fiPDF.Name);
    > Response.AppendHeader("Content-Length", dataToRead.ToString());
    > Response.ContentType =
    > ASPNET2VAX.SupportRoutines.LookupMIMEType(fiPDF);
    > // Now write the file
    > // Buffer to read sytes in chunks:
    > byte[] buffer;
    > // Length of the file:
    > int length;
    > // Open the file.
    > iStream = new System.IO.FileStream(fiPDF.FullName,
    >
    > System.IO.FileMode.Open,
    >
    > System.IO.FileAccess.Read,
    >
    > System.IO.FileShare.Read);
    > // Read the bytes.
    > while (dataToRead > 0) {
    > // Verify that the client is connected.
    > if (Response.IsClientConnected) {
    > // Read the data in buffer.
    > buffer = new byte[ChunkSize];
    > length = iStream.Read(buffer, 0, ChunkSize);
    > // Write the data to the current output stream.
    > Response.OutputStream.Write(buffer, 0, length);
    > // Flush the data to the HTML output.
    > Response.Flush();
    > // Update our position
    > dataToRead = dataToRead - length;
    > } else {
    > //prevent infinite loop if user disconnects
    > dataToRead = -1;
    > }
    > }
    > Response.End();
    >
    > } catch (Exception ex) {
    > hgc_outputMsg.InnerHtml += ex.Message;
    >
    > } finally {
    > if (iStream != null) {
    > iStream.Close();
    > }
    > }
    >
    > } catch {
    >
    > Response.Redirect(SingularityLibrary.config.CoreConfiguration.appPath(Request).ToString()
    > + "/" + Wakefield.Core.Config.WakefieldConfig.ClientLoginPage);
    > }
    > }
    >
     
    Michael D. Ober, Aug 1, 2007
    #2
    1. Advertising

  3. Re: ASP.NET 2.0/C# Response to client is masterpage instead of file. (SOLVED)

    The problem I was having was that the PDF file was being created by a VMS
    server, writing to a Windows Storage Server via NFS, and then not being
    available for the open or TransmitFile functions. Solution involved
    creating a loop that would try to open the file for read in exclusive mode.
    If the open failed, sleep for a second and try again. What a kludge.
    Here's the code:

    protected void StreamFile(object sender, EventArgs e)
    {
    hgc_outputMsg.InnerHtml = "";
    try {
    FileManager fm = new FileManager((ASPNET2VAX.Core)Session["vax"]);
    System.IO.FileInfo fiPDF =
    fm.GetAccountPDF(Request.QueryString["id"]);
    System.IO.FileStream TestForLock = null;
    while (TestForLock == null) {
    try {
    TestForLock = new System.IO.FileStream(fiPDF.FullName,

    System.IO.FileMode.Open,

    System.IO.FileAccess.Read,

    System.IO.FileShare.None);
    } catch {
    System.Threading.Thread.Sleep(new System.TimeSpan(0,0,1));
    }
    }
    if (TestForLock != null)
    TestForLock.Close();

    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment; filename=" +
    fiPDF.Name);
    Response.AddHeader("Content-Length", fiPDF.Length.ToString());
    Response.ContentType =
    ASPNET2VAX.SupportRoutines.LookupMIMEType(fiPDF);
    Response.TransmitFile(fiPDF.FullName);
    } catch (Exception ex) {
    hgc_outputMsg.InnerHtml += ex.Message + "<BR />";
    }
    }

    I also discovered that you don't need the Content-Length header when using
    Transmit File, at least with IE 7, but left it in for other browsers.

    Mike.

    "Michael D. Ober" <obermd.@.alum.mit.edu.nospam> wrote in message
    news:%...
    > Updated information - the content I get back is the HTML (up to the length
    > of the file size) of the page requesting the file. Here's the new code
    > that uses the Response.TransmitFile() function.
    >
    > protected void StreamFile(object sender, EventArgs e)
    > {
    > System.IO.Stream iStream = null;
    > try {
    > FileManager fm = new FileManager((ASPNET2VAX.Core)Session["vax"]);
    > System.IO.FileInfo fiPDF =
    > fm.GetAccountPDF(Request.QueryString["id"]);
    >
    > Response.Clear();
    > Response.AddHeader("Content-Disposition", "attachment; filename=" +
    > fiPDF.Name);
    > Response.AddHeader("Content-Length", fiPDF.Length.ToString());
    > Response.ContentType =
    > ASPNET2VAX.SupportRoutines.LookupMIMEType(fiPDF);
    > Response.TransmitFile(fiPDF.FullName);
    >
    > } catch (Exception ex) {
    > hgc_outputMsg.InnerHtml += ex.Message;
    > } finally {
    > if (iStream != null) {
    > iStream.Close();
    > }
    > }
    > }
    >
    > Mike.
    >
    > "Michael D. Ober" <obermd.@.alum.mit.edu.nospam> wrote in message
    > news:...
    >> When I single step through the code below, it sends back the PDF file
    >> that is retrieved in the line fm.GetAccountPDF(...). When I run without
    >> single stepping, I get the master page for this page. I have actually
    >> saved the file returned by IE 7 as a text file and opened it in notepad,
    >> so I have confirmed that it is indeed the page master being returned.
    >> The code is in the code behind file for the aspx page and is called
    >> directly from a link on the page. In all cases, the PDF file is
    >> correctly created on the server and I can open it directly from Windows
    >> Explorer. This code is actually slightly modified from the code in MS
    >> TechNet article 812406 http://support.microsoft.com/kb/812406/en-us.
    >>
    >> What am I doing wrong?
    >>
    >> Thanks,
    >> Mike Ober.
    >>
    >>
    >> protected void StreamFile(object sender, EventArgs e)
    >> {
    >> const int ChunkSize = 8192; // Use a cluster size multiple for
    >> performance
    >> FileManager fm = null;
    >> System.IO.Stream iStream = null;
    >> try {
    >> fm = new FileManager((ASPNET2VAX.Core)Session["vax"]);
    >> try {
    >> System.IO.FileInfo fiPDF =
    >> fm.GetAccountPDF(Request.QueryString["id"]);
    >> // Total bytes to read:
    >> long dataToRead = fiPDF.Length;
    >> Response.Clear();
    >> Response.AppendHeader("Content-Disposition", "attachment; filename="
    >> + fiPDF.Name);
    >> Response.AppendHeader("Content-Length", dataToRead.ToString());
    >> Response.ContentType =
    >> ASPNET2VAX.SupportRoutines.LookupMIMEType(fiPDF);
    >> // Now write the file
    >> // Buffer to read sytes in chunks:
    >> byte[] buffer;
    >> // Length of the file:
    >> int length;
    >> // Open the file.
    >> iStream = new System.IO.FileStream(fiPDF.FullName,
    >>
    >> System.IO.FileMode.Open,
    >>
    >> System.IO.FileAccess.Read,
    >>
    >> System.IO.FileShare.Read);
    >> // Read the bytes.
    >> while (dataToRead > 0) {
    >> // Verify that the client is connected.
    >> if (Response.IsClientConnected) {
    >> // Read the data in buffer.
    >> buffer = new byte[ChunkSize];
    >> length = iStream.Read(buffer, 0, ChunkSize);
    >> // Write the data to the current output stream.
    >> Response.OutputStream.Write(buffer, 0, length);
    >> // Flush the data to the HTML output.
    >> Response.Flush();
    >> // Update our position
    >> dataToRead = dataToRead - length;
    >> } else {
    >> //prevent infinite loop if user disconnects
    >> dataToRead = -1;
    >> }
    >> }
    >> Response.End();
    >>
    >> } catch (Exception ex) {
    >> hgc_outputMsg.InnerHtml += ex.Message;
    >>
    >> } finally {
    >> if (iStream != null) {
    >> iStream.Close();
    >> }
    >> }
    >>
    >> } catch {
    >>
    >> Response.Redirect(SingularityLibrary.config.CoreConfiguration.appPath(Request).ToString()
    >> + "/" + Wakefield.Core.Config.WakefieldConfig.ClientLoginPage);
    >> }
    >> }
    >>

    >
    >
     
    Michael D. Ober, Aug 1, 2007
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?QWxleCBNYWdoZW4=?=

    MasterPage -> Page -> MasterPage Code Access

    =?Utf-8?B?QWxleCBNYWdoZW4=?=, Apr 10, 2006, in forum: ASP .Net
    Replies:
    3
    Views:
    7,946
    Steven Cheng[MSFT]
    Apr 14, 2006
  2. ThunderMusic
    Replies:
    2
    Views:
    473
    Gregory Gadow
    Sep 27, 2006
  3. Randy Smith
    Replies:
    9
    Views:
    464
    Mark Rae
    Apr 14, 2007
  4. mr t
    Replies:
    0
    Views:
    440
  5. Torben Laursen
    Replies:
    4
    Views:
    597
    clintonG
    Mar 15, 2008
Loading...

Share This Page