2011-11-27 18 views
17

Báo cáo Jasper là một giải pháp thay thế nguồn mở tuyệt vời cho Báo cáo tinh thể. Thật tuyệt vời đối với các trang PDF một trang, chẳng hạn như các ký tự & hóa đơn cho các báo cáo nhiều trang. Tuy nhiên nó không phải là rất .NET thân thiện, và nhận được C#/Mono để chơi tốt đẹp với JasperServer đã không được hiệu quả.Chạy báo cáo trên JasperServer từ C#

Có ai có bất kỳ mẫu mã nào về cách chạy báo cáo trên JasperServer từ C# và đính kèm một tập dữ liệu XML với yêu cầu SOAP không? Nó cần phải làm việc trên Mono, vì vậy Microsoft.Web.Services2 là ra khỏi câu hỏi.

Tôi đã cố gắng để cuộn yêu cầu xà phòng của riêng mình. Jasper Server dường như chấp nhận nó, nhưng tôi dường như không thể nhận được bất kỳ phản hồi nào khác ngoài lỗi máy chủ 500. Tôi đã không nhận được như xa như gắn một tập tin đính kèm 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

Có thể bài đăng này giúp bạn: http://stackoverflow.com/questions/4351511/upload-report-unit-via-webservice-in-c-sharp-net -to-jasperserver –

+0

Cảm ơn, nhưng nó sẽ không hoạt động trên Mono. Tôi sẽ phải xem nếu tôi có thể tìm thấy một thư viện SOAP khác, hoặc làm theo cách thủ công. – FlappySocks

+0

là một thành phần thương mại là một lựa chọn? – Yahia

Trả lời

2

Jasper cung cấp số Web Services API mà bạn đã tìm thấy, tôi cho là vậy. Vì đó là một Dịch vụ Web sử dụng XML, nó có thể được truy cập thông qua bất kỳ ngôn ngữ nào, như C# trong trường hợp này, khi bạn chuyển đổi mô tả dịch vụ (WSDL) thành một nhánh dịch vụ trên ngôn ngữ đó.

Trên liên kết đã cho, có thể tìm thấy các vị trí tệp wsdl của Jasper Reports và sau khi có quyền truy cập vào chúng, nhiệm vụ của bạn là tạo ra sơ khai, đây là cấp truy cập cấp mã cho giao diện XML đã cho. Đối với Mono, điều này có thể được thực hiện với một lệnh dòng lệnh đơn giản theo this tutorial và phần còn lại của công việc là sử dụng mã này bao giờ bạn muốn sử dụng nó. Có thể tìm thấy lệnh chính xác thông qua hai liên kết này không có nhiều phép thuật, nhưng nó dễ dàng như một lệnh chạy wsdl.exe với đường dẫn đã cho (ví dụ http://localhost:8080/jasperserver/services/repository?wsdl) làm đối số và sau đó biên dịch kết quả bằng lệnh tương tự đến mcs /target:library SomeService.cs -r:System.Web.Services nơi bạn thay thế SomeService.cs bằng tên của tệp là đầu ra của lệnh trước đó.

Vậy đó!

+0

Làm cách nào để thêm tệp đính kèm nguồn dữ liệu XML? Có yêu cầu Xà phòng XML và tệp đính kèm là dữ liệu XML cho báo cáo – FlappySocks

0

Tôi đã chạy vào cùng một vấn đề không phải trong đơn âm mà bằng cách sử dụng Visual Studio. Tôi luôn gặp lỗi 500. Đó là vì câu trả lời của jasperserver theo mã microsoft/mono không phải là SOAP. ASP.NET mong đợi một cấu trúc text/xml, và jasperserver gửi một cấu trúc nhiều phần trở lại với xml như phần đầu tiên và báo cáo dưới dạng phần đính kèm trong phần thứ hai.

ASP.NET đưa ra ngoại lệ về điều đó. Tôi bây giờ đang cố gắng làm một điều tương tự bằng cách sử dụng REST, nhưng tôi đã không thành công cho đến nay.

Addition: 2012/03/09 đặn ra sử dụng REST, xem Get report from jasperserver using REST webservice and asp.net C#

Bằng cách này, mà cũng đang làm việc tại Mono! (Tôi phát triển trong Visual Studio, nhưng triển khai trên Mono)