2012-06-05 18 views
8

Tengo un servidor de servicios de informes que ya tiene algunos informes en ejecución, y ahora necesito generarlos a través de un sitio web personalizado (que ejecute asp.net MVC3).Servicios de informes: Obtenga el PDF de un informe generado

Necesito recuperar este informe como secuencia/byte para enviarlo al usuario. No hay "visor de informes" más o menos.

La última vez que utilicé los servicios de informes fue con sql 2005, y deberíamos hacer referencia como un oscuro archivo de asmx.

¿Qué ocurre ahora con el servidor sql que informa 2008 R2, .Net4 y visual studio 2010? No puedo encontrar un tutorial que explique todo.

(de hecho no puedo encontrar un tutorial donde no hay visor de informes para SQL 2008 R2)

+1

Creo que estamos hablando acerca de cómo acceder a través de SSRS º e API del servicio web. ¿Qué es exactamente * oscuro * sobre ese servicio web? – Yuck

Respuesta

15

Varios métodos se proporcionan en MSDN. He usado URL access a menudo para obtener botones PDF rápidos y sencillos en una aplicación ASP .NET.

He aquí un código de hack rápido para hacer esto. Se puede limpiar para utilizar la autenticación integrada, y hay muchas maneras en que puede almacenar el nombre del informe. (I cortar y pegar esto desde un cierto código de edad tuve que almacenaría un informe a una base de datos y luego más tarde podría volver que desde el PP.

// 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 es

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

Pero, ¿cómo administrar la identificación? Debido a que todos los usuarios no deberían tener acceso a los servicios de informes, ¿no? – J4N

+0

¿Podría indicarme la clase/ejemplo correcto para obtener el informe de SSRS de la URL? Debo admitir que no sé cómo acceder a la url, especificar credenciales y descargar el informe. ¡Muchas gracias! – J4N

+0

No estoy seguro de lo que está buscando. El enlace de acceso URL que publiqué arriba tiene tres ejemplos de diferentes URL que se pueden usar para acceder a los informes. Los detalles de cómo hacer esto dependen de su informe: qué parámetros usa, cómo obtendrá sus credenciales. He agregado un código de muestra C# a mi respuesta. Pero si desea obtener mejores ejemplos, infórmenos con qué parte tiene dificultades. –

0

Porque has anidado corrientes, es posible que desee cerrar la primera corriente después de la copia para evitar un error de flujo cerrado. Además, si se obtiene un 401 no autorizado, trate de credenciales predeterminadas.

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