2011-11-27 9 views
17

Jasper Reports jest doskonałą alternatywą dla Crystal Reports. Doskonale nadaje się do pojedynczych stron PDF, takich jak listy & faktur do raportów wielostronicowych. Jednak nie jest to bardzo przyjazny .NET i uzyskanie C#/Mono, aby grać ładnie z JasperServer nie było owocne.Uruchamianie raportu na JasperServer z C#

Czy ktoś ma próbki kodu, jak uruchomić raport na JasperServer z C# i dołączyć zestaw danych XML z żądaniem SOAP? Musi działać na Mono, więc Microsoft.Web.Services2 nie wchodzi w grę.

Miałem ochotę rzucić moją własną prośbę o mydło. Jasper Server wydaje się to akceptować, ale nie mogę uzyskać żadnej odpowiedzi z powrotem poza błędem serwera 500. Nie doszedłem aż do dołączenia załącznika 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

Niech ten post pomoże: http://stackoverflow.com/questions/4351511/upload-report-unit-via-webservice-in-c-sharp-net -to-jasperserver –

+0

Dzięki, ale to nie zadziała na Mono. Będę musiał sprawdzić, czy mogę znaleźć inną bibliotekę SOAP, lub zrobić to ręcznie. – FlappySocks

+0

jest komercyjnym elementem opcjonalnym? – Yahia

Odpowiedz

2

Jasper daje Web Services API który już odkryli, jak sądzę. W związku z tym, że jest to usługa sieciowa wykorzystująca XML, można uzyskać do niej dostęp za pośrednictwem dowolnego języka, np. C# w tym przypadku, po przekonwertowaniu opisu usługi (WSDL) na kod usługi w tym języku.

W tym linku znajdują się lokalizacje plików wsdl Jasper Reports i po uzyskaniu do nich dostępu Twoim zadaniem jest utworzenie kodu pośredniczącego, który jest dostępem do poziomu kodu na dany interfejs XML. W Mono można to zrobić za pomocą prostego polecenia linii poleceń, zgodnie z this tutorial, a resztą pracy jest użycie tego kodu, jakkolwiek zechcesz go użyć.

Dokładne polecenie można znaleźć za pomocą tych dwóch linków z niewielką ilością magii, ale jest to tak proste, jak jedno polecenie z uruchomioną wsdl.exe z podaną ścieżką (np. http://localhost:8080/jasperserver/services/repository?wsdl) jako argumentem, a następnie skompilowanie wyniku za pomocą polecenia podobnego do mcs /target:library SomeService.cs -r:System.Web.Services gdzie zastąpić SomeService.cs z nazwą pliku, który był wynikiem poprzedniego polecenia.

To wszystko!

+0

Jak dodać załącznik źródła danych XML? Istnieje żądanie XML Soap i załącznik, który jest danymi XML dla raportu – FlappySocks

0

Wpadłem na ten sam problem, nie w mono, ale używając Visual Studio. Zawsze otrzymuję błąd 500. To dlatego, że odpowiedź serwera jasperserver według kodu microsoft/mono nie jest zgodna z SOAP. ASP.NET oczekuje struktury text/xml, a serwer jasperserver wysyła strukturę wieloczęściową z powrotem do xml jako pierwszej części, a raport jako załącznik do drugiej części.

Program ASP.NET przewiduje wyjątek. Teraz próbuję zrobić coś podobnego przy użyciu usługi REST, ale jak dotąd nie udało mi się.

Dodatek: 2012-03-09 zorientowali się, używając odpocząć, zobaczyć Get report from jasperserver using REST webservice and asp.net C#

przy okazji, że pracuje również w Mono! (Pracuję w Visual Studio, ale wdrażam na Mono)

Powiązane problemy