Запуск отчета о JasperServer с С#
Jasper Reports - превосходная альтернатива Open Source Crystal Reports. Это отлично подходит для одностраничных страниц PDF, таких как письма и счета-фактуры для многостраничных отчетов. Однако он не очень дружелюбен к .NET, и получение С#/Mono для игры с JasperServer не принесло больших результатов.
Есть ли у кого-нибудь какие-либо образцы кода, как запускать отчет на JasperServer с С#, и приложить XML-набор данных с запросом SOAP? Он должен работать над Mono, поэтому Microsoft.Web.Services2 не может быть и речи.
Я попытался опрокинуть свой собственный запрос на мыло. Кажется, что Jasper Server принимает его, но я не могу получить ответ, отличный от ошибки сервера 500. Я не дошел до привязки 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();
Ответы
Ответ 1
Jasper дает API веб-сервисов, который вы уже нашли, я полагаю. Для этого, являющегося веб-сервисами с использованием XML, он может быть доступен через любой язык, например С#, при преобразовании описания службы (WSDL) в сервисный заглушку на этом языке.
В этой заданной ссылке могут быть найдены местоположения файлов Jasper Reports wsdl и после доступа к ним ваша задача - создать заглушку, которая представляет собой доступ к уровню кода для данного XML-интерфейса. Для Mono это можно сделать с помощью простой командной строки в соответствии с этот учебник, а остальная часть работы - использовать этот код, как вы хотите использовать его.
Точная команда может быть найдена через эти две ссылки с не малой магией, но это так просто, как одна команда, выполняющая wsdl.exe
с заданным путем (например, http://localhost:8080/jasperserver/services/repository?wsdl), а затем скомпилировать результат с помощью команды, аналогичной mcs /target:library SomeService.cs -r:System.Web.Services
, где вы заменяете SomeService.cs именем файла, который был результатом предыдущей команды.
Что это!
Ответ 2
Я столкнулся с той же проблемой не в моно, а с помощью Visual Studio. Я всегда получаю ошибку 500. Это потому, что ответ jasperserver в соответствии с кодом microsoft/mono не соответствует SOAP. ASP.NET ожидает структуру text/xml, а jasperserver отправляет многостраничную структуру обратно с xml в качестве первой части, а отчет - как вложение во второй части.
ASP.NET дает исключение. Теперь я пытаюсь сделать аналогичную вещь, используя REST, но до сих пор мне это не удалось.
Дополнение: 2012-03-09
Выяснено, используя REST, см. Получить отчет от jasperserver с помощью веб-службы REST и asp.net С#
Кстати, это тоже работает в Mono! (Я разрабатываю Visual Studio, но развертываю в Mono)