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();
bỏ phiếu cho những người đó! – JasonS
"bộ thứ hai của mắt" cũng được gọi là "gỡ lỗi vịt cao su", google it :) –