18

Jasper Reports 是 Crystal Reports 的优秀开源替代品。它非常适合单页 PDF 页面,例如信件和发票到多页报告。然而,它对 .NET 不是很友好,并且让 C#/Mono 与 JasperServer 配合得很好并没有什么成果。

有没有人有任何代码示例说明如何从 C# 在 JasperServer 上运行报告,并将 XML 数据集附加到 SOAP 请求中?它需要在 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();
4

2 回答 2

2

Jasper 提供了一个您已经找到的Web 服务 API ,我想。因为它是使用 XML 的 Web 服务,所以当您将服务描述 (WSDL) 转换为该语言上的服务存根时,可以通过任何语言访问它,例如在本例中的 C#。

在该给定链接上可以找到 Jasper Reports wsdl 文件位置,在访问它们之后,您的任务是创建存根,这是对给定 XML 接口的代码级访问。对于 Mono,这可以根据本教程使用简单的命令行命令来完成,剩下的工作就是使用此代码,无论您想如何使用它。

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

而已!

于 2011-12-06T15:12:03.633 回答
0

我不是在单声道中而是在使用 Visual Studio 时遇到了同样的问题。我总是收到错误 500。那是因为 jasperserver 根据 microsoft/mono 代码的答案不符合 SOAP。ASP.NET 需要一个 text/xml 结构,并且 jasperserver 发送回一个多部分结构,其中 xml 作为第一部分,报告作为第二部分的附件。

ASP.NET 对此给出了一个例外。我现在正在尝试使用 REST 做类似的事情,但到目前为止我还没有成功。

添加:2012-03-09 使用 REST 解决,请参阅使用 REST webservice 和 asp.net C# 从 jasperserver 获取报告

顺便说一句,这也适用于 Mono!(我在 Visual Studio 中开发,但在 Mono 上部署)

于 2012-03-08T19:45:45.587 回答