Запуск отчета по JasperServer из C # - PullRequest
17 голосов
/ 28 ноября 2011

Jasper Reports - превосходная альтернатива Crystal Reports с открытым исходным кодом. Это отлично подходит для одностраничных страниц PDF, таких как письма и счета в многостраничных отчетах. Однако он не очень дружелюбен к .NET, и заставить C # / Mono хорошо играть с JasperServer не принесло плодов.

Кто-нибудь получил примеры кода о том, как запустить отчет на JasperServer из C # и прикрепить набор данных 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();

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

Джаспер предоставляет API веб-сервисов , который вы уже нашли, я полагаю. Поскольку это веб-сервисы, использующие XML, к нему можно получить доступ через любой язык, например C # в этом случае, когда вы конвертируете описание сервиса (WSDL) в заглушку сервиса на этом языке.

По этой указанной ссылке можно найти расположение файлов wsdl Jasper Reports, и после получения доступа к ним ваша задача - создать заглушку, которая представляет собой доступ на уровне кода к данному XML-интерфейсу. Для Mono это можно сделать с помощью простой команды командной строки в соответствии с этого руководства , а остальная часть работы заключается в том, чтобы использовать этот код так, как вы захотите.

Точная команда может быть найдена через эти две ссылки с небольшим количеством магии, но это что-то такое же простое, как одна команда, выполняющая wsdl.exe с заданным путем (например, http://localhost:8080/jasperserver/services/repository?wsdl) в качестве аргумента и затем компиляция результат с командой, аналогичной mcs /target:library SomeService.cs -r:System.Web.Services, где вы заменяете SomeService.cs именем файла, который был выводом предыдущей команды.

Вот и все!

0 голосов
/ 08 марта 2012

Я столкнулся с той же проблемой не в моно, а в Visual Studio.Я всегда получаю ошибку 500. Это потому, что ответ jasperserver в соответствии с кодом Microsoft / Mono не является SOAP-совместимым.ASP.NET ожидает структуру text / xml, и jasperserver отправляет многоэлементную структуру обратно с xml в качестве первой части и отчетом в качестве вложения во второй части.

ASP.NET дает исключение по этому поводу.Сейчас я пытаюсь сделать то же самое с помощью REST, но пока мне это не удалось.

Добавление: 2012-03-09 Разобрался с использованием REST, см. Получение отчета от jasperserver с использованием веб-сервиса RESTи asp.net C #

Кстати, это также работает в Mono!(Я разрабатываю в Visual Studio, но развертываю на Mono)

...