2012-04-20 5 views
2

서버에서 파일을 다운로드 할 수있는 웹 응용 프로그램이 있습니다. 문서는 Office 파일 (.docx, pptx, .xslx) 또는 Pdf 일 수 있습니다.Office 파일을 다운로드하면 파일을 열기 전에 aspx 페이지가 다시로드됩니다.

논리는 매우 간단합니다. 클라이언트 측에서 클릭하면 웹 서비스가 호출되고 필요한 매개 변수를 전달하는 aspx 페이지 (Print.aspx)가 호출됩니다.

protected void Page_Load(object sender, EventArgs e) 
    { 
     string fileName = Request.QueryString["fname"]; 
     if (string.IsNullOrEmpty(documentID) == false) 
     { 
      byte[] document = GetPhysicalFile(documentID); //Get the binaries 
      showDownloadedDoc(document, fileName); 
     } 
    } 

private void showDownloadedDoc(byte[] document, string fileName) 
{ 
Response.Clear(); 
Response.ContentType = contentType; 

Response.AppendHeader("content-disposition", string.Format("attachment; filename=\"{0}\"", fileName)); 
Response.BufferOutput = false; 
Response.BinaryWrite(document); 
Response.Close(); 

} 

PDF 문서는 Print.aspx 페이지에서 열립니다 및 영문 페이지가 한 번만로드 : 인쇄 페이지 선택한 문서의 바이너리를 검색하고 응답을 작성하는 웹 서비스를 호출합니다. Office 파일의 경우 Page_Load() 메서드가 3 번 호출됩니다.

처음으로 문서 열기/저장 대화 상자가 열리고 "열기"를 클릭하면 Page_Load가 두 번 호출 된 후 문서가 마침내 MS Word에서 열립니다.

이러한 문서를 여는 데 여러 페이지가로드되는 것을 방지 할 수있는 방법이 있습니까? 각 액세스에 대한 파일이 만들어지기 때문에 서버 측에 파일을 저장하고 해당 URL로 리디렉션하지 않아야합니다.

+1

이에 대한'GenericHandler'를 사용하지 않는 이유가 거기에 예입니다? ashx – Bazzz

+0

내 접근 방식을 사용하면 사용자가 문서를 다운로드하도록 할 수있는 가장 쉬운 방법이라고 생각했습니다. 응용 프로그램은 회사의 인트라넷에서만 사용됩니다. GenericHandler가 다중 페이지로드로 현재 문제를 해결하는 방법은 무엇입니까? – Francesco

+0

genericHandler를 사용하면 aspx 페이지 (+1, 좋은 아이디어)와 같은 LifeCicle을 가지지 않을 것입니다. – Francesco

답변

1

는 GenericHandler

public void ProcessRequest(HttpContext context) 
{ 

    string filePath; // get from somewhere 
    string contentType; // get from somewhere 

    FileInfo fileInfo = new FileInfo(filePath); 

    context.Response.Clear(); 
    context.Response.ContentType = contentType; 
    context.Response.AddHeader("content-disposition", "attachment; filename=" + Path.GetFilename(filePath)); 
    context.Response.AddHeader("Content-Length", fileInfo.Length.ToString()); 
    context.Response.TransmitFile(filePath); 
} 
+0

내 사건의 해결책이 있는지를보기 위해 대답을 수락하기 전에 기다릴 것입니다. 어쨌든 좋은 힌트와 코드를 위해 또 다른 +1. – Francesco

1

클릭하여 다시 게시 한 다음 응답을 다시 보내서 ViewState에 명령이 완료되었음을 알리고 페이지의 콘텐츠를 업데이트하지 않도록하십시오.

다음 클릭시 이전 명령이 여전히 대기 중이며 페이지별로 재전송됩니다. 이제 두 번의 명령이 있습니다. 두 번의 호출이 있었지만 다시는 viewstate를 다시 업데이트하지 않고 페이지를 다시 호출하도록했습니다. 다시 기다려야합니다.

이 코드는 매번 호출 될 때마다 계속됩니다. 코드 숨김은 실제로 이전 코드를 모두 실행하려고 시도합니다.

이 해결책은 처리기에 대한 직접 링크를 제공하고 아약스가있는 코드에서 호출하지 않는 것입니다. 여기

+0

사실 IIS 재설정 및 코드 배포 후 처음 클릭 할 때도 각 단추를 한 번 클릭 할 때마다 페이지가 3 번로드됩니다. 그러나이 도움이되는지 여부를 aspx 페이지 대신 GenericHandler.ashx 구현 오전. – Francesco

+0

@luca 코드를 넣은 경우 도움이 될만한 이미지가있을 수 있습니다. – Aristos

+0

내가 검색 한 클라이언트에 바이너리를 보내는 데 사용하는 코드를 질문에 추가했습니다. – Francesco

관련 문제