2012-06-05 11 views
8

Ich habe einen Reporting Services Server, der bereits einige laufende Berichte hat, und ich muss sie jetzt über eine benutzerdefinierte Website generieren (mit asp.net MVC3).Reporting Services: Holen Sie sich die PDF eines generierten Berichts

Ich muss diesen Bericht als Stream/Byte abrufen, um es an den Benutzer zu senden. Kein "Report Viewer" oder so.

Das letzte Mal, dass ich Reporting-Dienste verwendet wurde mit SQL 2005, und wir sollten als Referenz eine obskure asmx-Datei.

Was ist jetzt, mit SQL Server Reporting 2008 R2, .Net4 und Visual Studio 2010? Ich kann kein Tutorial finden, das die ganze Sache erklärt.

(in der Tat kann ich nicht ein Tutorial finden, wo es kein Report Viewer für SQL 2008 R2)

+1

ich glaube, Sie sprechen SSRS durch th Zugriff e Webservice-API. Was genau ist an diesem Web-Service unklar? – Yuck

Antwort

15

mehr Verfahren an MSDN vorgesehen sind. Ich habe URL access oft für schnelle einfache PDF-Schaltflächen in einer ASP.NET-App verwendet.

Hier ist ein kurzer Code, der das macht. Es könnte aufgeräumt werden, um die integrierte Authentifizierung zu verwenden, und es gibt viele Möglichkeiten, den Berichtsnamen zu speichern. (I geschnitten und geklebt diese aus einem alten Code hatte ich einen Bericht in einer Datenbank gespeichert werden soll und dann wieder später konnte das von der 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 ist

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

Aber, wie die Identifikation zu verwalten? Weil alle Benutzer keinen Zugriff auf die Reporting Services haben sollten, nein? – J4N

+0

Konnten Sie mich gerade auf die richtige Klasse/das Beispiel verweisen, um den Bericht vom SSRS von der URL zu erhalten? Ich muss zugeben, dass ich nicht weiß, wie ich auf die URL zugreifen, Anmeldeinformationen angeben und den Bericht herunterladen kann. Vielen Dank! – J4N

+0

Nicht sicher, wonach Sie suchen. Der URL-Zugriff-Link, den ich oben gepostet habe, enthält drei Beispiele für verschiedene URLs, die für den Zugriff auf Berichte verwendet werden können. Die Details dazu hängen von Ihrem Bericht ab: Welche Parameter verwenden Sie, wie erhalten Sie Ihre Anmeldeinformationen? Ich habe einige Beispiel C# -Code zu meiner Antwort hinzugefügt. Aber wenn Sie bessere Beispiele wünschen, lassen Sie uns bitte genau wissen, mit welchem ​​Teil Sie Schwierigkeiten haben. –

0

Weil Sie verschachtelte Ströme, können Sie den ersten Strom nach dem kopieren zu schließen, um einen geschlossenen Strom Fehler zu vermeiden. auch, wenn Sie eine 401 Unauthorized erhalten, Standardanmeldeinformationen versuchen.

  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();