2011-11-27 35 views
17

Jasper Reports es una excelente alternativa de código abierto para Crystal Reports. Es ideal para páginas PDF de una sola página, como cartas &, facturas para informes de varias páginas. Sin embargo, no es muy amigable con .NET, y hacer que C#/Mono juegue bien con JasperServer no ha sido fructífero.Ejecución de informe en JasperServer desde C#

¿Alguien ha obtenido ejemplos de código sobre cómo ejecutar un informe en JasperServer desde C# y adjunta un conjunto de datos XML con la solicitud SOAP? Tiene que funcionar en Mono, por lo que Microsoft.Web.Services2 está fuera de cuestión.

He intentado rodar mi propia solicitud de jabón. Jasper Server parece aceptarlo, pero parece que no puedo obtener ninguna respuesta que no sea un error del servidor 500. No llegué a adjuntar un archivo adjunto MTOM.

var sb = new StringBuilder(); 

sb.AppendLine("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"); 
sb.AppendLine("<s:Body s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"); 
sb.AppendLine("<q1:runReport xmlns:q1=\"http://axis2.ws.jasperserver.jaspersoft.com\">"); 

sb.AppendLine("<requestXmlString xsi:type=\"xsd:string\">"); 
sb.AppendLine("<request operationName=\"runReport\" locale=\"en\">"); 
sb.AppendLine(" <argument name=\"RUN_OUTPUT_FORMAT\">PDF</argument>"); 
sb.AppendFormat(" <resourceDescriptor name=\"\" wsType=\"\" uriString=\"{0}\" isNew=\"false\">", "/JourneyReport"); 
sb.AppendLine("  <label>null</label>"); 
sb.AppendLine("  <parameter name=\"testparam\">1</parameter>"); 
sb.AppendLine(" </resourceDescriptor>"); 
sb.AppendLine(" </request>"); 
sb.AppendLine("</requestXmlString>"); 
sb.AppendLine("</q1:runReport>"); 
sb.AppendLine("</s:Body></s:Envelope>"); 


var webRequest = (HttpWebRequest)WebRequest.Create("http://localhost:8080/jasperserver/services/repository"); 
webRequest.Credentials = new NetworkCredential("jasperadmin","jasperadmin"); 
webRequest.PreAuthenticate = true; 

webRequest.Headers.Add("SOAPAction",""); 

//Set HttpWebRequest properties 
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sb.ToString()); 
webRequest.Method = "POST"; 
webRequest.ContentLength = bytes.Length; 
webRequest.ContentType = "text/xml; encoding='utf-8'"; 

//Get Stream object 
var objRequestStream = webRequest.GetRequestStream(); 
objRequestStream.Write(bytes, 0, bytes.Length); 
objRequestStream.Close(); 

var response = (HttpWebResponse)webRequest.GetResponse(); 
+0

Puede que esta publicación lo ayude: http://stackoverflow.com/questions/4351511/upload-union-unit-via-webservice-in-c-sharp-net -to-jasperserver –

+0

Gracias, pero no funcionará en Mono. Tendré que ver si puedo encontrar una biblioteca SOAP diferente, o hacerlo manualmente. – FlappySocks

+0

es un componente comercial una opción? – Yahia

Respuesta

2

Jasper da una Web Services API que ya haya encontrado, supongo. Para que se trate de un servicio web que utiliza XML, se puede acceder a través de cualquier idioma, como C# en este caso, al convertir la descripción del servicio (WSDL) en un talón de servicio en ese idioma.

En ese enlace dado se puede encontrar Jasper Informa las ubicaciones de archivos wsdl y después de tener acceso a ellas su tarea es crear el código auxiliar, que es un acceso de nivel de código a la interfaz XML dada. Para Mono esto se puede hacer con un simple comando de línea de comando según this tutorial y el resto del trabajo es usar este código como quiera usarlo.

El comando exacto se puede encontrar a través de estos dos enlaces con no mucha magia, pero es algo tan fácil como un sistema que se ejecuta wsdl.exe con la ruta dada (por ejemplo. http://localhost:8080/jasperserver/services/repository?wsdl) como argumento y luego compilar el resultado con un comando similar a mcs /target:library SomeService.cs -r:System.Web.Services donde reemplaza SomeService.cs con el nombre del archivo que fue el resultado del comando anterior.

Eso es todo!

+0

¿Cómo se agrega el archivo adjunto de fuente de datos XML? Existe la solicitud de Jabón XML y un archivo adjunto que son los datos XML para el informe – FlappySocks

0

Me encontré con el mismo problema, no en mono pero usando Visual Studio. Siempre recibo el error 500. Eso es porque la respuesta de jasperserver según el código de Microsoft/mono no es compatible con SOAP. ASP.NET espera una estructura text/xml, y jasperserver devuelve una estructura multiparte con el xml como la primera parte y el informe como un archivo adjunto en la segunda parte.

ASP.NET produce una excepción al respecto. Ahora estoy tratando de hacer algo similar con REST, pero hasta ahora no he tenido éxito.

Adición: 2012-03-09 averiguado mediante REST, consulte Get report from jasperserver using REST webservice and asp.net C#

Por cierto, que también está trabajando en mono! (Desarrollo en Visual Studio, pero implemento en Mono)

Cuestiones relacionadas