2012-06-05 37 views
8

Tôi đã có một máy chủ dịch vụ báo cáo đã chạy một số báo cáo và bây giờ tôi cần tạo chúng thông qua trang web tùy chỉnh (chạy asp.net MVC3).Dịch vụ báo cáo: Nhận bản PDF của báo cáo được tạo

Tôi cần truy xuất báo cáo này dưới dạng luồng/byte để gửi cho người dùng. Không có "trình xem báo cáo" hay như vậy.

Thời gian qua tôi đã sử dụng dịch vụ báo cáo là sql 2005 và Chúng tôi nên quảng cáo dưới dạng tham chiếu đến tệp asmx tối nghĩa.

Có gì bây giờ, với báo cáo máy chủ sql 2008 R2, .Net4 và studio hình ảnh 2010? Tôi không thể tìm thấy một hướng dẫn giải thích toàn bộ điều.

(trong thực tế, tôi không thể tìm thấy một hướng dẫn mà không có xem báo cáo cho SQL 2008 R2)

+1

Tôi nghĩ bạn đang nói về việc truy cập SSRS đến thứ API dịch vụ web điện tử. Chính xác là gì * tối nghĩa * về dịch vụ web đó? – Yuck

Trả lời

15

Một số phương pháp được cung cấp tại MSDN. Tôi đã sử dụng URL access thường cho các nút PDF đơn giản nhanh chóng trong ứng dụng ASP .NET.

Đây là một đoạn mã hack nhanh chóng thực hiện việc này. Nó có thể được dọn dẹp để sử dụng xác thực tích hợp và có nhiều cách bạn có thể lưu trữ tên báo cáo. (Tôi cắt và dán này từ một số mã cũ tôi đã có sẽ lưu trữ một bản báo cáo đến một cơ sở dữ liệu và sau đó có thể trở lại mà từ db.

// First read in the report into memory. 

string strReportUser = "RSUserName"; 
string strReportUserPW = "MySecretPassword"; 
string strReportUserDomain = "DomainName"; 

string sTargetURL = "http://SqlServer/ReportServer?" + 
    "/MyReportFolder/Report1&rs:Command=Render&rs:format=PDF&ReportParam=" + 
    ParamValue; 

HttpWebRequest req = 
     (HttpWebRequest)WebRequest.Create(sTargetURL); 
req.PreAuthenticate = true; 
req.Credentials = new System.Net.NetworkCredential(
    strReportUser, 
    strReportUserPW, 
    strReportUserDomain); 

HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse(); 

Stream fStream = HttpWResp.GetResponseStream(); 




//Now turn around and send this as the response.. 
byte[] fileBytes = ReadFully(fStream); 
// Could save to a database or file here as well. 

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AddHeader(
    "content-disposition", 
    "attachment; filename=\"Report For " + 
     ParamValue + ".pdf\""); 
Response.BinaryWrite(fileBytes); 
Response.Flush(); 
HttpWResp.Close(); 
Response.End(); 

ReadFully là

public static byte[] ReadFully(Stream input) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     input.CopyTo(ms); 
     return ms.ToArray(); 
    } 
} 
+0

Nhưng, cách quản lý nhận dạng? Bởi vì tất cả người dùng không nên có quyền truy cập vào các dịch vụ báo cáo, phải không? – J4N

+0

Bạn có thể chỉ cho tôi đến đúng lớp/ví dụ để lấy báo cáo từ SSRS từ URL không? Tôi phải thừa nhận rằng tôi không biết cách truy cập vào url, chỉ định bằng chứng xác thực và tải xuống báo cáo. Cảm ơn bạn rất nhiều! – J4N

+0

Không chắc chắn những gì bạn đang tìm kiếm. Liên kết truy cập URL mà tôi đã đăng ở trên có ba ví dụ về các URL khác nhau có thể được sử dụng để truy cập báo cáo. Chi tiết về cách thực hiện điều này phụ thuộc vào báo cáo của bạn: bạn sử dụng thông số nào, bạn sẽ nhận được thông tin đăng nhập của mình như thế nào. Tôi đã thêm một số mã C# mẫu vào câu trả lời của tôi. Nhưng nếu bạn muốn các ví dụ tốt hơn, vui lòng cho chúng tôi biết chính xác phần nào bạn đang gặp khó khăn. –

0

Bởi vì bạn đã lồng suối, bạn có thể muốn đóng luồng đầu tiên sau khi sao chép để tránh lỗi luồng đã đóng. Ngoài ra, nếu bạn nhận được 401 Unauthorized, hãy thử thông tin đăng nhập mặc định.

  req.UseDefaultCredentials = true; 
      req.PreAuthenticate = true; 
      req.Credentials = CredentialCache.DefaultCredentials; 

      HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse(); 

      Stream fStream = HttpWResp.GetResponseStream();     

      //Now turn around and send this as the response.. 
      byte[] fileBytes = ReadFully(fStream); 
      // Could save to a database or file here as well. 
      HttpWResp.Close(); 
Các vấn đề liên quan