2008-12-10 27 views
5

Tôi đã kế thừa ứng dụng kế thừa có nghĩa vụ lấy một bản pdf đang chạy từ máy chủ dịch vụ báo cáo. Tất cả mọi thứ hoạt động tốt cho đến điểm mà bạn cố gắng để mở pdf được trả lại và adobe acrobat nói với bạn:Dịch vụ báo cáo dưới dạng PDF thông qua WebRequest trong C# 3.5 "Loại tệp được hỗ trợ"

Adobe Reader không thể mở 'thisStoopidReport'.pdf' bởi vì nó là một trong hai không phải là một loại tập tin được hỗ trợ hoặc vì tệp đã bị hỏng (ví dụ: ví dụ, tệp đã được gửi dưới dạng email tệp đính kèm và không được chính xác giải mã).

Tôi đã thực hiện một số khắc phục sự cố ban đầu về vấn đề này. Nếu tôi thay thế url trong cuộc gọi WebRequest.Create() với một tệp pdf hợp lệ trên máy cục bộ của tôi, ví dụ: @ "C: temp/validpdf.pdf") thì tôi nhận được một tệp PDF hợp lệ.

Bản thân báo cáo có vẻ hoạt động tốt. Nếu tôi nhập URL theo cách thủ công vào báo cáo dịch vụ báo cáo sẽ tạo tệp pdf tôi được nhắc xác thực người dùng. Nhưng sau khi cung cấp nó tôi nhận được một tập tin pdf hợp lệ.

Tôi đã thay thế url thực, tên người dùng, chuỗi người dùng và chuỗi miền trong mã bên dưới bằng các giá trị không có thật vì lý do hiển nhiên.

 WebRequest request = WebRequest.Create(@"http://x.x.x.x/reportServer?/reports/reportNam&rs:format=pdf&rs:command=render&rc:parameters=blahblahblah"); 
     int totalSize = 0; 
     request.Credentials = new NetworkCredential("validUser", "validPass", "validDomain"); 
     request.Timeout = 360000; // 6 minutes in milliseconds. 
     request.Method = WebRequestMethods.Http.Post; 
     request.ContentLength = 0; 
     WebResponse response = request.GetResponse(); 
     Response.Clear(); 
     BinaryReader reader = new BinaryReader(response.GetResponseStream()); 
     Byte[] buffer = new byte[2048]; 
     int count = reader.Read(buffer, 0, 2048); 
     while (count > 0) 
     { 
      totalSize += count; 
      Response.OutputStream.Write(buffer, 0, count); 
      count = reader.Read(buffer, 0, 2048); 
     } 
     Response.ContentType = "application/pdf"; 
     Response.Cache.SetCacheability(HttpCacheability.Private); 
     Response.CacheControl = "private"; 
     Response.Expires = 30; 
     Response.AddHeader("Content-Disposition", "attachment; filename=thisStoopidReport.pdf"); 
     Response.AddHeader("Content-Length", totalSize.ToString()); 
     reader.Close(); 
     Response.Flush(); 
     Response.End(); 

Trả lời

0

Sự cố của bạn có thể xảy ra khi khai báo mảng byte của bạn với độ dài 2048 thay vì dựa trên độ dài của luồng được trả về bởi GetResponseStream() không?

1

Xem tệp pdf mà bạn lấy lại trong notepad.exe. Tôi nghi ngờ rằng bạn sẽ thấy HTML trong đó. Nếu bạn gọi một trang web là một trang thông qua, nó sẽ cắt lên một tệp pdf. Yêu cầu web sẽ lấy lại HTML không phải là tệp PDF.

Nếu bạn gọi một trang web có tệp pdf trực tiếp, như http://www.somesite.com/file.pdf mã của bạn sẽ hoạt động. Vấn đề là bạn có thể có một thông qua trang web mà ẩn vị trí thực sự của tập tin pdf.

Cách tôi nhận được xung quanh việc này là tạo một tệp DLL ISAPI cho phép bạn chuyển các tham số cần xác định tệp pdf cần gửi lại. Hơn ISAPI DLL sẽ quay trở lại pdf với một loại nội dung của "application/pdf".

1

Những người bạn đã đề xuất vấn đề là HTML quay lại từ URL đã chỉ cho tôi đúng hướng. Trong thực tế đó là khi tôi nhận ra lập trình ban đầu ở đây sử dụng PUT thay vì phương thức GET.

Vì vậy, bằng cách sửa chữa các dòng duy nhất:

request.Method = WebRequestMethods.Http.Post; 

Tất cả mọi thứ bây giờ đã mọc lên hoa hồng ... err pdf ... bất cứ điều gì nó hoạt động.

Cảm ơn bạn đã chỉ cho tôi đúng hướng. Đôi khi nó chỉ mất một bộ thứ hai của mắt.

+0

bỏ phiếu cho những người đó! – JasonS

+0

"bộ thứ hai của mắt" cũng được gọi là "gỡ lỗi vịt cao su", google it :) –

Các vấn đề liên quan