从C#运行JasperServer报告

时间:2011-11-27 23:30:23

标签: c# soap mono jasper-reports jasperserver

Jasper Reports是Crystal Reports的绝佳开源替代品。这对单页PDF页面很有用,例如字母和字母。发票到多页报告。然而,它不是非常友好的.NET,并且让C#/ Mono与JasperServer一起玩得很好并不富有成效。

有没有人从C#获得有关如何在JasperServer上运行报告的代码示例,并附加带有SOAP请求的XML数据集?它需要在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 个答案:

答案 0 :(得分:2)

Jasper给出了一个你已经找到的Web Services API,我想。对于使用XML的Web服务,当您将服务描述(WSDL)转换为该语言的服务存根时,可以通过任何语言(例如C#)访问它。

在该给定链接上可以找到Jasper Reports wsdl文件位置,在访问它们之后,您的任务是创建存根,这是对给定XML接口的代码级访问。对于Mono,这可以通过this tutorial的简单命令行命令完成,其余工作是使用此代码,如何使用它。

确切的命令可以通过这两个链接找到并没有太大的魔力,但它就像一个命令运行wsdl.exe并且给定路径(例如。http://localhost:8080/jasperserver/services/repository?wsdl)作为参数一样简单然后使用类似于mcs /target:library SomeService.cs -r:System.Web.Services的命令编译结果,其中将 SomeService.cs 替换为上一个命令输出的文件名。

就是这样!

答案 1 :(得分: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#

顺便说一句,那也是Mono的工作! (我在Visual Studio中开发,但在Mono上部署)