2011-11-27 138 views
17

Jasper Reports是Crystal Reports的一個極好的開源替代品。對於單頁PDF頁面來說非常好,例如字母&發票到多頁報表。然而,它並不是非常適合.NET,並且讓C#/ Mono與JasperServer一起玩起來並不是很有成果。從C#運行JasperServer報告#

是否有人有任何代碼示例如何從C#運行JasperServer的報告,並附帶一個XML數據集與SOAP請求?它需要在Mono上工作,所以Microsoft.Web.Services2是不可能的。

我已經嘗試推出我自己的肥皂請求。賈斯珀服務器似乎接受它,但我似乎不能得到任何迴應,而不是服務器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(); 
+0

可能需要幫助的這篇文章可以幫助你:http://stackoverflow.com/questions/4351511/upload-report-unit-via-webservice-in-c-sharp-net to-jasperserver –

+0

謝謝,但它不適用於Mono。我將不得不查看是否可以找到不同的SOAP庫,或者手動執行。 – FlappySocks

+0

是一個商業組件的選項? – Yahia

回答

2

賈斯珀提供了一個​​,你已經找到了,我想。對於使用XML的Web服務來說,當您將服務描述(WSDL)轉換爲該語言的服務存根時,可以通過任何語言訪問它,例如本例中的C#。

在給定的鏈接上可以找到Jasper Reports wsdl文件位置,並且在訪問它們後,您的任務是創建存根,這是對給定XML接口的代碼級訪問。對於單聲道,這可以通過一個簡單的命令行命令根據this tutorial來完成,其餘的工作就是使用這個代碼,你想如何使用它。

具體的命令可以通過與沒有多少魔這兩個環節被發現,但它是作爲一個命令運行wsdl.exe給定的路徑(如:http://localhost:8080/jasperserver/services/repository?wsdl)作爲參數,然後編譯的結果類似的命令一樣簡單的東西到mcs /target:library SomeService.cs -r:System.Web.Services,用SomeService.cs替換上一個命令的輸出文件的名稱。

就是這樣!

+0

如何添加XML數據源附件? XML Soap請求是一個附件,它是報表的XML數據 – FlappySocks

0

我遇到了同樣的問題,而不是在單聲道,但使用Visual Studio。我總是得到錯誤500.這是因爲根據microsoft/mono代碼的jasperserver的答案不是SOAP complient。 ASP.NET需要一個text/xml結構,而jasperserver會將xml作爲第一部分,並將報告作爲第二部分的附件發送回去。

ASP.NET給出了一個例外。我現在正在嘗試使用REST做類似的事情,但到目前爲止我還沒有成功。

增加:2012-03-09 想通了使用REST,請參閱Get report from jasperserver using REST webservice and asp.net C#

順便說一句,這也是在單工作! (我在Visual Studio中開發,但是在Mono上部署)