views:

88

answers:

3

EDIT 2

It appears that moving the object tag in the Dom is the cause of the problem. I added an iframe directly to the page and it works fine without any problems.

However, when I move that iFrame into a modal dialogue box (http://www.ericmmartin.com/projects/simplemodal/) the PDF disappears (the object tag no longer renders correctly).

So it appears that it's no longer a question about my handler, but more a question about why moving the "object" (or embed) tag in the DOM (which lives inside an iFrame) causes it to "blank-out."

Also, when the pdf is moved from the modal dialogue back to its original position, it appears correctly. So, perhaps I should focus more on the modal dialogue itself.

Thoughts? Thanks for your suggestions thus far.


EDIT 1

So I've made some modifications for testing.

I've got the iframe to output an object tag for pdf requests along with the server time.

Response.AddHeader("content-type", "text/html");
WebClient client = new WebClient();
Response.Write("<html><head></head><body><h1>"+ DateTime.Now.ToString() + "</h1><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='application/pdf' /></body></html>");
Response.Flush();
Response.Close();
Response.End();

Now I get a page with the current time correctly, but the object only displays the PDF the first time after I publish the aspx page. So it appears to be some sort of caching issue? Except that the object isn't loading anything (not even the previously loaded PDF).

If right click on the iframe and refresh the page, the object loads up fine. (The same is true if I use an embed tag).


Original Question

I know there are a lot of questions on this...

But they either weren't answered, or the answer didn't work.

Environment

  • .Net 4
  • Adobe 9.3.4
  • IIS 5.1
  • XP sp3
  • VS 2010
  • IE 8.0.6001.18702

Background

The pdf's I'm streaming come from a storage repository where the files don't have any extensions (this is done for security). I look up the file in the database and stream it back to the client via the following code:

Response.Clear();
WebClient client = new WebClient();
Byte[] buffer = client.DownloadData(sPath);
Response.AddHeader("content-length", buffer.Length.ToString());
Response.AddHeader("content-disposition", "inline;filename=" + fileName);
Response.AddHeader("expires", "0");
Response.AddHeader("Content-Type", "application/pdf"); //this is usually dynamic to support other types (doc, xls, txt, etc.)
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
Response.Close();
Response.End();

This works for every file type (doc, txt, xls, html) when used directly in the browser or in the iframe (displayed as a modal popup) with the exception of pdf files. They do not work reliably when accessed via the iframe, but work fine when accessed directly in the browser.

The only time it does work is the first time I request a document after I publish the aspx page that is serving these files. All subsequent hits return a blank page (even from new tabs or browser windows). Firefox reliably displays the pdf every time regardless.

Attempted Solutions

I've tried various ways I of streaming the file:

Response.TransmitFile(sPath);
Response.WriteFile(sPath);
//As well as some others

I've tried adding .pdf to a parameter at the end of the request

http://www.myurl.aspx?File=test.pdf

I've tried making the URL unique by adding a time stamp

http://www.myurl.aspx?File=test.pdf&amp;Unique=Friday__September_17__2010_12_02_16_PM

Un-Attempted

I've read about IIS compression causing problems, but it was for a newer version of IIS.

Didn't try using embed tag since I would like to stick to the iFrame if possible (The existing infrastructure uses it).

Any help would be greatly appreciated!!!

Thanks.

+1  A: 

I had a similar problem that arose when the PDFs were streaming over SSL (IE only, FF didn't exhibit the issue) that was only solved by doing the following:

Response.ClearHeaders();
Response.ClearContent();
Response.Buffer = true;

Response.AppendHeader("Content-Disposition", "inline; attachment; filename=Filename.pdf");
Response.ContentType = "application/pdf";

Response.WriteFile(path);

Response.Flush();
Response.End();
Forgotten Semicolon
Thanks, but now I get the same behavior with the exception that the file is downloaded and opened in the native application. This still only works the first time after I publish my site.
Brandon Boone
A: 

I'm not sure that you need to set the filename, especially if it doesn't have the .pdf extension. When streaming PDFs to browser in the past, I've always used this code:

Response.Clear();
Response.ContentType = "application/pdf";
Response.BinaryWrite(pdfBuffer);
Response.Flush();

Otherwise, there's a possibility that something has hosed over the registry settings for the application/pdf CLSID on the client computer.

AJ
Thanks @AJ , I tried this but I'm getting the same result. I think the problem is more of a caching issues of sorts (see my edit above).
Brandon Boone
A: 

So I gave up and decided to use a standard IE popup window instead.

window.open(URL, 'Window', 'height=' + pageHeight + ',width=' + pageWidth + ',top=0,left=0,resizable');

I had to render the pdfs in an object tag and everything else inside an iframe within the popup for it to work, but it works...

if (sDocType == "pdf")
{
    Response.AddHeader("content-type", "text/html");
    WebClient client = new WebClient();
    Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><object height='100%' width='100%' name='plugin' data='" + Request.Url.ToString() + "&embed=true' type='" + zGetContentType(HttpContext.Current.Request.QueryString["docType"]) + "'><param name='src' value='" + Request.Url.ToString() + "&embed=true' />alt : <a href='" + Request.Url.ToString() + "&embed=true'>View</a></object></body></html>");
    Response.Flush();
    Response.Close();
    Response.End();
}
else
{
    Response.AddHeader("content-type", "text/html");
    WebClient client = new WebClient();
    Response.Write("<html style='margin:0px;padding:0px;'><head></head><body style='margin:0px;padding:0px;'><iframe frameborder='0' scrolling='no' height='100%' width='100%' src='" + Request.Url.ToString() + "&embed=true' /></body></html>");
    Response.Flush();
    Response.Close();
    Response.End();
}
Brandon Boone