Запуск отчета на JasperServer с C #

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

Есть ли у кого-нибудь образцы кода того, как запустить отчет на JasperServer с C # и прикрепить набор данных XML с запросом SOAP? Он должен работать на Mono, поэтому о Microsoft.Web.Services2 не может быть и речи.

Я попытался свернуть свой собственный запрос на мыло. Сервер Jasper, кажется, принимает это, но я не могу получить никакого ответа, кроме ошибки сервера 500. До того, как прикрепить приставку МТОМ, я не дошел.

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();

person FlappySocks    schedule 27.11.2011    source источник
comment
Этот пост может вам помочь: stackoverflow.com/questions/4351511/   -  person Alex K    schedule 28.11.2011
comment
Спасибо, но на Mono это не сработает. Мне нужно будет посмотреть, смогу ли я найти другую библиотеку SOAP или сделать это вручную.   -  person FlappySocks    schedule 28.11.2011
comment
коммерческий компонент - это вариант?   -  person Yahia    schedule 04.12.2011
comment
Да, если цена подходящая. Я действительно пытался сделать это, используя php в качестве промежуточного звена, но у меня тоже возникли трудности с этим. См. stackoverflow.com / questions / 8418261 /   -  person FlappySocks    schedule 17.12.2011
comment
У меня REST работает! См. [Получить отчет от jasperserver с использованием веб-службы REST и asp.net C #] [1] [1]: stackoverflow.com/questions/9623685/   -  person torinfo    schedule 09.03.2012


Ответы (2)


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

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

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

Вот и все!

person mico    schedule 06.12.2011
comment
Как добавить вложение источника данных XML? Есть запрос XML Soap и вложение, которое представляет собой XML-данные для отчета. - person FlappySocks; 08.12.2011

Я столкнулся с той же проблемой не в моно, а в 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)

person torinfo    schedule 08.03.2012