generate - Reporting Services como PDF a través de WebRequest en C#3.5 "Tipo de archivo no admitido"
c# rdl to pdf (3)
¿Podría ser causado su problema al declarar su matriz de bytes a una longitud de 2048 en lugar de basar la longitud en la longitud de la secuencia devuelta por GetResponseStream ()?
Heredé una aplicación heredada que se supone que debe obtener un pdf sobre la marcha de un servidor de servicios de informes. Todo funciona bien hasta el momento en que intentas abrir el pdf que se devuelve y adobe acrobat te dice:
Adobe Reader no pudo abrir ''thisStoopidReport''.pdf'' porque no es un tipo de archivo compatible o porque el archivo se ha dañado (por ejemplo, se envió como un archivo adjunto de correo electrónico y no se decodificó correctamente).
He hecho una solución de problemas inicial en esto. Si reemplazo la url en la llamada WebRequest.Create () con un archivo pdf válido en mi máquina local, es decir: @ "C: temp / validpdf.pdf", entonces obtengo un PDF válido.
El informe en sí parece funcionar bien. Si escribo manualmente la URL en el informe de servicios de informes que debe generar el archivo pdf, se me solicita la autenticación del usuario. Pero después de suministrarlo obtengo un archivo pdf válido.
He reemplazado las URL reales, nombre de usuario, passpass y cadenas de dominio en el siguiente código con valores falsos por razones obvias.
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();
Vea el archivo pdf que obtiene de nuevo en notepad.exe. Sospecho que verás HTML allí. Si llama a una página web que es una página de paso, eso corta un archivo pdf. La solicitud web recuperará el HTML, no el archivo PDF.
Si llama directamente a un sitio web que tiene un archivo pdf, como http://www.somesite.com/file.pdf, su código funcionará. El problema es que probablemente tenga una página web que oculta la verdadera ubicación del archivo pdf.
La forma en que he entendido esto fue crear una DLL ISAPI que le permitió pasar los parámetros que necesita para determinar qué archivo pdf necesita ser devuelto. Que el DLL de ISAPI volvería a transmitir el pdf con un tipo de contenido de "aplicación / pdf".
Aquellos de ustedes que sugirieron que el problema era que el HTML proveniente de la URL me indicó la dirección correcta. De hecho, fue entonces cuando me di cuenta de que el programador original aquí utilizaba el método PUT en lugar del método GET.
Entonces al corregir la línea individual:
request.Method = WebRequestMethods.Http.Post;
Todo está saliendo rosas ... err pdf ... lo que sea que funcione.
Gracias por señalarme en la dirección correcta. A veces solo toma un segundo par de ojos.