Ejecución del informe en JasperServer desde C#
soap mono (2)
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 y facturas a informes de varias páginas. Sin embargo, no es muy compatible con .NET, y hacer que C # / Mono juegue bien con JasperServer no ha sido fructífero.
¿Alguien ha obtenido ejemplos de código de cómo ejecutar un informe en JasperServer desde C # y adjuntar un conjunto de datos XML con la solicitud SOAP? Necesita funcionar en Mono, por lo que Microsoft.Web.Services2 está fuera de la cuestión.
Intenté tirar 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é tan lejos como para 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();
Jasper proporciona una API de servicios web que ya has encontrado, supongo. Si se trata de un servicio web que utiliza XML, se puede acceder a él a través de cualquier idioma, como C # en este caso, cuando convierte la descripción del servicio (WSDL) en un código auxiliar de servicio en ese idioma.
En ese enlace dado se pueden encontrar las ubicaciones de los archivos wsdl de Jasper Reports y, después de tener acceso a ellos, 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 comando de línea de comando simple de acuerdo con este tutorial y el resto del trabajo consiste en utilizar este código siempre que lo desee.
El comando exacto se puede encontrar a través de estos dos enlaces con poca magia, pero es algo tan fácil como un comando que ejecuta wsdl.exe
con la ruta dada (por ejemplo, http://localhost:8080/jasperserver/services/repository?wsdl ) como argumento y luego compilando 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!
Me encontré con el mismo problema, no en mono sino en Visual Studio. Siempre obtengo el error 500. Eso se debe a que la respuesta de jasperserver según el código microsoft / mono no es compatible con SOAP. ASP.NET espera una estructura de texto / xml, y jasperserver devuelve una estructura de varias partes con el xml como la primera parte y el informe como un archivo adjunto en la segunda parte.
ASP.NET da una excepción en eso. Ahora estoy tratando de hacer algo similar utilizando REST, pero hasta ahora no he tenido éxito.
Adición: 2012-03-09 Descifrado mediante REST, consulte Obtener informe de jasperserver mediante el servicio web REST y asp.net C #
Por cierto, eso también está funcionando en Mono! (Desarrollo en Visual Studio, pero despliegue en Mono)